Repository navigation
Conversation
SUBSCRIBE's ranges take implicit Range IDs, and a lite-07 SUBSCRIBE_UPDATE retires live ranges by id and adds new ones instead of restating the whole list. Both ends keep the live set: the subscriber writes each update as an edit, and the publisher resolves it back to the full list before applying it, so the rest of the subscription logic is unchanged. The live set stays non-empty and within what one SUBSCRIBE can carry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
|
Closing unmerged, per the maintainer's decision on 2026-11-01. This prototype conflicts with main in five files, and three in-flight reworks rewrite the same code:
The gap it points at is naming a range: a range added by a later SUBSCRIBE_UPDATE never learns where its relative or time start landed. That question is being recorded in (Written by Claude Opus 5.5) |
kixelated
added a commit
that referenced
this pull request
Nov 2, 2026
#7539 landed, so quic-lb-forward-extras drops its Required on the deleted relay-quic-lb-forward quest. Follow-ups that extend still-open quest PRs now require them: ts-small-step-back (#7221), quic-long-type (#7492), and ts-idle-jitter (#7504). release-fanout-bench notes #7493 landed. Apply the pending edits whose PRs have landed: lite-07 ranges drops its fetch-range Required (#7545 landed the miss judging and cached backfill) and records #7207's range-identity question; quic-lock-contention records #7531's recommendation to keep the Mutex and RefCell. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated
added a commit
that referenced
this pull request
Nov 3, 2026
Land part 1 now; fill under the live demand's budget with the one-group recovery; lite-07 FETCH stays for one group or a slice of one, and SUBSCRIBE never slices within a group; datagram-only groups wait for datagram tracks; implicit Range IDs with #7207's encoding, now this quest's next step. Remove FETCH from lite-07 becomes Lite-07 FETCH is single-group only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Status (2026-11-01 takeover)
Not implemented further, and not merged with main. The maintainer asked for an overlap check against the lite-07 subscription work settled today, and it changes this PR's case. No quest claims this PR (its branch is not a quest branch, and nothing under
quest/mentions Range IDs), so it is an unplanned wire prototype. The branch also conflicts with main in five files (the draft,rs/moq-net/src/lite/{subscribe,publisher}.rs,js/net/src/lite/{subscribe,publisher}.ts).What the settled work means for it:
RangeFillsset adds each owed run as an absolute bounded range on the upstream SUBSCRIBE_UPDATE and retires it once its streams finish. That makes updates churn more than when this PR was written. But each range is a few bytes, so restating stays cheap, and stateless restating is still the simpler encoding.The gap the settled design does expose is range identity, not update size. SUBSCRIBE_OK's Range Starts are positional and sent only once. So a range that a SUBSCRIBE_UPDATE adds after the OK never learns where a Relative or Time start landed. Yet the subscriber now judges completeness from those starts, on a stream that stays open for later updates. Implicit Range IDs, as this PR defines them, are one way to name such a range in a later start report. That question belongs to the lite-07 ranges wire, though, not to a separate delta encoding.
Decisions needed
/quest-planfollow-up). The question to record: a range added by SUBSCRIBE_UPDATE after SUBSCRIBE_OK has no reported start. Decide whether ranges get implicit IDs so a later message can report one. SUBSCRIBE_UPDATE keeps restating the list, and this PR is the reference encoding if IDs are adopted. Reason: restating is small and stateless. Range IDs would add state on both ends, aResolvehook onRequest, and about 680 lines, all under three in-flight reworks of the same wire.just drafts checkand interop. Not recommended, since the code would be reworked again by fetch-range's wire half,RangeFills, and time anchors.Original description
Problem
A lite-07 SUBSCRIBE_UPDATE restates every Range on each update, even one that only changes the priority or the wanted group. A relay serving many downstream windows resends its whole union whenever any one of them moves.
Approach
Prototype of delta-encoded ranges, mirroring how announces use Announce IDs:
SubscribeUpdate<R = Vec<Range>>travels asSubscribeUpdate<RangeEdit>.LiveRanges(lite/subscribe.rs) is kept on both ends. The subscriber diffs its new list against it, and the publisher's request loop resolves each edit back to the full list right after decoding, through a newResolvehook onRequest. The rest of the subscription code is unchanged. Resolving at decode time matters because the publisher keeps only the latest pending update.LiveRanges. The JS subscriber always sends one span, so an update edits only when the span changes. The JS publisher folds the live set into its covering span as before.Impact
moq-lite-07-wip) SUBSCRIBE_UPDATE layout changes as above; earlier versions are byte-for-byte unchanged. Both sides must run this build to speak lite-07.0, 0). A single-range client whose span changes pays 2 more bytes than before (remove count and one ID).liteis private in Rust and not a JS entrypoint.Alternatives
Follow-ups
Review
No new code or review since d4cea2d. This takeover changed only this description.
🤖 Generated with Claude Code
(Written by Claude Opus 5.5)