swactor/crates/iroh-driver
Zachery Aaron Shores-Chmielewski 966497ec07 feat: proper README, LICENSE, and our first quick example
Add project licensing and a full README, plus a minimal WebAssembly ping-pong example that exercises the actor runtime.

- `LICENSE`: add the full GNU AGPL-3.0 text and set `license = "AGPL-3.0-only"` on every package (`swactor`, each crate, `apps/myelin`, `tools/vastai`, `xtask`)
- `README.md`: rewrite from a stub into a full project overview, covering features (actor_id routing, WASM, iroh QUIC/SWIM, OTP-style std, process manager, zero-copy objects, datastream metrics, dashboard), architecture, examples, developing, status, and license
- `examples/ping-pong`: new standalone workspace (`pingpong` cdylib) where two actors volley on a single-threaded `wasm` runtime driven by a Node host via `tick()`, demonstrating spawning, message passing, and death monitoring (`watching`)
- `examples/ping-pong`: add a host/run harness -- `run.sh` (wasm-pack build + `run.mjs`), `serve.sh` (dashboard + static demo), `index.html`, and a pinned `Cargo.lock`
- `.gitignore`: stop ignoring `.loop/`, `.deployment-notes/`, and `.omp/`

Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-08-06 00:53:16 +04:00
..
src refactor(mvp-system): move swim telemetry into distribution stack 2026-07-30 15:31:23 +04:00
tests refactor: fold driver pumps into iroh-driver and codecs into transport 2026-07-30 12:18:02 +04:00
Cargo.toml feat: proper README, LICENSE, and our first quick example 2026-08-06 00:53:16 +04:00
IROH_DRIVER_SPEC.md docs(iroh-driver): add spec, slim mvp-system specs 2026-07-21 10:25:52 +04:00
README.md refactor: extract iroh-driver crate, drop node example 2026-06-24 00:10:41 +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.

Tokio runtime ownership

The driver needs Tokio because iroh's endpoint, accepts, dials, stream reads/writes, retry timers, and shutdown APIs are async. New call sites should make that engine explicit by constructing the driver with:

let driver = IrohDriver::with_handle(tokio_handle, config)?;

with_handle does not own the Tokio runtime. The caller must keep the runtime alive for as long as the driver exists.

Legacy implicit constructor

IrohDriver::new(config) is still present as a compatibility convenience, but it hides runtime ownership:

  • If called inside an existing Tokio runtime, it uses Handle::try_current() and shares that ambient engine.
  • If called outside Tokio, it silently builds and owns a multi-threaded Tokio runtime with enable_all().

Avoid IrohDriver::new in new production code. Use with_handle or an explicit engine wrapper at the application boundary so every Tokio engine in the process is visible in construction code.

Sync facade caveat

The synchronous facade methods that bridge to async with block_on must run from a non-async thread. Do not call those methods from inside tasks running on the same Tokio runtime; Tokio will panic on nested block_on.