You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-[x] Implement setup and session negotiation scaffolding
81
81
-[x] Implement namespace or publish announcement flow
82
82
-[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
84
84
85
85
### Phase 5: object publication
86
86
87
87
-[x] Publish initialization object first
88
88
-[x] Publish media objects according to `PublishPlan`
89
89
-[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
91
92
92
93
### Phase 6: observability and testing
93
94
94
-
-[] Add structured logs for handshake, stream lifecycle, and object publication
95
+
-[x] Add detailed trace logs for handshake, stream lifecycle, and object publication
95
96
-[x] Add unit tests for session-to-transport mapping
96
97
-[x] Add loopback integration tests for transport
97
98
-[ ] 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
99
100
100
101
## Stream mapping
101
102
@@ -175,13 +176,16 @@ Does not own:
175
176
176
177
- The transport seam and session façade are implemented.
177
178
- 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.
182
182
- 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.
Copy file name to clipboardExpand all lines: docs/webtransport-compliance.md
+28Lines changed: 28 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -105,6 +105,7 @@ Areas that are aligned with the drafts:
105
105
- WT protocol offer is sent separately from QUIC ALPN
106
106
- MoQ `CLIENT_SETUP` omits `AUTHORITY` and `PATH` in WT mode
107
107
- 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
108
109
109
110
Areas that should be treated as suspect until proven:
110
111
@@ -134,3 +135,30 @@ The strongest remaining risk area is WebTransport stream handling in our client:
134
135
- possible double-management of local stream context around writes
135
136
136
137
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