Skip to content

feat(js)!: JS packages' small surface fixes - #8296

Merged
moq-bot[bot] merged 7 commits into
mainfrom
quest/m2/api-shape/js
Nov 9, 2026
Merged

moq-bot[bot] merged 7 commits into
mainfrom
quest/m2/api-shape/js

Conversation

@kixelated

@kixelated kixelated commented Nov 8, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

The api-shape/js quest (from the 2026-11-07 API shape audit) found JS exports with two paths or two spellings, dead or plumbing-only exports, and a VideoFrame renderer output that the planned watch worker would break. They should be fixed before the cut publishes them.

Approach

One batch per package. Each package's api/*.api.md is regenerated.

  • @moq/net
    • A resolved Track.Info has every field set: compress: boolean, timescale | null, maxAge | null, priority, refresh | null. InfoInit is Partial<Info>, so a received Info passes straight to accept() with no ?? null step.
    • Track.infoDefaults and the Track.rescale alias are gone. The internal authoredInfo is the only resolver.
    • Datagram.Info.timescale is required and nullable too.
    • Connection.Established is renamed Connection.Session, and Connection.Extensions is dropped.
    • readBool is gone from Group.Consumer and Track.Ordered.
    • RouteOptions.instance is { id, epoch }, mirroring Rust's with_instance(instance, epoch). The separate epoch option is gone.
  • @moq/qmux: Session is a named export instead of an anonymous default. Every importer is updated.
  • @moq/watch
    • Video.Renderer.out is a named Video.RendererOutput (timestamp, visible, error) with no frame.
    • The paused poster reads an @internal renderer.painted instead.
    • Stage-to-stage plumbing outputs are @internal: decoder frame, interlaced, and jitter, video source ceiling, and audio source jitter.
    • <moq-watch>'s player is private. The element already exposes broadcast, video, audio, renderer, sync, and reset().
  • @moq/room: Member drops player, broadcast, renderer, and emitter. Its video and audio are now { timestamp, stats }.
  • @moq/publish
    • Broadcast input onDemand is OnDemand = "off" | "retain" | "all", defaulting to "retain".
    • Broadcast.join is a Getter.
    • The source helpers Audio.{isSampleSource, normalizeSource, sourceKind} and Video.normalizeSource are unexported. Video.isStreamTrack is deleted, since only its own tests used it.
    • Preview.Transcode and its types are @internal.
  • @moq/ui: everything except Support, Report, Show, Level, and Status is @internal.
  • @moq/video: rotateVideoDimensions is @internal. Dimensions and Presentation are unexported, and RendererInput writes their shapes inline.
  • @moq/boy: Game, GameConfig, KEY_MAP, and the Moq and Watch re-exports are gone. The element's games property is @internal. The element and status schemas stay.
  • @moq/auth: Key.sign and KeySet.sign take caps one way: patterns with publish_rate and subscribe_rate beside them, matching Rust Claims and Key.verify. The wire form { path, rate } throws.
  • Quest tree: quest/m2/api-shape/js.md is deleted and every link to it is updated.

Impact

Every item is breaking. There is no wire change.

  • net
    • info.maxAge, timescale, and refresh are null, not undefined, when absent; compare with === null.
    • Track.infoDefaults(x): pass x to accept().
    • Track.rescale: use Datagram.rescale.
    • Track.Fill.accept(seq, info) takes a resolved Track.Info; pass a received Info unchanged.
  • net: Connection.Established becomes Connection.Session. Connection.Extensions has no replacement.
  • net: readBool() becomes (await readFrame())?.payload[0] === 1.
  • net: { instance: x, epoch: n } becomes { instance: { id: x, epoch: n } }.
  • qmux: import Session from "@moq/qmux" becomes import { Session } from "@moq/qmux".
  • watch
    • renderer.out.frame becomes out.timestamp.
    • decoder.out.frame becomes out.timestamp !== undefined.
    • watch.player.X becomes watch.X.
    • The hidden plumbing outputs have no replacement.
  • room: member.player, broadcast, renderer, and emitter are gone. Use canvas, muted, volume, and the new video and audio timestamps and stats.
  • publish
    • onDemand: false becomes "off", omitted becomes "retain", and true becomes "all".
    • broadcast.join is read-only.
    • Inline the removed one-line source helpers.
  • ui, video, boy: copy any removed helper you used. On @moq/boy, use @moq/net and @moq/watch directly, and <moq-boy> instead of Game.
  • auth: Key.sign(key, { publish: { path, rate } }) becomes Key.sign(key, { publish: path, publish_rate: rate }).

