Spec canónica de protocols/session-ipc/README.md, copiada sin reescribir.
protocols/session-ipc/README.mdPágina generada desde
protocols/session-ipc/README.md. No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere.
session-ipc/ — control IPC Bun ↔ daemon Zig (v2, dec-0120)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 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 mensaje | SESSION_PROTOCOL.md y messages/media-engine.md |
/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).correlation_id. El
cliente reconecta en el siguiente uso si el daemon se reinicia.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.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.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.