The web client is real: `tethercore` with the full iroh stack now builds for
wasm32-unknown-unknown, producing tethercore.wasm.
- Runtime abstraction: a `Spawner` replaces the bare tokio runtime Handle across
the Transport trait + Engine + all transports — tokio Handle on native, the
browser event loop (wasm-bindgen-futures::spawn_local) on wasm. The engine no
longer builds a tokio multi-thread runtime on wasm (there are no OS threads).
- IrohTransport's internal tasks (re-register loop, blob fetch) route through the
Spawner; its 30s timer uses n0-future (iroh's cross-platform async) instead of
tokio::time, which isn't available on wasm.
- iroh on wasm: default-features=false + tls-ring (ring builds for wasm with a
wasm-capable clang) + iroh-gossip net; getrandom uses its wasm_js backend.
- build-web.sh documents the toolchain (Homebrew LLVM clang for ring's C, the
getrandom rustflag) and produces the .wasm.
Native (default + iroh + all clients) is byte-unaffected and verified clean
throughout. Remaining for a running web app: wasm-bindgen JS bindings + a browser
shim (relay-only in-browser).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>