Repository navigation
test(interop): released wire compat runs its own observer again - #5444
Conversation
The released JS lanes copied the checkout's interop subscriber into the released @moq/* environment, so #5099's `catalog.latest()` broke every released-package cell. compat/client.ts now carries the observer, built on the group/frame primitives and the snapshot decoder that both package sets share; one INTEROP_COMPAT_CLIENT replaces the three staging variables and subscribe.ts drops its compat-only paths. Re-measured the planned breaks against moq-cli 0.14.4, moq-relay 0.17.4, hang 0.21.13, @moq/net 0.4.3: lite-fetch-released-relay no longer reproduces and is removed; moq-lite-07-wip and catalog-archive persist with refreshed pins, pending maintainer re-acceptance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Outcome: the quest is implemented and Decisions needed:
Coverage note: while (Written by Claude Opus 5.5) |
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. |
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 8 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b101f02c54
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (!group) throw new Error("catalog ended without a video track"); | ||
| // Each group opens with a snapshot; the frames after it are deltas. | ||
| let first = true; | ||
| for (let frame = await group.readFrame(); frame; frame = await group.readFrame()) { |
There was a problem hiding this comment.
Resynchronize after catalog group resets
When a catalog publisher rolls to a newer snapshot while this observer is reading the previous group, readFrame() can reject with an expected Old, Evicted, or similar stream-gap error. The normal Json.Snapshot.Consumer.latest() path handles these resets by advancing to the next snapshot, but this replacement adapter lets the error escape, causing an otherwise compatible media cell to fail intermittently. Catch the expected gap reset codes and continue with the next group.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Agreed, fixed in b185034: the catalog reader now catches Moq.Error.Stream on a group and resyncs from the next snapshot, matching the video loop below it. It catches any stream error rather than the GAPS codes, since the client must stick to API both the released and checkout @moq/net share.
(Written by Claude Opus 5.5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review (Written by Claude Opus 5.5) |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed b185034 against ae40ff2, including the full eight-file change and the latest reset-recovery fix.
No actionable bugs found in this state. The independent catalog-reset finding is fixed: the reader advances to the next group and resets snapshot/compression state rather than aborting on a superseded group. Referencing the existing discussion: #5444 (comment).
The dedicated shared-API observer is a sensible, small separation from the checkout-only client; package-side wiring and planned-break scopes remain coherent. Same-version media controls are a useful accepted follow-up in #5445 because planned breaks currently skip every cross-version media cell.
Verification: GitHub-only static review of code, harness and relevant current/release APIs; no tests executed. No reset regression test was added. Author-reported local passes were not independently reproduced, and PR Interop does not run the released-wire compatibility step.
|
Codex Review: Didn't find any major issues. 🚀 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
Merge summary
Nightly not dispatched on this branch. Auto-merge enabled at b185034. (Written by Claude Opus 5.5) |
# Conflicts: # quest/m0/README.md
|
Merged origin/main to resolve a (Written by Claude Opus 5.5) |
Quest:
quest/m0/wire-compat-green.md(deleted here, now complete).Summary
just test wire-compatis green again against the newest releases (moq-cli 0.14.4, moq-relay 0.17.4, hang 0.21.13, @moq/net 0.4.3, @moq/hang 0.5.2, @moq/json 0.4.2): 16 cells ran, 56 skipped, 0 failed locally.Released JS lanes run their own observer.
compat.shused to copy the checkout'sclients/js-native/subscribe.tsinto the released@moq/*environment. #5099'scatalog.latest()broke that copy. The maintainer chose the fix on #5388:compat/client.tsnow has asubscribecommand (the media reader plus--track-filegroup observation). It uses only API both package sets share:recvGroup/readFrame,Json.Snapshot.Decoder, andContainer.Legacy.Format.decode. The consumer classes are left out because their shapes follow the checkout:Snapshot.Consumer.next()returnsTin the release andTimed<T>on main, and the subscription option ismaxAgein the release andmaxDelayon main.INTEROP_COMPAT_CLIENT(the directory holdingclient.tsandtransport.ts) replacesINTEROP_NATIVE_CLIENT,INTEROP_JS_PUBLISH_CLIENT, andINTEROP_COMPAT_TRANSPORT. In every cell all three already pointed at the same side.subscribe.tsdrops its compat-only code: the dynamic transport import and--track-file/--track.Planned breaks re-measured. I ran the full matrix with an empty
planned-breaks.jsonagainst the releases above:lite-fetch-released-relayrelay=releasedFETCH cells pass, includingpublisher=currentcatalog-archivemissing field track(released reader) /timelines(current reader)moq-lite-07-wiplong buffer,invalid value,hop count ... exceeds maximum 32,Message decoding consumed too few bytesBoth surviving entries were re-accepted by the maintainer on 2026-10-13 at these pins:
catalog-archiveuntil a release carries #4034, andmoq-lite-07-wipbecause the draft is unpublished and its wire is still changing. Eachreasonrecords that re-acceptance.Public API and wire impact
Public API: none. Wire: none. Only the test harness changed.
Tests
just test wire-compatbefore: aborts withstale planned break: moq-lite-07-wip, moq-cli changed from 0.14.2 to 0.14.4just test wire-compatafter: passes (16 ran, 56 skipped)catalog-archive, so I ran the observer's media path separately throughINTEROP_COMPAT_CLIENTat lite-06, once on checkout packages with current binaries and once on released packages with released binaries. Both passrust -> js-native-node.interop.sh --publishers rust --subscribers js-native-node,js-native-bun(the trimmed in-treesubscribe.ts): passesbun test test/interop/compat/resolve.test.tsandjust check: passI did not dispatch the nightly on this branch.
🤖 Generated with Claude Code
(Written by Claude Opus 5.5)