Removed exports to check against moq.dev's npm consumer:

  • @moq/ui: controlButton, fullscreenButton, icon, settingsButton, format*, graph, Graph, GraphOptions, statCard, statLine, StatCard, StatKind
  • @moq/video: rotateVideoDimensions, Dimensions, Presentation
  • @moq/boy: Game, GameConfig, KEY_MAP, Moq, Watch
  • @moq/publish: the five source helpers and Preview.Transcode*
  • @moq/watch: MoqWatch.player and the plumbing outputs
  • @moq/room: the Member fields listed above
  • @moq/net: Track.infoDefaults, Track.rescale, Connection.Extensions, readBool

Choices made without asking

  • Track.Info.refresh is null for none too, which the quest did not name, so a resolved Info is consistent. Datagram.Info.timescale follows Track.
  • Datagram.rescale stays the one public rescale. The crypto track code calls NetDatagram.rescale, which reads oddly. Time.rescale would be a neutral home, at the cost of one more break.
  • onDemand keeps its name and takes "off" | "retain" | "all". "retain" is the name moq-dev/moq#8269 gives native audio's mode. The quest calls this Rendition.onDemand, but it is a Broadcast input.
  • On watch decoder and source outputs, only the stage-to-stage fields are @internal. stats and stalled stay public, since room exposes the same data.
  • renderer.painted is an internal VideoFrame signal, not a boolean flag, because the bench and two tests read the painted frame's pixels.
  • On @moq/video, Dimensions and Presentation are inlined into RendererInput rather than kept public.
  • Preview.Transcode lives in @moq/publish, not @moq/video as the quest said.
  • Key.sign still accepts the legacy put and get role spelling, because the quest covers only caps.

Alternatives

  • Hiding every watch decoder and source out. That would cut Video.Stats and stalled off from watch users while room exposes them.
  • onDemand: "off" | "audio" | "all", or renaming it to encode. The first drops native's retain name, and the second drops the quest's name.

Follow-ups

  • Key.sign should drop the legacy put and get role spelling, so it takes exactly Claims like Rust's Key::sign(&Claims). Recommend planning it: small, and it gives one spelling per role.
  • Time.rescale as the public home of rescale. Recommend dropping it unless a second caller appears: one oddly named import does not earn a break.

Tested: just check passes. No browser run was possible in this session, so the paused poster path and <moq-watch> are verified only by unit tests.

Models

Size: M
Implementer: Claude Code, claude-opus-5-5, medium effort
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)

(Written by Claude Opus 5.5 with medium)

🤖 Generated with Claude Code

Review

mechanical fix by codex, gpt-6.1-sol, medium effort: Merged base preserving the flattened probe fixture and sync.now stub; applied Session and Info fixture migrations to base additions; passed just ci base, just js check, and bun test test/audio-quality/clients/js/src/probe.test.ts js/net/src/listing.test.ts js/net/src/connection/reload.test.ts. (head 87609af)

Rewritten by quest review after each round.

  • Reviewer: Codex, gpt-6.1-sol, medium effort
  • Session: 01a1bca8-44ef-7491-b45c-7ade2bf532d1, round 3
  • Head: ed246b8
  • Base: origin/main at 4bdf10f
  • Score: 9/10, The merge resolutions and affected callers remain consistent with the branch’s API changes, with no actionable defects identified through source-only review; builds and tests were not run as instructed.
  • Findings: none

