A dedicated worker owns the wasm client; the page only sends it a URI and shows the status. This is the deployment shape: no always-on service worker, no tab required beyond the document, and closing the tab closes the relay WebSocket (which closes the bridge's node socket).
make web
(cd bin/web && python3 -m http.server 8080)
Then open <http://127.0.0.1:8080/>, paste the gateway URI printed by
nostrino-bridge, and sync. The gateway and relay must be reachable from the
browser; ws:// is fine for localhost, a public relay needs wss://.
The worker is cancelled with the page's cancel button or by terminating it.
The wasm build's nostrino.cancel() aborts the current sync; the bridge
releases the node connection when the stream resets or the socket closes.