Skip to content

Merge main into dev#1848

Merged
kixelated merged 35 commits into
devfrom
claude/merge-main-into-dev-0nb02s
Jun 21, 2026
Merged

Merge main into dev#1848
kixelated merged 35 commits into
devfrom
claude/merge-main-into-dev-0nb02s

Conversation

@kixelated

@kixelated kixelated commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

Merges the 31 commits on main that weren't yet in dev, resolving 40 conflicted files plus a couple of silent both-sides-added duplicates that git didn't flag. The guiding principle throughout: where main added a feature on top of code dev has since refactored, the feature was hand-ported onto dev's architecture rather than dropped or taken wholesale.

Conflict resolutions

CI (check.yml, flake.nix, nix/overlay.nix, rs/justfile) — took main's cargo+sccache direction. dev only carried the crane checks via an earlier main merge (#1801); main has since superseded it with the cargo/sccache approach (#1821), so main's is the newer decision. Preserved dev's wasm32 target + wasm-bindgen-cli + libva devShell deps.

Cargoqmux 0.2 (confirmed 0.2 still exposes dev's high-level ws::Client/ws::Server builder API, so dev's cleaner integration compiles against it), kept dev's moq-hls, and the lockfile picked up boytacean 0.12.1.

moq-native — kept dev's high-level qmux integration and its Option-aware with_publisher/with_subscriber API. Deduped a both-sides-added PeerIdentity struct/impl in tls.rs (a silent auto-merge artifact).

