ExplicacionArquitectura del sistema

Planos y servicios

Los planos de Styx, la regla Bun decide y Zig ejecuta, los servicios y cómo está construido cada uno por dentro.

Implementado. Describe la topología que existe en el repositorio. La referencia de cada servicio (rutas HTTP, subjects del bus, variables de entorno) se genera del código bajo referencia/ y no se repite aquí.

Los planos

Styx separa por diseño lo que decide de lo que ejecuta. Los cinco planos vienen del diseño original (decisión r02, origen en el brainstorm de arquitectura) y siguen vigentes:

CLIENTES        web · apps nativas · CLI · agentes
   │
DELIVERY        HLS · HTTP Range · HTTP/3 · WebTransport · MoQT
   │
DATA PLANE      styx-media-daemon (Zig): E/S, caché, índices, motor de medios, sesiones, transportes
   │  socket de control (spire)
CONTROL PLANE   servicios Bun/Elysia: API, identidad, catálogo, planes, políticas, extensiones
   │
PERSISTENCIA    PostgreSQL · Valkey · NATS JetStream · raíces de ficheros del daemon

Dos reglas gobiernan la frontera entre el control plane y el data plane:

  • Bun decide, Zig ejecuta (dec-0012, dec-0014). El control plane expresa intención y política (qué plan de reproducción, quién puede leer qué). El daemon posee el camino completo desde esa intención hasta el byte entregado por QUIC.
  • Los bytes de vídeo no atraviesan JavaScript ni el bus. El socket de control lleva sesiones, capacidades y eventos; los bytes salen del daemon directamente al cliente.

El orden de preferencia de la frontera Bun↔Zig es: daemon sobre socket Unix, después Node-API, después bun:ffi. Esta última nunca es la frontera principal.

Servicios

Un contenedor por responsabilidad (dec-0002, dec-0003), sin modo monolito. Que un servicio esté implementado o sea un esqueleto se mira en apps/, no en esta tabla, que sólo dice qué hace cada uno:

PiezaResponsabilidad
identity-svcRelying party OIDC (Pocket ID de referencia), emisor de tokens de acceso, dueño de actores y sesiones, JWKS
catalog-svcCatálogo federado (obra, edición, asset, índice de medios) y alta de ficheros ingeridos
playback-svcPlanificación de reproducción, sesiones contra el daemon, emisión de capacidades (SCT) y decisión de quién puede subir
sources-svcRegistro de fuentes, disponibilidad y selección de la fuente de un asset
realtime-svcProyección de señales de transporte filtradas hacia los clientes por WebSocket
workers-svcContenedor de la topología; hoy sólo sirve /health (el probe con ffprobe se retiró por dec-0110)
extensions-svcAutoridad de manifests y ciclo de vida de extensiones; sin código todavía
styx-media-daemonData plane en Zig: motores de medios, caché, transportes, ingesta, relay MoQT
apps/webWeb (TanStack Start). Hace de BFF: es el único origen de control plane que ve el navegador (dec-0118)

Ningún servicio importa a otro: se hablan por el bus (cmd, qry, evt) o por el socket de control del daemon. La única excepción documentada es el tipo (sólo tipo) de la aplicación de catalog-svc que consume @styx/clients para el cliente Eden.

Por dentro de un servicio

Cada servicio Elysia sigue cinco capas y no crea una capa sin una responsabilidad real:

src/
├── core/{handlers,ports}/      lógica pura y puertos (interfaces)
├── service/<adaptador>/        implementación de los puertos: base de datos, bus, OTel, daemon
├── transport/http/routes/      rutas Elysia 2 con los contratos TypeBox de @styx/api-contracts
├── bootstrap.ts                cableado, listeners y apagado ordenado
├── app.aot.ts                  la misma aplicación para la captura del bundle AOT
└── test/                       core, service, transport, integration, smoke

Los servicios se empaquetan como un bundle AOT (dist/bootstrap.js) que sirve la imagen de docker/<servicio>.Dockerfile (dec-0116). La base HTTP común está en @styx/service-http: problemas RFC 9457, política deny-by-default por ruta, cabeceras y verificación de rutas.

Reglas de dependencia

  • apps puede depender de packages; packages no depende de apps (excepción de arriba).
  • Dentro de packages, la dirección sana es del consumidor al contrato: playback-policy depende de api-contracts, nunca al revés.
  • @styx/api-contracts es la fuente canónica de los contratos y no importa elysia: a Elysia se le pasa el esquema crudo (bus y contratos).

Dónde seguir