Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,8 @@ transport, benchmark tooling); worktrees isolate commits, not semantics.
- [Graceful close in bindings](/quest/m1/bindings-graceful-close.md) - on dev, `shutdown` drains a session in moq-ffi and every wrapper like Rust, so the wrappers keep the tail of a publish
- [Raw stream codes](/quest/m1/raw-stream-codes.md) - raw QUIC stream resets and stops carry the application's code, not an HTTP/3-mapped one
- [WebTransport close upstream](/quest/m1/wt-close-upstream.md) - web-transport-moq delivers the close capsule itself, and moq-tokio's `CLOSE_LINGER` is deleted
- [Live in apps](/quest/m1/announce-live-apps.md) - the demo and `@moq/room` show "no broadcasts" from the `live` marker, which waits for the first session on page load
- [Page-load marker](/quest/m1/announce-page-load.md) - an announcement stream opened before the first connection waits for its replay before `live`
- [Empty state](/quest/m1/announce-empty-state.md) - watch, room, and the demo show "no broadcasts" once `live` arrives with nothing announced
- [JS active count](/quest/m1/js-active-count.md) - @moq/net speaks MoQ Active Count, so its IETF announce consumers go live without a timer
- [moq announced](/quest/m1/cli-announced.md) - `moq ls` becomes a follow-only live view named `moq announced`, with no remote path completion
- [Delete the live marker](/quest/m1/announce-live-removal.md) - announce streams yield only route events; the `Live` marker and its hold machinery are gone
- [IETF hidden default](/quest/m1/ietf-hidden-default.md) - a moq-transport peer without the MoQ Hidden option is advertised hidden namespaces; one with it filters per subscription
- [Watch refusal](/quest/m1/watch-refusal.md) - `<moq-watch>` shows an origin refusal as an error instead of sitting offline
- [moqsink recoverable errors](/quest/m1/moqsink-keyframe-latch.md) - a leading delta or a timestamp rewind drops frames until a keyframe instead of invalidating a moqsink pad
Expand Down
16 changes: 0 additions & 16 deletions quest/m1/announce-empty-state.md

This file was deleted.

36 changes: 0 additions & 36 deletions quest/m1/announce-live-apps.md

This file was deleted.

51 changes: 51 additions & 0 deletions quest/m1/announce-live-removal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# [L] Delete the announce live marker

## Goal

Announce streams yield only route events (start, update, end) in
`rs/moq-net`, `@moq/net`, moq-ffi, and every binding. The `Live` marker and
everything that exists to produce it are deleted: the per-session replay
holds and landing bookkeeping on the origin, the quiet-period guesses on
wires without an exact count, and the marker in the bindings' event types.

## Plan

Decided 2026-09-29 by the maintainer, after walking through a page-load fix,
a Live/Offline toggle, and a per-session `live()`:

- The marker answers "has the initial list arrived?" Only one-shot listing
(`moq ls`, shell completion) uses it, and no app does: room, watch, and the
demo skip it. An origin merges many sessions and local publishers, so
"caught up" there needs aggregation across connections that start, fail,
and reconnect independently. That produced the page-load race, the special
first connection, and the offline question. With no customer, delete it
rather than patch it.
- No replacement for now. A single-connection listing (a `session.live()`
returning the peer's initial set) can come back when a customer needs it.
- Apps drive loading and offline UI from connection status, which `@moq/net`
already exposes. No empty-state work is planned.
- Wire unchanged. lite's ANNOUNCE_OK Active Count and the IETF Active Count
extension (`drafts/draft-lcurley-moq-active-count.md`) stay on the wire,
unused; a future listing would read exactly that count. Peers still send
and validate it. Only the local consumption goes.

Guidance:

- The marker lives on `dev` only (Rust since #4059, JS since #4261, bindings
since #4266), so this deletion breaks nothing published.
- Look for code that only exists to produce the marker, and delete it rather
than stubbing it: replay/landing counters in the origin, holds taken by the
JS forwarder and reconnect loop, quiet-gap timers on lite-03/04 and
moq-transport, and the batching of the initial set if nothing else needs
it. Keep what other features rely on (for example, request answering
through `expect()`).
- Update `doc/lib/{rs,js}`, `doc/concept`, the binding docs, and examples
(`js/net/examples/discovery.ts`) inline. Delete marker-only tests.
- Run `just test interop --all`.

Public API: removes `AnnounceEvent::Live` / `{ kind: "live" }` /
`MoqAnnounceEvent::Live` and the binding aliases, on `dev`. Wire: none.
Comment thread
kixelated marked this conversation as resolved.

## Required

- [moq announced](/quest/m1/cli-announced.md) - the CLI stops reading the marker first
19 changes: 0 additions & 19 deletions quest/m1/announce-page-load.md

This file was deleted.

38 changes: 38 additions & 0 deletions quest/m1/cli-announced.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# [M] moq announced follows announcements live

## Goal

`moq ls` becomes `moq announced`, which only follows. On a terminal it
redraws a list of what is announced right now, updating on each start and
end. When piped, or with `--json`, it prints one `+`/`-` line per event, as
`moq ls --follow` does today. `moq ls` and its one-shot mode are gone, and so
is shell completion of remote broadcast paths. Nothing in `rs/moq-cli`
reads the announce `Live` marker afterwards.

## Plan

Decided 2026-09-29 by the maintainer:

- Follow-only. A one-shot listing needs to know when the initial set is
complete, which is the only thing the `Live` marker is used for. No
customer needs a one-shot listing, so it waits until one does. Why:
[Delete the live marker](/quest/m1/announce-live-removal.md) removes that
marker because an origin fed by many sessions can't answer "caught up"
honestly.
- The name says what it shows: announcements, as they happen.
- No `ls` alias: it becomes an unknown command, per the no-compat-shim rule.
- Shell completion (`rs/moq-cli/src/complete.rs`) drops the `BROADCAST`
completer, which waits on `Live` today and would otherwise need a timeout.
The other completers (local capture devices, catalog renditions) don't read
`Live` and stay.
- The live view is plain terminal redraw. Prefer a maintained crate if the
redraw grows beyond a few lines. Keep the event-line output byte-for-byte
compatible with today's `--follow` output so scripts only change the
command name.

Update every invocation: `doc/bin/cli.md`, `doc/bin/inspect.md`,
`doc/bin/relay/http.md`, `doc/concept/moq-lite.md`, demo recipes, and
anything else a repo-wide search for `moq ls` finds. Check them against
`--help`.

Public API: moq-cli command rename, which is breaking for scripts. Wire: none.
2 changes: 1 addition & 1 deletion quest/m1/ffi-shape/net.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ are renamed.
- Objects that are only getters become records.
Handles with verbs (`Request`, `TrackRequest`, `GroupRequest`) stay objects.
- An enum whose variants a wrapper must name spells each variant
`<Enum><Variant>` (`AnnounceEventStart`, `AnnounceEventLive`) in Go,
`<Enum><Variant>` (`AnnounceEventStart`, `AnnounceEventEnd`) in Go,
Kotlin, Dart, and Python, whatever the generated name. Swift keeps its
generated `<Enum>.<variant>` cases, since it cannot alias a case.
- `TrackProducer` drops `name`/`is_used`/`used`/`unused` for `demand()`.
Expand Down
23 changes: 0 additions & 23 deletions quest/m1/js-active-count.md

This file was deleted.