kixelated and others added 2 commits November 8, 2026 09:25
Quest-Claim: 9f6039c3c29bf159
Track.Info uses null for none, Connection.Session, qmux named export,
RouteOptions.instance takes { id, epoch }, watch renderer output without
a frame, room exposes timestamps and stats, publish onDemand enum and
join Getter, and ui/video/boy/publish helpers leave the public API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title JS packages' small surface fixes feat(js)!: JS packages' small surface fixes Nov 8, 2026
@kixelated
kixelated marked this pull request as ready for review November 8, 2026 19:36
@coderabbitai

coderabbitai Bot commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You'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 12 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ed64184d-3afd-4c93-955e-e65450738f82
Commits

Reviewing files that changed from the base of the PR and between f102ee0 and ed246b8.

Files selected for processing: 149

  • bench/browser/page/media.ts
  • bench/browser/page/stats.ts
  • demo/carla/web/src/player.ts
  • doc/bin/cli.md
  • doc/concept/identity.md
  • doc/lib/js/auth.md
  • doc/lib/js/index.md
  • doc/lib/js/net.md
  • doc/lib/js/publish.md
  • doc/lib/js/room.md
  • js/auth/README.md
  • js/auth/api/index.api.md
  • js/auth/src/key.test.ts
  • js/auth/src/key.ts
  • js/auth/src/wire.ts
  • js/crypto/README.md
  • js/crypto/src/e2ee/group.ts
  • js/crypto/src/e2ee/index.ts
  • js/crypto/src/e2ee/transport.test.ts
  • js/crypto/src/sign/broadcast.ts
  • js/crypto/src/sign/group.ts
  • js/crypto/src/sign/sign.test.ts
  • js/hang/src/container/track.test.ts
  • js/moq-boy/README.md
  • js/moq-boy/api/element.api.md
  • js/moq-boy/api/index.api.md
  • js/moq-boy/src/element.tsx
  • js/moq-boy/src/index.ts
  • js/net/api/index.api.md
  • js/net/bench/broadcasts.ts
  • js/net/bench/forward.ts
  • js/net/bench/qmux-eager.ts
  • js/net/bench/qmux-lazy.ts
  • js/net/bench/requests.ts
  • js/net/src/auth.test.ts
  • js/net/src/auth_session.ts
  • js/net/src/connection/accept.ts
  • js/net/src/connection/connect.test.ts
  • js/net/src/connection/connect.ts
  • js/net/src/connection/forward.test.ts
  • js/net/src/connection/forward.ts
  • js/net/src/connection/index.ts
  • js/net/src/connection/pool.ts
  • js/net/src/connection/reload.test.ts
  • js/net/src/connection/reload.ts
  • js/net/src/connection/session.ts
  • js/net/src/connection/stats.test.ts
  • js/net/src/connection/stats.ts
  • js/net/src/connection/tokens.test.ts
  • js/net/src/connection/tokens.ts
  • js/net/src/connection/transport.ts
  • js/net/src/datagram.ts
  • js/net/src/fill.ts
  • js/net/src/group.ts
  • js/net/src/ietf/connection.ts
  • js/net/src/ietf/priority.test.ts
  • js/net/src/ietf/publisher.test.ts
  • js/net/src/ietf/publisher.ts
  • js/net/src/ietf/subscriber.test.ts
  • js/net/src/integration.test.ts
  • js/net/src/internal.ts
  • js/net/src/listing.test.ts
  • js/net/src/lite/connection.test.ts
  • js/net/src/lite/connection.ts
  • js/net/src/lite/publisher.ts
  • js/net/src/lite/refresh.test.ts
  • js/net/src/lite/subscriber.ts
  • js/net/src/lite/track.test.ts
  • js/net/src/lite/tracks.test.ts
  • js/net/src/net-cleanups.test.ts
  • js/net/src/open.test.ts
  • js/net/src/order.test.ts
  • js/net/src/origin-demand.test.ts
  • js/net/src/origin-request.test.ts
  • js/net/src/origin.test.ts
  • js/net/src/origin.ts
  • js/net/src/resume.test.ts
  • js/net/src/resume.ts
  • js/net/src/socket.test.ts
  • js/net/src/subscribe_priority.test.ts
  • js/net/src/track.test.ts
  • js/net/src/track.ts
  • js/net/src/untimed.test.ts
  • js/net/src/wire.ts
  • js/p2p/src/transport.ts
  • js/publish/README.md
  • js/publish/api/index.api.md
  • js/publish/bench/audio-page.ts
  • js/publish/src/audio/capture.test.ts
  • js/publish/src/audio/encoder.test.ts
  • js/publish/src/audio/encoder.ts
  • js/publish/src/audio/index.ts
  • js/publish/src/broadcast.test.ts
  • js/publish/src/broadcast.ts
  • js/publish/src/element.ts
  • js/publish/src/preview.ts
  • js/publish/src/rendition-internal.ts
  • js/publish/src/video/encoder.test.ts
  • js/publish/src/video/encoder.ts
  • js/publish/src/video/index.ts
  • js/publish/src/video/types.test.ts
  • js/publish/src/video/types.ts
  • js/qmux/README.md
  • js/qmux/api/index.api.md
  • js/qmux/bench/datagrams.ts
  • js/qmux/src/index.ts
  • js/qmux/src/session.test.ts
  • js/qmux/src/session.ts
  • js/room/README.md
  • js/room/api/index.api.md
  • js/room/src/remote.ts
  • js/ui/README.md
  • js/ui/api/index.api.md
  • js/ui/src/graph.ts
  • js/ui/src/index.ts
  • js/ui/src/stats.ts
  • js/video/api/index.api.md
  • js/video/src/index.ts
  • js/video/src/presentation.ts
  • js/video/src/renderer.ts
  • js/watch/api/element.api.md
  • js/watch/api/index.api.md
  • js/watch/src/audio/source.ts
  • js/watch/src/broadcast.test.ts
  • js/watch/src/element.ts
  • js/watch/src/include.test.ts
  • js/watch/src/player.ts
  • js/watch/src/video/decoder.ts
  • js/watch/src/video/renderer.ts
  • js/watch/src/video/source.ts
  • quest/m2/api-shape/README.md
  • quest/m2/api-shape/js.md
  • quest/m3/goaway-migration-followups.md
  • quest/m3/watch-worker.md
  • test/audio-quality/clients/js/src/probe.test.ts
  • test/audio-quality/clients/js/src/probe.ts
  • test/audio-quality/clients/js/src/ptt.ts
  • test/datagram-tracks/client.ts
  • test/interop/clients/js-native/control.ts
  • test/interop/clients/js-native/server.ts
  • test/interop/clients/js/portrait.ts
  • test/interop/clients/js/qmux-datagrams.browser.ts
  • test/interop/clients/js/qmux-datagrams/main.ts
  • test/interop/clients/js/src/finish.ts
  • test/interop/compat/transport.ts
  • test/max-age/client.ts
  • test/qmux/interop.test.ts
  • test/relay-fill/relay.ts
  • test/video/src/poster.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Share

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head b531487.

