Skip to content

Commit ede6984

Browse files
committed
Update WebTransport transport docs
1 parent 63ee69a commit ede6984

2 files changed

Lines changed: 47 additions & 15 deletions

File tree

docs/transport-plan.md

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,34 +68,35 @@ This separation is important because MOQT draft churn should stay isolated to th
6868

6969
### Phase 3: WebTransport connection establishment
7070

71-
- [ ] Require explicit transport path for WebTransport endpoints
72-
- [ ] Establish client HTTP/3 connection with ALPN `h3` by default
73-
- [ ] Bring up a WebTransport CONNECT session using picoquic `h3zero` helpers
74-
- [ ] Map WebTransport stream open/read/write operations onto `PublisherTransport`
75-
- [ ] Report WebTransport session establishment failures cleanly
71+
- [x] Require explicit transport path for WebTransport endpoints
72+
- [x] Establish client HTTP/3 connection with ALPN `h3` by default
73+
- [x] Bring up a WebTransport CONNECT session using picoquic `h3zero` helpers
74+
- [x] Map WebTransport stream open/read/write operations onto `PublisherTransport`
75+
- [x] Report WebTransport session establishment failures cleanly
7676

7777
### Phase 4: MOQT control plane
7878

7979
- [x] Open a control stream after handshake
8080
- [x] Implement setup and session negotiation scaffolding
8181
- [x] Implement namespace or publish announcement flow
8282
- [x] Represent draft-14 and draft-16 control-plane differences behind one abstraction
83-
- [ ] Confirm the same `MoqtSession` flow works unchanged on top of WebTransport streams
83+
- [x] Confirm the same `MoqtSession` flow works unchanged on top of WebTransport streams
8484

8585
### Phase 5: object publication
8686

8787
- [x] Publish initialization object first
8888
- [x] Publish media objects according to `PublishPlan`
8989
- [x] Decide and document one stream mapping policy
90-
- [ ] Handle transport write backpressure
90+
- [x] Use picoquic's callback-driven write path for WebTransport application streams
91+
- [ ] Handle transport write backpressure beyond the current callback-driven queue
9192

9293
### Phase 6: observability and testing
9394

94-
- [ ] Add structured logs for handshake, stream lifecycle, and object publication
95+
- [x] Add detailed trace logs for handshake, stream lifecycle, and object publication
9596
- [x] Add unit tests for session-to-transport mapping
9697
- [x] Add loopback integration tests for transport
9798
- [ ] Add interoperability tests against a raw OpenMOQ endpoint
98-
- [ ] Add interoperability tests against a WebTransport-capable endpoint
99+
- [x] Add manual interoperability coverage against WebTransport-capable endpoints
99100

100101
## Stream mapping
101102

@@ -175,13 +176,16 @@ Does not own:
175176

176177
- The transport seam and session façade are implemented.
177178
- CLI flags for endpoint, transport, ALPN, and TLS-related parameters are present.
178-
- The build can integrate local picoquic and picotls source checkouts directly.
179-
- The current workspace now compiles picoquic and picotls successfully.
180-
- A loopback smoke test now validates the local picoquic handshake and object publication path when it is run outside restricted sandboxes.
181-
- The session layer now uses a dedicated control-message encoder that keeps draft-14 and draft-16 naming differences out of the transport adapter.
179+
- The build integrates local picoquic, picohttp, and picotls source checkouts directly.
180+
- Raw QUIC and WebTransport publisher transports both build and pass local transport tests.
181+
- The session layer uses a dedicated control-message encoder that keeps draft-14 and draft-16 naming differences out of the transport adapter.
182182
- Subscriber-driven serving is implemented for `--forward 0`, including multitrack publication in publish-plan/media-time order rather than draining one subscribed track completely before the next.
183-
- Incremental downstream `SUBSCRIBE` handling now lets later-arriving tracks join future object servicing without restarting the session or losing interleaving for remaining media objects.
184-
- WebTransport mode is now represented in CLI/config and has a transport stub, but the actual `h3zero`-based client implementation remains to be done.
183+
- Incremental downstream `SUBSCRIBE` handling lets later-arriving tracks join future object servicing without restarting the session or losing interleaving for remaining media objects.
184+
- WebTransport mode is implemented on picoquic `h3zero` helpers and uses callback-driven WT app-stream writes instead of direct stream pushes.
185+
- Current live interoperability results are split:
186+
- `draft-14.cloudflare.mediaoverquic.com` and `us-ord-1.moqx.akaleapi.net` reach `SERVER_SETUP` and `PUBLISH_NAMESPACE_OK`
187+
- `fb.mvfst.net:9448` still rejects the tested resource path with HTTP `404` during CONNECT
188+
- After `PUBLISH_NAMESPACE_OK`, an idle `--forward 0` publisher now exits cleanly after the subscriber timeout, emits `PUBLISH_NAMESPACE_DONE`, and does not treat the absence of downstream `SUBSCRIBE` as a publish failure.
185189

186190
## Key risks
187191

docs/webtransport-compliance.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ Areas that are aligned with the drafts:
105105
- WT protocol offer is sent separately from QUIC ALPN
106106
- MoQ `CLIENT_SETUP` omits `AUTHORITY` and `PATH` in WT mode
107107
- local WT app streams are created through `picowt_create_local_stream()`
108+
- WebTransport app-stream writes use picoquic's callback-driven provide-data path instead of direct stream injection
108109

109110
Areas that should be treated as suspect until proven:
110111

@@ -134,3 +135,30 @@ The strongest remaining risk area is WebTransport stream handling in our client:
134135
- possible double-management of local stream context around writes
135136

136137
The current evidence does not support parsing CONNECT-stream bytes as `SERVER_SETUP`.
138+
139+
## Current interoperability state
140+
141+
Observed behavior as of April 6, 2026:
142+
143+
- `draft-14.cloudflare.mediaoverquic.com:443/moq`
144+
- CONNECT succeeds
145+
- `SERVER_SETUP` arrives on the first WT bidi application stream
146+
- `PUBLISH_NAMESPACE_OK` arrives
147+
- the relay may remain idle afterward until a downstream subscriber appears
148+
- `us-ord-1.moqx.akaleapi.net:4433/moq-relay`
149+
- draft 16 CONNECT succeeds
150+
- `SERVER_SETUP` and `PUBLISH_NAMESPACE_OK` arrive on the WT control stream as expected
151+
- the relay may remain idle afterward until a downstream subscriber appears
152+
- `fb.mvfst.net:9448`
153+
- the tested resource paths still return HTTP `404` during CONNECT
154+
- that is currently treated as a server resource-path issue, not a post-CONNECT MoQ framing issue
155+
156+
## Idle subscriber behavior
157+
158+
For `--forward 0`, once `PUBLISH_NAMESPACE_OK` has been received:
159+
160+
- the publisher waits up to `--timeout` seconds for downstream `SUBSCRIBE`
161+
- if no `SUBSCRIBE` arrives before that timeout, the session is treated as idle rather than failed
162+
- the publisher emits `PUBLISH_NAMESPACE_DONE` and exits successfully
163+
164+
This behavior is intentional. It keeps interoperability probes from being reported as publish failures when the relay accepted the namespace but no subscriber appeared during the configured wait window.

0 commit comments

Comments
 (0)