swactor/crates/iroh-driver
Zachery Aaron Shores-Chmielewski cc6a582102 Move all edge logic into data-plane; reduce iroh-driver to a byte-transport port
Duty mixing between iroh-driver and data-plane is resolved: the transport
crate now owns only byte pumping, and the data-plane owns every edge
semantic.

data-plane:
- ids.rs: single EdgeId/RingId/StreamId/NodeId/RunId/LeaseRequestId/
  ActorAddress definitions; arena, edge_lifecycle, and ring re-export them
  (previously duplicated per module)
- edge_wire.rs: the whole transport contract — WireEvent, EdgeWriter, and
  the EdgeTransport port (associated Writer/PeerAddr types)
- edge_runtime.rs: EdgeRuntime composition engine absorbing iroh-driver's
  driver_pumps bookkeeping, the EdgeEstablisher lifecycle drive, arena
  leasing, ingress stream buffering with object-record parsing, and ring
  writes; effects go through a WorkerPort trait; progress surfaces as
  structured Observations the application maps to telemetry/agent messages
- delete superseded test-only layers: actor.rs (DataPlaneNodeActor),
  edge_actor.rs, ingress.rs, egress.rs and their guarantee tests
- fold ObjectIdAllocator into object_record (now edge-free, starts at 1)

iroh-driver:
- edge_transport speaks pure data_plane::edge_wire vocabulary; EdgeSendHandle
  implements EdgeWriter; IrohDriver implements EdgeTransport (PeerAddr =
  EndpointAddr) — the entire edge surface is open_writer + drain_events
- delete driver_pumps.rs; new dependency on data-plane (no cycle)
- IROH_DRIVER_SPEC §5 updated for the new module set and edge boundary

myelin:
- WorkerEdgeRuntime shrinks from ~830 lines of hand glue to an EdgeRuntime
  holder plus a tinygrad WorkerPort impl and observation reporting; the
  driver-event/edge-event translation layers and newtype re-wrapping are
  gone
- orchestration/app.rs and job edge drains consume WireEvent

Tests: data-plane 31 (5 new EdgeRuntime contract tests), iroh-driver 13,
myelin 65 — all green.
2026-08-16 21:49:45 +04:00
..
src Move all edge logic into data-plane; reduce iroh-driver to a byte-transport port 2026-08-16 21:49:45 +04:00
tests refactor: datastream crate is now telemetry 2026-08-15 12:18:56 +04:00
Cargo.toml Move all edge logic into data-plane; reduce iroh-driver to a byte-transport port 2026-08-16 21:49:45 +04:00
IROH_DRIVER_SPEC.md Move all edge logic into data-plane; reduce iroh-driver to a byte-transport port 2026-08-16 21:49:45 +04:00
README.md refactor: datastream crate is now telemetry 2026-08-15 12:18:56 +04:00

iroh-driver

iroh-driver is the iroh-backed transport bridge for the actorized distribution stack. It owns the concrete iroh endpoint, QUIC connections, relay configuration, peer authorization, and frame shuttling between iroh and swactor actor mailboxes.

Engine ownership

The driver runs on a caller-supplied swactor EngineHandle — the single engine that owns the node's Tokio substrate. All accepts, reads, dials, writes, retries, and teardown are scheduled through that handle; the driver stores no raw Tokio handle and performs no ambient-runtime detection (ENGINE_SPEC.md §7).

let driver = IrohDriver::with_engine(engine.handle(), config)?;

The driver validates that the engine provides the tasks, timers, and io capabilities before binding the endpoint or starting any background work (ENGINE_SPEC.md). Endpoint construction runs as an engine-hosted task; with_engine blocks on a synchronous channel until the endpoint is bound (or fails), so callers need not enter or possess the raw substrate runtime.

Engine-hosted progression

All adapter progression — actor-bridge ingress/egress, telemetry ingress, and edge ingress — is driven by an engine-hosted interval pump installed via install_actor_bridge_pump. Applications do not (and cannot) manually pump these adapters; the single engine owns progression for the node's lifetime (ENGINE_SPEC.md). snapshot is a pure-synchronous read of driver state, callable from any thread. The shutdown method closes the endpoint via an engine-hosted task, blocking on a synchronous channel until completion.