feat(sandokan-daemon): B1.3 — DaemonEngine + protocolo wire

DaemonEngine: implementación del trait Engine que delega a otro proceso
vía Unix socket. Materializa el patrón horizontal de sandokan (el
binario que arranca primero expone el engine; los demás se le suman).

- protocol.rs — DaemonRequest/DaemonResponse (espejan los métodos de
  Engine) + framing postcard length-prefixed (u32 LE + bytes), con
  MAX_FRAME 16 MiB defensivo.
- client.rs — DaemonEngine: stateless, un round-trip por llamada;
  is_reachable() para el probe de auto().
- server.rs — serve(engine, socket): envuelve cualquier Engine, una
  task por conexión, multi-request por conexión.

EngineError ahora es Serialize/Deserialize (viaja por el wire);
NotFound se propaga tipado a través del socket.

1 test de integración: roundtrip real DaemonEngine ↔ serve ↔ LocalEngine
(list vacío + NotFound propagado). cargo check --workspace verde.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-20 14:04:22 +00:00
parent cba3a9dd6e
commit b7d9d7abd9
8 changed files with 358 additions and 1 deletions
+19
View File
@@ -0,0 +1,19 @@
//! sandokan-daemon — `DaemonEngine` + loop servidor.
//!
//! Permite que el orquestador corra en un proceso y otros lo consuman
//! sin reimplementar la lógica: el `DaemonEngine` (cliente) implementa
//! el trait [`sandokan_core::Engine`] enviando requests postcard
//! length-prefixed sobre un Unix socket; [`serve`] corre el lado
//! servidor envolviendo cualquier `Engine` (típicamente un `LocalEngine`).
//!
//! Es la pieza que materializa el patrón horizontal de sandokan: el
//! primer binario que arranca gana el socket y expone el engine; los
//! demás se le suman como `DaemonEngine`.
mod client;
mod protocol;
mod server;
pub use client::DaemonEngine;
pub use protocol::{DaemonRequest, DaemonResponse};
pub use server::serve;