Saltar al contenido principal

ADR-001: Paquetes de Servicio

Estado: Aceptado

Fecha: 2025-09-22

Por qué

Necesitamos señales del plano de control (p. ej., reinicio de sesión) que sean inequívocas, sin asignaciones al parsear y compatibles con versiones anteriores.

Decisión

Coexisten dos codificaciones:

  • Legado:

    [type]        // 1 byte

    Mantenido para compatibilidad con versiones anteriores (actualmente solo SessionReset).

  • V1 enmarcado:

    0xFF 0x01 [type]   // 3 bytes: prefijo, versión, tipo

    Proporciona versionado para evolución futura.

Detección (estricta)

Un paquete es de servicio si y solo si:

  • len==1 y type es conocido (legado), o
  • len==3 y los bytes son 0xFF 0x01 <tipo-conocido> (v1). Todo lo demás no es un paquete de servicio.

API

package service

type PacketType uint8
const (
Unknown PacketType = iota
SessionReset
)

type PacketHandler interface {
TryParseType(pkt []byte) (PacketType, bool) // sin asignaciones
EncodeLegacy(t PacketType, buffer []byte) ([]byte, error) // sin asignaciones: buffer está preasignado
EncodeV1(t PacketType, buffer []byte) ([]byte, error) // sin asignaciones: buffer está preasignado
}

Compatibilidad y Despliegue

  • Recibir: siempre aceptar tanto legado como v1.
  • Enviar: por defecto legado. Después del flag de característica en el handshake (ServicePacketsV1=true), enviar v1 a ese cliente; de lo contrario mantener legado.