No actionable findings identified. Checked the normalized track/datagram metadata across authored, received, and forwarded paths; route instance/epoch migration; Session imports; on-demand mode mapping; renderer/room surface changes; and signing cap encoding. The public API removals are intentional, and the paused-poster path retains its internal painted-frame signal.

Verification limits: static GitHub source and diff review only. I did not run builds, tests, browser playback, interop checks, or validate the external moq.dev npm consumer.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

One public fill path now commits an authored zero max age where it promises no publisher limit, and the nightly qmux-datagrams benchmark no longer links. Both are small fixes.

Reviewed changes

  • @moq/net — resolved Track.Info/Datagram.Info with required nulls; removed infoDefaults, Track.rescale, and readBool; renamed Connection.Established to Session and dropped Extensions; nested RouteOptions.instance as { id, epoch }.
  • @moq/qmux — Session is now a named export, with every in-tree importer migrated.
  • @moq/watch — Renderer.out is a public Video.RendererOutput without frame, the painted frame moved to an internal signal, plumbing outputs became @internal, and player went private on the element.
  • @moq/room — Member narrows to canvas/mute/volume plus { timestamp, stats } for video and audio.
  • @moq/publish — onDemand is an enum with a "retain" default, join is a read-only getter, and the source helpers plus Preview.Transcode are internal.
  • @moq/ui / @moq/video / @moq/boy — helpers and removed types went @internal; boy stopped exporting Game, GameConfig, KEY_MAP, and its Moq/Watch re-exports.
  • @moq/auth — Key.sign and KeySet.sign take the decoded cap spelling and refuse the wire-form role.
  • Quest and docs — the JS quest is deleted, its links point at this PR, and the package API reports and user docs are regenerated.

