ADR-001 : Paquets de Service
Statut : Accepté
Date : 2025-09-22
Pourquoi
Nous avons besoin de signaux du plan de contrôle (ex. : réinitialisation de session) qui soient non ambigus, sans allocation lors du parsing, et rétrocompatibles.
Décision
Deux encodages coexistent :
-
Legacy :
[type] // 1 octetConservé pour la rétrocompatibilité (actuellement uniquement
SessionReset). -
V1 encadré :
0xFF 0x01 [type] // 3 octets : préfixe, version, typeFournit le versionnage pour l'évolution future.
Détection (stricte)
Un paquet est un paquet de service si et seulement si :
len==1ettypeest connu (legacy), oulen==3et les octets sont0xFF 0x01 <type-connu>(v1). Tout le reste n'est pas un paquet de service.
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 est pré-alloué
EncodeV1(t PacketType, buffer []byte) ([]byte, error) // zero-alloc : buffer est pré-alloué
}
Compatibilité et Déploiement
- Réception : toujours accepter à la fois legacy et v1.
- Envoi : par défaut legacy. Après le flag de fonctionnalité du handshake (
ServicePacketsV1=true), envoyer v1 à ce client ; sinon garder legacy.