Lewati ke konten utama

ADR-001: Paket Layanan

Status: Diterima

Tanggal: 2025-09-22

Mengapa

Kita membutuhkan sinyal control-plane (misalnya, reset sesi) yang jelas, zero-alloc saat parsing, dan kompatibel mundur.

Keputusan

Dua encoding hidup berdampingan:

  • Legacy:

    [type]        // 1 byte

    Dipertahankan untuk kompatibilitas mundur (saat ini hanya SessionReset).

  • V1 framed:

    0xFF 0x01 [type]   // 3 byte: prefix, versi, tipe

    Menyediakan versioning untuk evolusi masa depan.

Deteksi (ketat)

Sebuah paket adalah paket layanan jika dan hanya jika:

  • len==1 dan type dikenal (legacy), atau
  • len==3 dan byte-nya adalah 0xFF 0x01 <tipe-dikenal> (v1). Semua yang lain bukan paket layanan.

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 sudah dialokasikan
EncodeV1(t PacketType, buffer []byte) ([]byte, error) // zero-alloc: buffer sudah dialokasikan
}

Kompatibilitas & Peluncuran

  • Terima: selalu terima baik legacy maupun v1.
  • Kirim: default ke legacy. Setelah feature flag handshake (ServicePacketsV1=true), kirim v1 ke klien tersebut; jika tidak tetap legacy.