Protocolossession-ipc (control Bun ↔ daemon)

session-ipc (control Bun ↔ daemon)

Spec canónica de protocols/session-ipc/README.md, copiada sin reescribir.

ImplementadoSin versión del tren todavía· generada desde protocols/session-ipc/README.md

Página generada desde protocols/session-ipc/README.md. No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla si difiere.

session-ipc/ — control IPC Bun ↔ daemon Zig (v2, dec-0120)

Propósito

El control plane (Bun: playback-svc, harness de operación) le pide al data plane (styx-media-daemon) que abra, mueva, cancele y cierre sesiones de playback, sesiones MoQT y sesiones de empaquetado. Los bytes de media no pasan por aquí (r01): las respuestas llevan URLs que el cliente pide al data plane (WebTransport / HTTP/3).

Desde v2 el protocolo es spire

Desde la versión 0x02 (dec-0120) el socket de control habla spire (SDK de mensajería de styx, dec-0119): el mismo sobre firmado, la misma policy deny-by-default y los mismos contratos que el bus NATS entre servicios. Aquí queda lo propio del daemon; lo común está en spire:

QuéDónde
Frame, sobre v2, handshake, status (normativo)MKS2508/spire → spec/ENVELOPE_V2.md
Contratos (subject, versión, tope, JSON Schema de petición y respuesta)packages/api-contracts/src/bus/media-daemon.ts
Quién puede mandar qué (allowlist, rate)packages/api-contracts/src/bus/routes.ts (BUS_ROUTES)
Espejo Zig de contratos y policies (generado)native/zig/media-daemon/ipc/contracts.generated.zig (bun run gen:bus, check:bus)
Servidor (daemon)native/zig/media-daemon/ipc/control.zig
Cliente (Bun)packages/bus/src/daemon.ts (createDaemonBus); playback-svc lo usa en media-daemon-client.ts, los harness en tools/soak-harness/lib/ipc.ts
Semántica de cada mensajeSESSION_PROTOCOL.md y messages/media-engine.md

Transporte

  • Unix socket en /tmp/styx-media-daemon.sock (STYX_MEDIA_SOCKET). Local: no cruza NATS (r02); lo que el daemon publica en NATS (señales de transporte) va por otro camino, también spire (evt.media.transportSignals).
  • Conexión persistente: varias peticiones en vuelo correlacionadas por correlation_id. El cliente reconecta en el siguiente uso si el daemon se reinicia.
  • Admisión, antes de leer un sobre: SO_PEERCRED (uid/gid en STYX_CONTROL_ALLOWED_UIDS / STYX_CONTROL_ALLOWED_GIDS; por defecto sólo el uid del daemon) y handshake mutuo firmado en 2 s: el daemon prueba ser media-daemon y el cliente prueba una identidad del keyring que alguna ruta del daemon admite. Si no, la conexión se cierra sin respuesta y se audita.
  • Identidad: SPIRE_SEED (semilla Ed25519 propia) y SPIRE_KEYRING (servicio=<clave>,…), las mismas variables en el daemon y en cada servicio (bun run bus:keys). Sin ellas el daemon no arranca.

Versión

El byte que en v1 era "versión de protocolo" es en v2 el tipo de frame de spire: 0x02 sobre, 0x20..0x22 handshake. Un frame 0x01 (JSON v1) se rechaza. Cada contrato lleva su propia versión (contract_version del sobre). Historia: version-history.md.