Repository navigation
docs(quest): plan follow-ups from the spawn-quests run #4064
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
62157b2
d87e5d6
7293f26
d676b25
e1da5a4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| # [M] Bindings see when an announce consumer has caught up | ||
|
|
||
| ## Goal | ||
|
|
||
| moq-ffi, libmoq, and every wrapper (`py`, `swift`, `kt`, `go`, `dart`) yield | ||
| the same flat announce event Rust does: `Announced`, `Updated`, or `Retracted` | ||
| carrying the announce, or `Live` once every route live at subscribe time has | ||
| been delivered. A binding app can list what is live and stop, with no timer. | ||
|
|
||
| ## Plan | ||
|
|
||
| Mirror the Rust `announce::Event` from | ||
| [Caught up](/quest/m1/cli-inspect/caught-up.md) one to one: | ||
|
|
||
| - moq-ffi: `MoqAnnounceConsumer::next` returns `MoqAnnounceEvent`, a uniffi | ||
| enum with the four variants, replacing `MoqAnnounceUpdate::active()`. Stop | ||
| filtering `Live` in `rs/moq-ffi/src/origin.rs`. | ||
| - libmoq: the `on_announce` handle's `moq_announce_update.kind` gains a LIVE | ||
| value with no route fields, replacing the active flag. Stop skipping | ||
| `Event::Live` in `rs/libmoq/src/origin.rs`. | ||
| - Hand-written wrappers and `doc/lib/{py,swift,kt,go,dart,c}` follow, with a | ||
| test per binding that an empty origin still yields `Live`. | ||
|
|
||
| Public API: breaking in moq-ffi, libmoq's C ABI, and every wrapper, so it | ||
| retargets to `dev` with the Rust break. Wire: none. | ||
|
|
||
| ## Required | ||
|
|
||
| - [Caught up](/quest/m1/cli-inspect/caught-up.md) - settles the event shape this mirrors | ||
|
|
||
| ## Related | ||
|
|
||
| - [JS caught up](/quest/m1/js-announce-caught-up.md) - the same event in `@moq/net` |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| # [S] Interop asserts the AUTH grant | ||
|
|
||
| ## Goal | ||
|
|
||
| `just test interop --all` fails a lite-06 cell whose client did not receive | ||
| the grant its relay token implies, and a new negative round passes only when | ||
| a client publishing outside its grant fails loud with `Unauthorized`. Today | ||
| the matrix checks media alone, so a malformed AUTH_OK that leaves a session | ||
| with no grant passes silently. | ||
|
|
||
| ## Plan | ||
|
|
||
| The Rust and JS interop clients each print the grant they received in one | ||
| parseable line; `test/interop/interop.sh` | ||
| compares it against the token the cell minted. The negative round mints a | ||
| token that excludes the published path and expects the publisher's session | ||
| to close with `Unauthorized` naming the path, and the subscriber to see | ||
| nothing. Cells below lite-06 skip both checks, as do binding clients until | ||
| [Bindings](/quest/m1/auth/bindings.md) gives them a grant to print; that | ||
| quest adds them to the same assertion. No public API or wire change. | ||
|
|
||
| ## Required | ||
|
|
||
| - [Lite stream](/quest/m1/auth/lite.md) - the AUTH exchange being asserted |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| # [S] A subscription that loses access resets with UNAUTHORIZED | ||
|
|
||
| ## Goal | ||
|
|
||
| When a grant shrinks and a subscription, fetch, or announce loses access, | ||
| its stream resets with a dedicated `UNAUTHORIZED` stream code, so the peer | ||
| tells revocation apart from a session closing. Today it resets with | ||
| `0x3 SESSION_CLOSED` (`StreamError::Session(Unauthorized)`). | ||
|
|
||
| ## Plan | ||
|
|
||
| Assign `0x3A UNAUTHORIZED` in the lite draft's stream error table, the next | ||
| code in the application block after `TIMESTAMP_MISMATCH`, on lite-06: a | ||
| published lite-06 peer already maps an unknown stream code to a generic | ||
| error, so the addition is compatible. Add the matching `StreamError` | ||
| variant (the enum is non-exhaustive) in Rust and JS, send it from every | ||
| revocation path the lite stream added, and cover it in the Rust and JS | ||
|
kixelated marked this conversation as resolved.
|
||
| tests. Map it to the existing `Unauthorized` protocol kind in | ||
| `stream_kind` in `rs/moq-ffi/src/error.rs` and `rs/libmoq/src/error.rs`, | ||
| whose wildcard arms would otherwise report `Unknown`, with a test for each. | ||
| Update `drafts/draft-lcurley-moq-lite.md` and run `just drafts check`. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This quest adds a new AGENTS.md reference: AGENTS.md:L95-L99 Useful? React with 👍 / 👎. |
||
|
|
||
| ## Required | ||
|
|
||
| - [Lite stream](/quest/m1/auth/lite.md) - the revocation paths that send it | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| # [S] Closing a listener releases its socket before returning | ||
|
|
||
| ## Goal | ||
|
|
||
| Closing a moq-tokio server, and moq-ffi's `Listener::close` on top of it, | ||
| returns only after the UDP socket is released, so a restart can rebind the | ||
| same port at once. Go's `TestReconnectAcrossRelayRestart` | ||
| (`go/wrapper/reconnect_test.go`) fails on main today because the rebind | ||
| races the old socket. | ||
|
|
||
| ## Plan | ||
|
|
||
| `Server::shutdown` (`rs/moq-tokio/src/server.rs`) calls `noq.close()` and | ||
| sleeps 100 ms without waiting for the endpoint driver to drop the socket. | ||
| Await the driver's exit instead and delete the sleep; moq-ffi's | ||
| `Listener::close` already documents a synchronous release, so make it true | ||
| rather than change the doc. Check the io_uring and WebSocket listeners for | ||
| the same gap. Add a Rust test that closes a server and rebinds its port | ||
| immediately; the Go test becomes the cross-language regression. No wire | ||
| change; the only API change is that close takes as long as the release. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| # [XS] moq-tokio tests bind their ports independently | ||
|
|
||
| ## Goal | ||
|
|
||
| moq-tokio's integration tests never fail on a port another process or | ||
| parallel test holds. `websocket_forbidden_does_not_end_a_quic_connect` | ||
| (`rs/moq-tokio/tests/broadcast.rs`) fails about 1 in 15 local runs today. | ||
|
|
||
| ## Plan | ||
|
|
||
| `test_server()` takes an ephemeral UDP port and then binds TCP on the same | ||
| number, which was never reserved on TCP. Bind the QUIC and WebSocket | ||
| listeners each on `:0` and hand the test client the WebSocket port | ||
| explicitly, adding a client config override for the fallback URL's port if | ||
| none exists (test-only if possible; otherwise note it as a public API | ||
| addition). No retry: this replaces the bounded bind retry | ||
| [#4055](https://github.com/moq-dev/moq/pull/4055) added. No wire change. |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| # [S] JS names the break discontinuity() | ||
|
|
||
| ## Goal | ||
|
|
||
| `@moq/hang`'s container producer spells its two operations the way Rust | ||
| `moq_mux::container::Producer` does: `cut(end?)` closes the current group, | ||
| and `discontinuity()` closes it and writes the empty marker group that tells | ||
| subscribers to re-anchor. Today JS's public `cut()` writes the marker, so the | ||
| same name means a routine group close in Rust and a timeline break in JS. | ||
|
|
||
| ## Plan | ||
|
|
||
| [#4045](https://github.com/moq-dev/moq/pull/4045) deletes | ||
| `quest/m1/js-publish-discontinuity.md`, since #3982 already put the marker | ||
| in `cut()`; this rename is the only remaining JS work. | ||
|
|
||
| In `js/hang/src/container/legacy.ts`, rename the public `cut(end?)` to | ||
| `discontinuity()` (taking the same optional end) and keep the routine close | ||
| private until a caller needs it public. Move `js/publish/src/video/encoder.ts` | ||
| and any other caller over, and keep data tracks skipping a sequence the way | ||
|
kixelated marked this conversation as resolved.
|
||
| Rust's `discontinuity()` does if a JS data-track caller appears. Rust is | ||
| untouched. | ||
|
|
||
| Public API: breaking in published `@moq/hang`, so it targets `dev`. Wire: none. | ||
Uh oh!
There was an error while loading. Please reload this page.