ADR-001: Pacotes de Serviço
Status: Aceito
Data: 2025-09-22
Por quê
Precisamos de sinais do plano de controle (ex.: reset de sessão) que sejam inequívocos, sem alocações ao analisar e compatíveis com versões anteriores.
Decisão
Duas codificações coexistem:
-
Legado:
[type] // 1 byteMantido para compatibilidade com versões anteriores (atualmente apenas
SessionReset). -
V1 emoldurado:
0xFF 0x01 [type] // 3 bytes: prefixo, versão, tipoFornece versionamento para evolução futura.
Detecção (estrita)
Um pacote é de serviço se e somente se:
len==1etypeé conhecido (legado), oulen==3e os bytes são0xFF 0x01 <tipo-conhecido>(v1). Todo o resto não é um pacote de serviço.
API
package service
type PacketType uint8
const (
Unknown PacketType = iota
SessionReset
)
type PacketHandler interface {
TryParseType(pkt []byte) (PacketType, bool) // zero-alloc
EncodeLegacy(t PacketType, buffer []byte) ([]byte, error) // zero-alloc: buffer é pré-alocado
EncodeV1(t PacketType, buffer []byte) ([]byte, error) // zero-alloc: buffer é pré-alocado
}
Compatibilidade e Implantação
- Receber: sempre aceitar tanto legado quanto v1.
- Enviar: padrão é legado. Após flag de feature no handshake (
ServicePacketsV1=true), enviar v1 para aquele cliente; caso contrário manter legado.