⚠️ The nightly qmux-datagrams benchmark no longer links

js/qmux/bench/datagrams.ts:3 still does import Session from "../src/session.ts", but session.ts now exports Session by name only. just js qmux-datagrams-bench runs that file from js/justfile, and sh/gh/nightly.sh runs it in the nightly js group, so the job fails as soon as it loads.

Technical details
# QMux bench still imports the removed default export

## Affected sites
- `js/qmux/bench/datagrams.ts:3` — `import Session from "../src/session.ts";`
- `js/qmux/src/session.ts:636` — now `export class Session implements WebTransport`
- `js/justfile:90-92` and `sh/gh/nightly.sh:166` — run the bench nightly

## Required outcome
- The bench imports the named `Session` and `bun build js/qmux/bench/datagrams.ts` succeeds.

## Suggested approach
- `import { Session } from "../src/session.ts";`

## Evidence
- `bun build js/qmux/bench/datagrams.ts --target=bun` reports `error: No matching export in "js/qmux/src/session.ts" for import "default"`.
- `js/qmux/tsconfig.json` includes only `src`, so `just js check` never typechecked this bench.

ℹ️ Two docs still show removed spellings

js/publish/README.md:128 still tells readers to pass onDemand: true, which is no longer a Broadcast option, and doc/concept/identity.md:35 still names the old Rust and JS route spellings that doc/bin/cli.md was updated to fix.

Technical details
# Docs retain the old onDemand and instance spellings

## Affected sites
- `js/publish/README.md:128` — "`onDemand: true` to the broadcast ..."; `BroadcastInput.onDemand` is now `"off" | "retain" | "all"` (default `"retain"`).
- `doc/concept/identity.md:35` — "`Route::with_instance(instance, epoch)` in Rust, `announce({ instance, epoch })` in JavaScript"; the current spellings are `RouteOptions::with_instance` and `origin.route(path, { instance: { id, epoch } })`, as `doc/bin/cli.md` now says.

## Required outcome
- Both sites name the current API.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Comment thread js/net/src/track.ts Resolved
…n by name, stale doc spellings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Fixed all three findings from the pullfrog review in ebaa888:

  • Fill.accept (and the internal FillTrack and fill ops) now take a resolved Track.Info. That fits this PR, since a resolved Info spells "no publisher limit" as maxAge: null. A partial info, which used to turn an absent maxAge into zero, is now a type error. No caller in the repository passed one.
  • js/qmux/bench/datagrams.ts imports { Session }. I checked it with bun build.
  • js/publish/README.md now uses onDemand: "all", and doc/concept/identity.md names RouteOptions::with_instance and { instance: { id, epoch } }.

just check passes, and local review round 2 is clean.

(Written by Claude Opus 5.5 with medium)

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed ebaa888 incrementally from b531487. No actionable findings.

Fill.accept and its internal forwarding types now require resolved Info when supplied, consistent with the normalized metadata contract; omitting info remains supported. The QMux benchmark uses the new named Session export, and the identity/onDemand examples follow the migrated API. Runtime fill behavior is unchanged.

