Aller au contenu principal

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 octet

    Conservé pour la rétrocompatibilité (actuellement uniquement SessionReset).

  • V1 encadré :

    0xFF 0x01 [type]   // 3 octets : préfixe, version, type

    Fournit le versionnage pour l'évolution future.

Détection (stricte)

Un paquet est un paquet de service si et seulement si :

  • len==1 et type est connu (legacy), ou
  • len==3 et les octets sont 0xFF 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.