2.2 KiB
2.2 KiB
ECP-0046: Web Directory + WebRTC Signaling via Workers (Interim)
Why
The deployed website at every.channel is static and cannot yet join the QUIC/MoQ mesh directly.
We still need a practical way for web viewers to:
- see a global list of available live channels, and
- connect to one without manual copy/paste.
Browsers do support WebRTC DataChannels. We already use them as a bridge transport (ECP-0043), but we need a rendezvous mechanism for offers/answers and a directory that the website can query.
Proposal
Add a small /api/* surface to the existing Cloudflare Worker (same origin as the website):
/api/directory(GET): list announced live channels (short TTL)./api/announce(POST): publish a channel entry{stream_id,title,offer}with a TTL./api/answer(POST/GET): store and retrieve WebRTC answers for a givenstream_id.
Add an ec-node mode that:
- creates a WebRTC offer,
- announces it to
/api/announce, - polls
/api/answer?stream_id=...until a browser answers, - streams CMAF objects once connected.
Update the website UI to:
- fetch
/api/directory, - show a global list with a basic liveness heuristic (TTL),
- on selection, generate a WebRTC answer and POST it to
/api/answer.
Notes / Risks
- This is intentionally centralized for discovery/signaling. Data still flows P2P once connected.
- Answers are treated as one-shot (first reader consumes) since one WebRTC offer maps to one peer connection.
- Entries and answers are aggressively TTL'd and size-capped; this is not a spam-resistant directory.
- Anti-junk / rate limiting / signing is not implemented in this ECP; it must be addressed before relying on this API for open public use.
- This does not replace the long-term goal of native MoQ mesh discovery.
Deployment Notes
- Cloudflare requires a
workers.devsubdomain to be created for the account even if we only use custom domains. Ifwrangler deployfails with code10063, open the Workers landing page once in the Cloudflare dashboard, then retry deploy.
Reversibility
High. The API is an interim adapter to bridge web constraints. It can be removed or replaced by decentralized rendezvous without changing the core stream objects.