Verification limits: static GitHub review only; no typechecks, benchmarks, tests, or external consumer validation run.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

  • Tightened Fill.accept and the internal FillTrack/fillOps accept paths to a resolved Track.Info, and dropped the "absent maxAge sets no publisher limit" wording from the doc, so a partial fill info is now a type error rather than a silent zero maxAge.
  • Regenerated the @moq/net API report for the new Fill.accept signature.
  • Switched js/qmux/bench/datagrams.ts to the named Session import, so bun build and the nightly qmux-datagrams benchmark load again.
  • Corrected the onDemand: "all" example in js/publish/README.md and the Rust/JS route-instance spellings in doc/concept/identity.md.

Verified locally: tsc --noEmit in js/net, the fill/track test suites (260 pass), sh/markdown.sh check, and bun build js/qmux/bench/datagrams.ts. The previous inline thread on track.ts is addressed by the Info tightening and has been resolved.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

# Conflicts:
#	js/net/src/ietf/connection.ts
#	js/net/src/lite/connection.ts
#	quest/m2/api-shape/apps.md
@kixelated

Copy link
Copy Markdown
Collaborator Author

Merged main into the branch (ed246b8). I resolved the conflicts by hand:

  • js/net/src/{ietf,lite}/connection.ts: kept main's #phase state from moq-dev/moq#8275 and this PR's Session rename. The #closing and #closed fields are gone because #phase replaces them.
  • quest/m2/api-shape/apps.md: kept main's deletion.
  • quest/m3/goaway-migration-followups.md: updated Established to Connection.Session.

just check origin/main passes. Local review round 3 on this head found nothing.

(Written by Claude Opus 5.5 with medium)

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

  • Merged origin/main into the branch; both js/net protocol Connections now implement Session over main's phase lifecycle (#phase), with the Established → Session rename applied to the new code, imports, and JSDoc links.
  • Confirmed js/net/src/connection/session.ts matches main's established.ts apart from the interface name, and no Established references remain outside the unrelated wire Established interface.
  • Retargeted the deleted JS quest's remaining references: the api-shape epic drops its bullet, goaway-migration-followups names Connection.Session, and watch-worker points at this PR.
  • Verified tsc --noEmit in js/net, the ietf/lite connection and js/qmux session suites (237 pass), and bun build js/qmux/bench/datagrams.ts.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@kixelated
kixelated added this pull request to the merge queue Nov 9, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 9, 2026
@moq-bot

moq-bot Bot commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at ed246b8 because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

@moq-bot
moq-bot Bot enabled auto-merge November 9, 2026 02:50
@moq-bot

moq-bot Bot commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

quest land watch: armed auto-merge on this pull request at 87609af, so it joins the back of the merge queue once its required checks pass, with the land fixer's fix (codex, gpt-6.1-sol, medium effort): Merged base preserving the flattened probe fixture and sync.now stub; applied Session and Info fixture migrations to base additions; passed just ci base, just js check, and bun test test/audio-quality/clients/js/src/probe.test.ts js/net/src/listing.test.ts js/net/src/connection/reload.test.ts..

(written by quest land watch)

@moq-bot
moq-bot Bot added this pull request to the merge queue Nov 9, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

Since the prior pullfrog review (ed246b874), the branch merged origin/main again (38c033901) and applied the conflict resolutions and fixture migrations the merge needed.

  • Adopted main's #setDialing(true) in js/net/src/connection/reload.ts, so a dial's status report goes through the single #report() derivation.
  • Applied the Established → Session rename to the merged reload.ts: #serve, #migrate, #end, Draining, #ending, and the dialed-connection local. The file is identical to main apart from the rename.
  • Migrated main's new listing test to a resolved Track.Info via a shared INFO constant, so lister.add fixtures carry every field.
  • Kept this PR's <moq-watch>.player removal in the audio-quality probe stub while taking main's new sync.now stub.

Verified locally: tsc --noEmit on js/net, the full bun test js/net/src suite (3178 pass, 3 skip), and the audio-quality probe test. All prior review threads are resolved.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Merged via the queue into main with commit 50966f2 Nov 9, 2026
8 of 10 checks passed
@moq-bot
moq-bot Bot deleted the quest/m2/api-shape/js branch November 9, 2026 03:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant