Repository navigation
test(interop): cover late join and FETCH of a past group - #7015
Conversation
Quest-Claim: e122733012b6f794
… and JS The tail suite gains a late-join lane, Rust-to-Rust and Rust/Node/Bun in both directions. The publisher writes group 0's head before any subscriber exists and releases the rest only after the subscriber reports reading that head, so only a join from object 0 passes. The CLI FETCH round now fetches group 1 of a finished track from Rust and each native JS publisher, requiring its exact three objects. The native JS publisher's late-join cells fail on drafts 18 and 22: the Node polyfill reports a peer's RESET_STREAM as a plain error, so js/net reads the relay's FETCH cancellation as a malformed request and closes the session. The quest now tracks that remainder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…join quest 0.1.6 reports a peer's RESET_STREAM and STOP_SENDING as a WebTransportError carrying the code, so @moq/net no longer reads the relay's request cancellation as a malformed message. The four native JS publisher late-join cells on drafts 18 and 22 now pass, which was the quest's remainder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 92b5fb3
No actionable bugs found in the changed areas. The direction is sound: publishing the head before discovery and withholding the tail until its explicit acknowledgement makes the late-join check deterministic, while distinct per-object payloads and exact JSON assertions strengthen the past-group FETCH check. Reusing the existing tail clients and bounded harness is simpler than adding a separate media fixture.
Verification: static review of the Rust/JS client changes, harness lifecycle and timeout handling, CLI JSON output, and dependency/lockfile updates; no tests or builds run. The documented JS-subscriber FETCH limitation remains outside this coverage, and the native dependency's implementation was not independently validated.
|
No actionable comments were generated in the recent review.
|
|
Landing per the maintainer's merge pick (2026-10-28).
(Written by Claude Opus 5.5) |
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Adds the late-join and FETCH interop coverage from
quest/m1/interop-coverage/late-join.mdto the in-tree tail suite (just test interop --tail, which runs in every--versionspass, including the nightly--versions ietf), and finishes that quest:run_late_pair, newlatemode in both raw tail clients): Rust to Rust and Rust/Node/Bun in both directions, through the relay. The publisher writes group 0's first two objects before any subscriber exists and leaves the group open. The subscriber joins at the latest group (no range, as a player does) and reports on stdout once it has read those two objects. Only then does the harness release the rest of group 0 and group 1. A join that skips the head stalls, so the case cannot pass on timing.run_fetch_round <pub>, newcachedmode in the JS tail client): the CLI FETCHes group 1 of a finished track from the Rust publisher and from each native JS runtime. Each group holds three objects with distinct bytes, and the check requires exactly those three, in order, with the right group, index, and size. This replaces the old Rust-only FETCH of a one-object group 0.@moq/web-transport0.1.5 to 0.1.6 intest/interop/clients/js-nativeandtest/receive-credit. 0.1.6 (moq-dev/web-transport#470) reports a peer's RESET_STREAM and STOP_SENDING as aWebTransportErrorcarryingsource: "stream"and the code, as browsers do. It also sends the reason's code fromabort()/cancel()instead of 0.The four cells this fixes
With 0.1.5, the four
late joincells from a native JS publisher to the Rust subscriber (js-native-nodeandjs-native-bun, drafts 18 and 22) failed:cancel_group_fetchaborts both halves, on every draft.Error("RESET_STREAM: 1")that had nosourceorstreamErrorCode.malformed()injs/net/src/ietf/request_stream.tsrelies onsourceto tell a reset from bad bytes, so it read the cancellation as a malformed request and closed the session with PROTOCOL_VIOLATION.Browsers were never affected. With 0.1.6, all four pass, and
@moq/netis unchanged.Results (local, head 92b5fb3)
Decisions (made by the maintainer)
@moq/net. Released as@moq/web-transport0.1.6 and bumped here. The temporary localmalformed()patch from the investigation was never committed and is not in this PR.@moq/net's moq-transport subscriber has no FETCH (track.Consumer.fetchGroup()is rejected there), so the FETCH round uses only Rust as the subscriber. JS subscribers are covered by the late-join lane. JS IETF subscriber FETCH is listed under follow-ups.Choices made without asking
Impact
Public API: none. Wire: none. Test-harness only:
interop-tailandtail.tsgainlate(andtail.tsgainscached), plus newlate joinand per-publisherCLI FETCHcells in the report. Test dependency:@moq/web-transport^0.1.6.Checks
just test interop --tail --versions auto,moq-transport-18,moq-transport-22: all checks pass on all three versions, including the four cells above.just test interop --all: all checks pass (180 PASS, no FAIL or SKIP).just check: pass.quest check --base origin/main: pass.Suggested follow-ups
@moq/net's moq-transport subscriberfetchGroup, plus a joining FETCH or fill on a mid-group join, then add JS subscribers to the CLI FETCH round. Today a strict third-party relay would cut a JS subscriber's join to the next group boundary (see the comment atjs/net/src/ietf/subscriber.tson the SUBSCRIBE filter).test/interop/clients/rust/changes,just fixandjust checkneither rustfmt nor clippy thosemoq-cliexamples.Server.close()deadlocks while anaccept()is pending,Session.closednever rejects on abnormal termination, and a pendingread()pins an abandoned reader's native stream.tail js-native-bun -> rustdraft-18 flake thatquest/m2/ietf-join-after-finish.mddescribes.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code