moq-relay — kept dev's API + brought in main's unauthenticated internal listener (#1810, tcp:// + unix://). Ported internal.rs and the internal-listener smoke tests onto dev's Option-returning publisher()/subscriber() and announced()/track() API. Dropped main's cluster.root migration tests (dev removed that field entirely).

moq-mux (the big one) — hand-ported main's two features onto dev's split.rs-based importer architecture (#6419a702), keeping dev's thiserror error types instead of reverting to anyhow:

js/watch — dev had already incorporated main's "latency range with buffered playback" feature (#1620) and refactored it onto dev's API, so dev's expression was kept across all 8 files.

demo/web — hand-ported main's #1822 multi-broadcast inspector / stats dashboard onto dev's @moq/hang and @moq/watch APIs (catalog/backend output reshaping). Accepted main's deletion of the now-orphaned discover.ts.

New public API: @moq/publish Broadcast.net

The publish element's Broadcast created its Moq.Broadcast producer internally and never exposed it, so an application couldn't serve its own tracks. This adds a net signal exposing that producer (re-created per connection). A statically inserted track (net.createTrack/insertTrack) is served via the producer's fast path, bypassing the element's requested() loop.

With this, the demo's per-stream metadata now rides on a real separate meta.json track (served via net + a @moq/json Producer, advertised in the catalog's metadata list, read on the watch side off broadcast.output.active) — restoring #1822's separate-track design rather than the catalog-section workaround.

Re-merge of dev (catch-up)

dev advanced 3 commits while this PR was open, re-merged and reconciled:

Notes for review

  • Dropped tests: main's two H.264 importer-level multi-PPS tests used with_mode/decode_frame/Mode (removed in dev's refactor); the asserted behavior is now covered at the split.rs level for both H.264 and H.265.
  • One demo metric dropped: "samples decoded" (dev's Audio.Stats has no sampleCount).

Verification

  • cargo clippy --workspace --all-targets -D warnings and cargo fmt --check clean; the JS per-package type-checks and biome check pass.
  • Tests pass: moq-mux (279), moq-cli, moq-srt (7), moq-net, moq-token, moq-json, hang, moq-relay lib (124), js/watch suite, @moq/publish.
  • Not verifiable in this sandbox (not merge regressions): moq-gst/moq-video/libmoq/moq-boy need gstreamer/libva system libs that aren't installed here (post-feat(moq-video)!: make hardware encoders always-on (openh264 stays the software fallback) #1819 vaapi is always-on); the moq-relay smoke integration tests and the moq-native IPv6 dual-stack tests fail on [::] binds / QUIC client sockets, and fail identically on unmodified dev in this container.

(Written by Claude)

moq-bot Bot and others added 30 commits June 17, 2026 21:15
Co-authored-by: moq-bot[bot] <186640430+moq-bot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Luke Curley <kixelated@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…7.3 (#1790)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…1792)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: moq-bot[bot] <186640430+moq-bot[bot]@users.noreply.github.com>
… aarch64-linux (#1793)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
#1806)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…1809)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…st the last seen (#1812)

Co-authored-by: Luke Curley <luke.curley@discordapp.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Add `closed` to the pull_request types so a merge/close lands in the same
concurrency group and cancels the superseded Check build, freeing the
self-hosted runner. The job is skipped on close (it exists only to trigger
the cancellation).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ix://) (#1810)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…e cap (#1816)

Co-authored-by: Luke Curley <luke.curley@discordapp.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…ion) (#1815)

Co-authored-by: Luke Curley <luke.curley@discordapp.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Curley <kixelated@gmail.com>
)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… metadata track (#1822)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
#1820)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Curley <kixelated@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
kixelated and others added 3 commits June 21, 2026 00:32
…be (#1842)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Brings 31 commits from main into dev, resolving 40 conflicted files plus a
few silent both-sides-added duplicates. Where main added a feature on top of
code dev had since refactored, the feature was hand-ported onto dev's
architecture rather than dropped or taken wholesale.

Notable resolutions:

- CI (check.yml, flake.nix, nix/overlay.nix, rs/justfile): took main's
  cargo+sccache direction (it supersedes the crane checks dev only carried via
  an earlier merge), while preserving dev's wasm/vaapi devShell deps.
- Cargo.toml/Cargo.lock: qmux 0.2 (verified 0.2 keeps dev's high-level
  ws::Client/Server API), kept dev's moq-hls; also pulled boytacean 0.12.1.
- moq-native: kept dev's high-level qmux integration and Option-aware
  with_publisher/with_subscriber API; deduped a both-sides-added PeerIdentity
  in tls.rs.
- moq-relay: kept dev's API, added main's unauthenticated internal listener
  (#1810, tcp:// + unix://) and ported its smoke tests and internal.rs onto
  dev's Option-returning publisher/subscriber and announced()/track() API;
  dropped main's cluster.root tests (dev removed that field).
- moq-mux: hand-ported main's multi-SPS/PPS/VPS carriage (#1812) and generic
  verbatim MPEG-TS / mpegts catalog section (#1815) onto dev's split-based
  importer architecture, keeping dev's thiserror error types. moq-cli and
  moq-gst consumers updated to match (moq-gst also keeps main's
  broadcast-aligned timestamp fix).
- js/watch: dev had already ported main's buffered-playback latency feature
  (#1620) onto its API, so dev's expression was kept.
- demo/web: hand-ported main's #1822 multi-broadcast inspector / stats
  dashboard onto dev's @moq/hang and @moq/watch APIs. The metadata feature was
  re-expressed as a catalog "meta" section (dev's publish element cannot serve
  a custom track), a behavioral change from #1822's separate-track design.

Verified: cargo check --all-targets (minus moq-gst, which needs gstreamer
system libs unavailable here), clippy -D warnings, cargo fmt, biome, and the
js type-checks/tests all pass. moq-mux (279), moq-net, moq-token, moq-json,
hang, moq-cli, and moq-relay lib (124) tests pass. The only failing Rust tests
are environmental (IPv6 [::] binds and the relay smoke integration tests, which
fail identically on unmodified dev in this sandbox).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQ9o9paZnRLpYRgbyjUwFV
The publish element's `Broadcast` created its `Moq.Broadcast` producer
internally and never exposed it, so an application couldn't serve its own
tracks alongside the built-in catalog/audio/video. Expose it as a `net`
signal, (re)created on each (re)connection. A statically inserted track
(`net.createTrack`/`insertTrack`) is served via the producer's fast path, so
it bypasses the element's `requested()` loop instead of being rejected as an
unknown track.

Use it in the watch demo: the per-stream metadata now rides on a separate
`meta.json` track (advertised in the catalog's `metadata` list) served via
`net` and a `@moq/json` Producer, instead of the catalog `meta`-section
workaround. The watch inspector subscribes to it off `broadcast.output.active`.
This restores the separate-track design from the demo without the
backwards-compat `publishTrack` shim.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQ9o9paZnRLpYRgbyjUwFV
@kixelated kixelated enabled auto-merge (squash) June 21, 2026 02:49
claude added 2 commits June 21, 2026 02:52
…r catalog frame

The watch inspector read the advertised metadata track name straight off the
catalog signal, so the subscription effect tore down and recreated the
`meta.json` subscription on every catalog update (e.g. a live encoder-setting
tweak), briefly flickering the metadata panel. Derive the track name through a
memoized computed so the subscription only re-runs when the name or the active
broadcast actually changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQ9o9paZnRLpYRgbyjUwFV
dev advanced 3 commits while this PR was open (#1845 PTS-exposing TS Export +
PCR-paced SRT egress, #1847 moq-lite-05 wire sync, #1819 always-on hardware
encoders). Re-merged dev and reconciled two conflicts:

- nix/overlay.nix: kept this PR's cargo+sccache CI direction (dev's tip still
  carries the crane `moqChecks`; the cargo switch lives on main, #1821).
- rs/moq-mux/src/container/ts/export.rs: combined dev's #1845 Frame-returning
  `Export::next` (PTS/keyframe-stamped) with this PR's generic `catalog::Catalog`
  trait (main's #1815 mpegts rename). Updated the moq-cli drain helper to read
  `frame.payload` and refreshed two stale `scte35::Ext` comments.

Verified: moq-mux (279), moq-cli, moq-srt tests pass; workspace clippy -D
warnings and fmt clean (excluding the crates that need libva/gstreamer system
libs unavailable in this sandbox: moq-video/libmoq/moq-boy/moq-gst); JS
type-checks and biome clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQ9o9paZnRLpYRgbyjUwFV
@kixelated kixelated merged commit c79fded into dev Jun 21, 2026
1 check passed
@kixelated kixelated deleted the claude/merge-main-into-dev-0nb02s branch June 21, 2026 06:22
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.

4 participants