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
2 changes: 1 addition & 1 deletion quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ transport, benchmark tooling); worktrees isolate commits, not semantics.
- [Exact scope](/quest/m1/exact-scope.md) - a reader never sees an exact broadcast outside its scope, in Rust or JS; prefix routes above it still present as the empty path
- [Track tail interop](/quest/m1/track-tail-interop.md) - a Rust publisher ending a track with a group in flight is read to its end by the JS subscriber, and the reverse, in `just test interop`
- [Binding audio delay](/quest/m1/binding-surface.md) - moq-ffi and every wrapper configure and observe audio playout delay
- [moq-binary folds into moq-flate](/quest/m1/flate-binary.md) - on dev, moq-flate and @moq/flate own the opaque snapshot and stream tracks and moq-binary is deleted
- [FFI shape](/quest/m1/ffi-shape/README.md) - the bindings mirror Rust's layers: net at the root, then media, json, flate, audio, and video namespaces built from the handle below
- [Track demand](/quest/m1/track-demand.md) - Rust and JS watch a track's subscribers through `demand()` alone
- [Error messages](/quest/m1/error-display.md) - Python, Go, and Dart print `MoqError` with Rust's message, as Kotlin and Swift do
Expand All @@ -41,6 +40,7 @@ transport, benchmark tooling); worktrees isolate commits, not semantics.
- [SUBSCRIBE_DROP](/quest/m1/subscribe-drop.md) - every stream group in a lite subscription arrives or is dropped by name, and lite-07 drops its stream count for it
- [FIN wait expiry](/quest/m1/fin-wait-expiry.md) - a group awaiting its FIN ack still expires and follows priority updates on lite and IETF
- [Cross-relay bursts](/quest/m1/cross-relay-bursts.md) - bursty small-group tracks cross two relays without lost groups, unanswered FETCHes, or stalls
- [JS closed-track leak](/quest/m1/js-closed-track-leak.md) - on dev, a subscriber that joins a closed JS track with unlimited retention is released instead of cached forever
- [Session death parity](/quest/m1/session-death.md) - a local close ends tracks cleanly in both languages, and JS group readers see the session's error on session death
- [Watch video guards](/quest/m1/watch-video-guards.md) - promoting a video track holds the last picture, and an older group never reaches the codec between live deltas
- [Watch decoder recovery](/quest/m1/watch-decoder-recovery.md) - one malformed packet rebuilds the audio or video decoder instead of ending playback
Expand Down
2 changes: 1 addition & 1 deletion quest/m1/ffi-shape/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Settled shape:
consumers); `json`, `flate`, `audio`, and `video` own their producers and
consumers. `flate` holds the opaque snapshot and stream tracks moq-ffi
publishes as `publish_binary_*` today (#4137), named after the crate they
fold into in [moq-binary folds into moq-flate](/quest/m1/flate-binary.md).
fold into in moq-binary's fold into moq-flate ([#4425](https://github.com/moq-dev/moq/pull/4425), on `dev`).
- A layer's type is constructed from the handles its Rust constructor takes,
not reached through an accessor on the broadcast: JSON wraps a track
(`moq_json::snapshot::Producer::new(track, config)`), so it also works on a
Expand Down
2 changes: 1 addition & 1 deletion quest/m1/ffi-shape/json.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ the root must not import it back.
`flate` is the same shape over opaque bytes: moq-ffi's `binary.rs`
(`publish_binary_snapshot`, `publish_binary_stream`, #4137) moves under it,
mirroring `moq_flate::{snapshot, stream}` once
[moq-binary folds into moq-flate](/quest/m1/flate-binary.md). If that fold has
moq-binary's fold into moq-flate ([#4425](https://github.com/moq-dev/moq/pull/4425), on `dev`). If that fold has
not landed, name the namespace `flate` anyway rather than `binary`.

Public API: breaking in every binding. Wire: none.
50 changes: 0 additions & 50 deletions quest/m1/flate-binary.md

This file was deleted.

18 changes: 18 additions & 0 deletions quest/m1/js-closed-track-leak.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# [XS] A late subscriber to a closed JS track is released

## Goal

On `dev`, where `@moq/net`'s track retention can be unlimited, a subscriber
that joins a track after its producer closed is removed from the track cache
once it's done, instead of being held forever.

## Plan

Found while landing the main-into-dev sync (#4428). That PR stopped caching
a subscriber the producer closes when retention is unlimited, since nothing
ages it out, but a subscriber that arrives after the close takes a different
path in `js/net/src/track.ts` and is never cleaned up. Release it on the same
terms, and add a test that a late subscriber to a closed track leaves no
cache entry once it drops.

Public API: none. Wire: none. Targets `dev`, where unlimited retention lives.
2 changes: 1 addition & 1 deletion quest/m2/flate/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ are identical across all of them.
## Plan

`moq-flate` and `@moq/flate` absorb `moq-binary`'s snapshot and stream modes
in [moq-binary folds into moq-flate](/quest/m1/flate-binary.md), so the crate
in moq-binary's fold into moq-flate ([#4425](https://github.com/moq-dev/moq/pull/4425), on `dev`), so the crate
already owns the per-group window a caller could otherwise desynchronize. The
track wrapper this line once planned was dropped for that reason. What
remains is reaching those tracks from the hand-written binding wrappers.
Expand Down
6 changes: 1 addition & 5 deletions quest/m2/flate/bindings.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ decodes in the browser with `@moq/flate` and vice versa.

moq-ffi publishes opaque tracks today (`publish_binary_snapshot` and
`publish_binary_stream`, #4137), renamed after `flate` by
[moq-binary folds into moq-flate](/quest/m1/flate-binary.md). Only the
moq-binary's fold into moq-flate ([#4425](https://github.com/moq-dev/moq/pull/4425), on `dev`). Only the
generated bindings reach them; no wrapper does. This quest binds the existing
track modes, not the bare codec: a `frame()` call across the FFI boundary
invites the window desync the track modes exist to prevent.
Expand All @@ -30,7 +30,3 @@ invites the window desync the track modes exist to prevent.
`just test interop --all`.

Public API: additive on moq-ffi and every wrapper. Wire: none.

## Required

- [moq-binary folds into moq-flate](/quest/m1/flate-binary.md) - the flate snapshot and stream tracks and their moq-ffi names
2 changes: 1 addition & 1 deletion quest/m2/teleop/mavlink.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ skipped and head-of-line blocking is back.

So the lossy class is a latest-value snapshot of opaque bytes:
`moq_binary::snapshot` (moving to `moq_flate::snapshot` in
[moq-binary folds into moq-flate](/quest/m1/flate-binary.md)), with the raw
moq-binary's fold into moq-flate ([#4425](https://github.com/moq-dev/moq/pull/4425), on `dev`)), with the raw
frame as the value. Every update is a self-contained group, so a newer value
never waits behind an older one. One detail decides whether it actually
delivers latest-value:
Expand Down
2 changes: 1 addition & 1 deletion quest/m2/teleop/robot.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ The framing is where the guarantee lives, not the subscription flags:
- The two delivery classes, as the snapshot and stream modes with the group
structure and `Info::max_age` each one needs: `moq-json`'s for JSON, and the
opaque-bytes ones for binary frames (`moq-binary`, folding into `moq-flate`
per [moq-binary folds into moq-flate](/quest/m1/flate-binary.md)).
per moq-binary's fold into moq-flate ([#4425](https://github.com/moq-dev/moq/pull/4425), on `dev`)).
- Per-stage timestamp instrumentation, generalised from moq-boy's `status`
track. Check it against the publisher-reported stats broadcast
([client stats](/quest/m1/qos/stats/schema.md), moq#2734) before adding a
Expand Down