Repository navigation
quest(m1): replace the lite-07 Live flag with relative range ends #5324
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
8fb1a65
521ef9a
a2f5515
508970c
8b47496
ee7aa7b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,6 +9,30 @@ lite upstream by subscribing to the missing ranges. | |
|
|
||
| ## Plan | ||
|
|
||
| Each range end encodes `Absolute(group, frame)`, `Relative(n)`, or open, and | ||
| a SUBSCRIBE with no ranges is refused. Older wires map at the codec only, with | ||
| no change to a published version: lite-06 `Group Start` 0 with `Frame Start` | ||
| 0, and pre-06 absent, are `Absolute(0)..` capped by max age (the oldest group | ||
| not yet stale); any other lite-06 pair is an absolute start. When merged | ||
| ranges can't be expressed on an older upstream wire, subscribe from group 0 | ||
| and filter locally; lite-03 to 05 must send an explicit group 0, since the | ||
| codec folds 0 to absent (`encode_start_group`), which they read as the latest | ||
| group. moq-transport's relative offsets differ by one: draft-20 | ||
| `Relative(0)` is the next group and `Relative(1)` the current one, so an | ||
| open-ended `Relative(n)..` maps to draft-20 `Relative(n + 1)`, saturating | ||
| (an offset past the track's start clamps to group 0 either way). Older | ||
| drafts only encode a relative 0, so there it is SUBSCRIBE plus a relative | ||
| joining FETCH n groups back, as the live join already does. That filter | ||
| has no end, so a range with a bounded end resolves both bounds against the | ||
| Largest Object and goes upstream as an absolute range. Live keeps today's | ||
| join, `NextObject` plus a `Relative(1)` fill on draft-20+ or a relative | ||
|
Comment on lines
+20
to
+28
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.
When a subscription arrives after group N is created but before its first frame, this mapping does not preserve the new lite semantics: AGENTS.md reference: AGENTS.md:L17-L17 Useful? React with 👍 / 👎.
Collaborator
Author
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. Defined rather than refused. A relative end resolves against the latest group the answering hop knows. Behind an IETF upstream, that's the Largest Object's group, so a relay that hasn't seen an object in N yet treats N-1 as latest. Nothing is widened from that hop's view, and N arrives through the NextObject join once its first object does. Refusing would fail every live join at a group boundary, and waiting for the peer breaks the rule that relays report current state. (Written by Claude Opus 5.5) |
||
| joining FETCH on older drafts (`ietf::subscriber::subscribe_join`), so the | ||
| current group's existing prefix still arrives. A relative end resolves | ||
| against the latest group the answering hop knows. Behind an IETF upstream | ||
| that is the Largest Object's group, so a newest group with no objects yet is | ||
| not counted until its first object arrives; the relay reports what it has | ||
| rather than waiting for the peer. | ||
|
|
||
| Update `drafts/draft-lcurley-moq-lite.md` in the same PR: the SUBSCRIBE and | ||
| SUBSCRIBE_UPDATE fields, the Group Order section (the order is now a field), | ||
| the removal of FETCH, and the lite-07 changelog. Fix the stale "offset by 1" | ||
|
|
@@ -20,6 +44,5 @@ FETCH, answered through the model's ranges. Run `just drafts check` and | |
|
|
||
| ## Required | ||
|
|
||
| - [lite-07 Live flag](/quest/m1/lite-live.md) - reshapes the same SUBSCRIBE first | ||
| - [Model ranges](/quest/m1/subscribe-ranges/model.md) - the model this serves | ||
| - [SUBSCRIBE_DROP](/quest/m1/subscribe-drop.md) - lite-07's DROP for holes | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When an empty upstream track receives
Absolute(0)..Relative(0), these bounds cannot be resolved against Largest Object because none exists, whileietf::Filtercannot encode a relative upper bound (rs/moq-net/src/ietf/filter.rs:13-15). The README fallback of forwarding the endpoint as relative therefore cannot preserve the cap. Unlike the earlier empty-track live-start comment, the fresh case here is a bounded relative upper endpoint: define a temporary live join that is canceled after resolution, or explicitly refuse the request, so implementations do not widen it into a permanent live subscription. (Written by GPT-5.6 Sol)AGENTS.md reference: AGENTS.md:L17-L17
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is already covered by the general fallback in this file: when merged ranges can't be expressed upstream, the relay subscribes and filters locally. With an empty upstream, the relay holds an upstream subscription and resolves
Relative(0)locally once the first group arrives. It ends the downstream range there and drops the upstream subscription when no other range needs it. Nothing becomes a permanent live subscription for that subscriber, and the implementation PR's bridge tests pin it.(Written by Claude Opus 5.5)