Skip to content

moq-relay v0.15.0

Choose a tag to compare

@github-actions github-actions released this 23 Sep 20:36
· 2771 commits to main since this release
323d047

What's Changed

  • fix(js/net): bump @moq/qmux to 0.3.1 for two WebSocket fallback bugs by @fperex in #2521
  • feat(hang,mux,hls): rework the timeline as a single track of complete segments by @kixelated in #2547
  • refactor(net, relay): reshape the GOAWAY API and move migration into Reconnect by @kixelated in #2542
  • feat(js/publish): publish files by demuxing them, not by capturing a MediaStreamTrack by @kixelated in #2541
  • feat(js/publish): fan captured media out to every consumer by @kixelated in #2561
  • feat(net): start and end subscriptions and fetches at a specific frame by @kixelated in #2537
  • feat(moq-hls): serve DASH manifests from the timeline by @kixelated in #2566
  • chore: merge main into dev by @kixelated in #2576
  • feat(mux)!: leave audio group boundaries to the caller, group fMP4 by segment by @kixelated in #2568
  • refactor(net)!: carry subscription bounds as positions by @kixelated in #2569
  • feat(net): prune spliced segments, advertise drains, and treat SUBSCRIBE_START as a drop signal by @kixelated in #2575
  • fix(net): keep parked groups across a prune and revive a buried route by @kixelated in #2582
  • test(net): name the spin the misaligned-copy test actually guards by @kixelated in #2586
  • feat(demo): add a copy-logs button to the console overlay by @fperex in #2633
  • feat(moq-mux)!: rename consumer latency methods by @kixelated in #2682
  • feat(moq-net): specify the error code registries and split SessionError from StreamError by @kixelated in #2620
  • fix!: reject a catalog whose broadcast reference escapes the root by @kixelated in #2630
  • refactor(js/net)!: drop transport from ReloadProps by @kixelated in #2665
  • chore(js/net): defer version bump by @kixelated in #2691
  • feat(moq-native): make connect return a reconnecting Connection handle by @kixelated in #2614
  • fix(net): support Chromium WebTransportError constructor by @kixelated in #2698
  • fix(moq-net): name a broadcast by where its reader found it by @kixelated in #2694
  • feat(moq-ffi): sessions reconnect automatically by @kixelated in #2618
  • feat(relay): configure fallback cache retention by @kixelated in #2702
  • feat(moq-net)!: add a Latency type and standardize on latency_max by @kixelated in #2688
  • feat(native): mesh MoQ peers over the LAN with mDNS by @kixelated in #2585
  • refactor(moq-native)!: split Server into a builder and a Listener by @kixelated in #2700
  • feat(rtmp,srt,rtc): honor --latency-max on the gateway ingest paths by @kixelated in #2660
  • refactor(moq-mux)!: split the fMP4 init segment out of Fragment by @zshenker in #2692
  • fix(net): remove linger; a broadcast closes with its last source by @kixelated in #2704
  • chore: update web-transport dependencies by @kixelated in #2717
  • fix(watch)!: move rendition jitter to decoder by @kixelated in #2747
  • fix(js/net): resolve nextGroup as finished when the track closes above the cap by @kixelated in #2766
  • fix(moq-cli): follow the decode latency rename in play by @kixelated in #2777
  • fix(net): transmit groups in sequence order for ordered subscriptions by @kixelated in #2767
  • refactor(moq-mux)!: scope mp4-atom re-export to fmp4 by @kixelated in #2781
  • Merge main into dev by @kixelated in #2790
  • fix(moq-net): drop every empty subscription range, not just group 0 by @kixelated in #2791
  • fix(relay): give a peer one key across both discovery paths by @kixelated in #2793
  • refactor(net)!: require the poll-based transport interface by @kixelated in #2736
  • fix(js/net): stop dropping a prefetched group when the cap drops by @kixelated in #2796
  • feat(js/net)!: route publish and consume through Origins, share one connection per relay by @kixelated in #2705
  • fix(js/net): honor frame floor for a held group by @kixelated in #2818
  • refactor(moq-native)!: name the endpoint roles connect and listen by @kixelated in #2750
  • fix(js/net): serialize subscription updates with group pops by @kixelated in #2820
  • feat(js)!: default standalone components to enabled by @kixelated in #2872
  • Merge main into dev by @kixelated in #2852
  • fix(cli): serve TCP and Unix listeners without QUIC by @kixelated in #2879
  • Merge main into dev by @kixelated in #2883
  • refactor(libmoq)!: replace the client setters with a config struct by @kixelated in #2880
  • feat(rs)!: rename moq-native to moq-tokio by @kixelated in #2896
  • feat(libmoq)!: configure and label media renditions by @sreejon in #2831
  • feat(kio): Tasks, the poll-native FuturesUnordered by @kixelated in #2901
  • refactor(net)!: make the origin lifecycle caller-driven by @kixelated in #2897
  • feat(mux)!: carry standalone SI on per-table snapshot tracks by @kixelated in #2909
  • test(ts): reach the sparse EIT schedule and pending-version cases by @t0ms in #2920
  • fix(cli)!: refuse the renamed flags with a migration instead of ignoring them by @kixelated in #2915
  • refactor(bindings)!: split media publishing by kind by @kixelated in #2927
  • feat(moq-net): enforce the subscriber latency budget by @kixelated in #2890
  • feat(mux): proxy TDT/TOT as a latest-value SI slot by @kixelated in #2929
  • fix(moq-mux)!: let a Rendition be the only thing that writes its catalog slot by @kixelated in #2869
  • feat(ffi): decode video inside the bindings by @kixelated in #2930
  • fix(ffi)!: carry the rendition's broadcast reference across the FFI by @kixelated in #2936
  • fix(ffi): release the state when a handle is cancelled by @kixelated in #2935
  • test(mux): read the SI history with a latency budget that keeps it by @kixelated in #2948
  • docs: scope the LAN mesh to the LAN, and document the firewall case by @kixelated in #2942
  • chore: merge main into dev by @kixelated in #2951
  • fix(tokio)!: leave process signals to the owner of the accept loop by @kixelated in #2952
  • feat(go)!: publish the wrapper as moq.dev/moq by @kixelated in #2957
  • fix(js/net)!: separate session and stream errors by @kixelated in #2794
  • refactor(net)!: replace the Latency type with a plain max_age duration by @kixelated in #2955
  • feat(relay): serve QUIC from pinned per-core workers, steered by connection ID (M1) by @kixelated in #2921
  • feat(net)!: price a route warm and cold so warm relays can be ranked by @kixelated in #2925
  • fix(moq-mux): emit SI when the snapshot changes, floor the repeats by @kixelated in #2971
  • fix(tokio): refuse a listen address an existing reuseport group holds by @kixelated in #2977
  • feat(uring): add the M3 UDP batching spike by @kixelated in #3003
  • feat(js/net): enforce the subscriber latency budget by @kixelated in #2926
  • Compile the udp_tokio bench stub off Linux by @kixelated in #3010
  • refactor!: hide media backend error types by @dependabot[bot] in #3019
  • feat(hang): define segment-addressed recordings by @kixelated in #2574
  • feat(moq-tokio): identify peers by certificate fingerprint by @kixelated in #2944
  • fix(moq-tokio): enforce peer identity configuration by @kixelated in #3040
  • feat(net)!: inject an explicit Runtime for session timers and machines by @kixelated in #3007
  • feat(uring): add the thread-per-core worker skeleton by @kixelated in #3014
  • feat(net)!: sever Session from the transport by @kixelated in #3027
  • feat(kio): let Tasks hold named machines, unboxing the protocol children by @kixelated in #3028
  • feat(net)!: run moq-lite machines unboxed over any transport by @kixelated in #3031
  • feat(uring): run moq-lite sessions over quiche on the worker by @kixelated in #3033
  • feat(net)!: divide one connection's bandwidth estimate among its tracks by @kixelated in #2854
  • feat(cli)!: migrate command-line parsing to usage-rs by @kixelated in #3030
  • refactor(watch)!: let Sync own the instant latency by @kixelated in #3068
  • feat(uring): serve many QUIC connections per socket with an Endpoint by @kixelated in #3073
  • fix(net)!: enforce the loop-free hop chain where chains are built by @kixelated in #3066
  • feat(sock): extract the shared listener plumbing and steer the uring endpoint by @kixelated in #3078
  • fix(net): record the placeholder-rewrite decline like every other by @kixelated in #3091
  • feat(uring): speak WebTransport for browser peers by @kixelated in #3081
  • feat(relay): serve QUIC from io_uring workers by @kixelated in #3082
  • fix(relay): give the io_uring listener its certificate and mTLS by @kixelated in #3116
  • fix(uring): close abandoned handshakes and stop conflating H3 codes by @kixelated in #3110
  • feat: build every quiche consumer from the moq-dev/quiche fork by @kixelated in #3117
  • perf(uring): skip event sweeps between GSO trains by @kixelated in #3134
  • feat(uring): serve QUIC from quinn-proto as well as quiche by @kixelated in #3131
  • fix: restore upstream quiche dependencies by @kixelated in #3148
  • perf(uring): use fast hashes for trusted packet maps by @kixelated in #3135
  • fix(moq-tokio): check isolated feature builds by @kixelated in #3150
  • perf(uring): use fast hashes for the quinn backend's trusted maps by @kixelated in #3155
  • perf(uring): grow the UDP pools when a socket starves by @kixelated in #3133
  • fix(relay)!: make Config embeddable by deriving Args, not Cli by @kixelated in #3118
  • feat(net)!: resolve the subscribe start from max age, with Group Start as an absolute floor by @kixelated in #3158
  • feat(cli): complete broadcast, track, and capture-source names at the prompt by @kixelated in #3156
  • feat(json): let a snapshot publisher cut a group by @kixelated in #3146
  • Remove the Ended announce flag from moq-lite by @kixelated in #3034
  • refactor(net)!: make group delivery order a handle, and retire the Ordered wire field by @kixelated in #3099
  • fix(net): bound reach by the immediate successor, and collapse snapshots mid-roll by @kixelated in #3167
  • fix(nix): resolve third-party kio from crates.io by @kixelated in #3162
  • test(uring): pin down what a send staged on the way out is owed by @kixelated in #3153
  • fix(js): validate fanout queue limits by @kixelated in #3176
  • fix(publish): apply audio gain before the first frame by @kixelated in #3178
  • fix(uring): cancel staged receives on worker drop by @kixelated in #3180
  • perf(net): avoid repeated live-edge scans by @kixelated in #3196
  • feat(net): move wall-clock LRU expiry to the cache pool by @kixelated in #3169
  • fix(tokio): require explicit QUIC crypto providers by @kixelated in #3210
  • test(net): cover subscriber catch-up lifecycle by @kixelated in #3213
  • perf(net): bound group expiry scans by @kixelated in #3223
  • fix(js/net): stop Reload after terminal failure by @kixelated in #3177
  • refactor(rs)!: keep dependency errors out of public APIs by @kixelated in #3243
  • feat(mux): defer timeline publication by @kixelated in #3240
  • refactor(net)!: name the hop identifier Hop, and fix three API shapes the review found by @kixelated in #3252
  • refactor(net): finish the Hop rename in test names and log fields by @kixelated in #3264
  • feat(hang): add json and binary data tracks to the catalog by @kixelated in #3109
  • fix(net): shed a stale backlog on the ordered cursor, not just a blocking read by @kixelated in #3251
  • feat(net)!: announcements are prefix routes by @kixelated in #3225
  • fix(rtc): migrate round-trip test to routed origins by @kixelated in #3284
  • fix: complete post-merge API migrations by @kixelated in #3285
  • bench: compare relay runtime topologies by @kixelated in #3272
  • chore(quest): abandon kio wake optimization by @kixelated in #3299
  • fix: repair draft-20 merge regressions by @kixelated in #3301
  • fix(moq-mux): wait for late groups within the max age budget by @kixelated in #3270
  • fix(stream): detect a rolled log without waiting for the group to end by @kixelated in #3282
  • perf(uring): reuse egress driver allocations by @kixelated in #3292
  • docs(drafts): drop the warm discount and adoption rank from moq-lite by @kixelated in #3278
  • feat(net)!: resume subscriptions across routes sharing a first hop by @kixelated in #3312
  • perf(net): reuse cache ticks for settlement by @kixelated in #3296
  • perf(net): coalesce priority queue reorders by @kixelated in #3298
  • perf(uring): send owned stream buffers without copying by @kixelated in #3293
  • chore(quest): track the priority queue follow-ups from #3298 by @kixelated in #3318
  • chore(quest): truncate the group send order instead of rebasing it by @kixelated in #3319
  • fix(net): stamp the parallel write clock after the writers are ready by @kixelated in #3321
  • feat(tokio)!: run local futures on pinned workers by @kixelated in #3303
  • refactor(net): route datagrams in place and cover delivery end to end by @kixelated in #3306
  • chore(quest): settle the send order scalar, split out the scheduler by @kixelated in #3320
  • perf(net): unnest group locks from track delivery by @kixelated in #3295
  • feat: default QUIC backends to noq by @kixelated in #3342
  • perf(net): coalesce relay ingest notifications by @kixelated in #3294
  • chore(quest): plan the web P2P questline by @kixelated in #3390
  • fix: repair dev, which the last main merge left uncompilable by @kixelated in #3399
  • feat!: split moq-watch latency into delay + buffer, and rename --latency-max by @kixelated in #3396
  • chore(quest): plan the native playout clock by @kixelated in #3398
  • fix(moq-hls): stop rebuilding renditions on catalog estimate churn by @kixelated in #3406
  • fix(relay): make the web listeners share one socket-capturing acceptor by @kixelated in #3415
  • fix(moq-video): make moq-video compile on dev again by @kixelated in #3423
  • docs(quest): fold the stream scheduler prototype into the noq scheduler quest by @kixelated in #3430
  • feat(uring): report per-worker io_uring counters at /metrics by @kixelated in #3408
  • fix(js/net): key the publisher's TRACK_INFO cache by broadcast, not path by @kixelated in #3422
  • fix(moq-audio): give the publish-then-read tests an age budget by @kixelated in #3441
  • feat(go)!: make every blocking operation cancellable with context by @kixelated in #3412
  • feat(uring): write qlog traces from the io_uring workers by @kixelated in #3420
  • fix(net): reclaim an idle open group without waiting for a write by @kixelated in #3419
  • feat(net)!: fold serving into origin::Producer::dynamic and let broadcasts announce themselves by @kixelated in #3400
  • feat(moq-tokio): give the quiche backend the shared certificate semantics by @kixelated in #3418
  • test(moq-net): drive a late group through the IETF uni dispatch loop by @kixelated in #3437
  • refactor(moq-sock)!: centralize reuseport group formation by @kixelated in #3414
  • feat(relay)!: add --auth-api-mode proxy, where the endpoint decides by @kixelated in #3044
  • docs: abandon fMP4 export timestamp rebasing quest by @kixelated in #3451
  • docs(drafts): specify standalone pattern advertisements and cluster routing by @kixelated in #3457
  • fix(ffi)!: carry Opus frame durations in microseconds by @kixelated in #3410
  • feat(moq-tokio): expose the QUIC flow-control windows by @kixelated in #3446
  • fix(moq-tokio): default the GOAWAY redirect policy to same-host by @kixelated in #3448
  • fix(js/net): send the stream code a locally raised error means by @kixelated in #3449
  • feat(net): add path patterns to moq_net::path and @moq/net by @kixelated in #3458
  • fix(moq-hls): bind a named sibling rendition when it is created by @kixelated in #3445
  • fix(tokio): compile every subset of the transport features by @kixelated in #3439
  • fix(moq-net): map stream reset codes to the negotiated moq-transport draft by @kixelated in #3450
  • fix(net): commit an unused-driven track teardown atomically by @kixelated in #3455
  • test(obs): put the libmoq stubs in the merge gate by @kixelated in #3463
  • refactor(tokio): one abort-on-drop guard per crate instead of five by @kixelated in #3472
  • fix(uring): name the backend crate directly in the connection tests by @kixelated in #3502
  • fix(moq-relay): judge credential expiry against the deadline, not a span by @kixelated in #3503
  • feat(cli): a real playout clock for moq play, with a --delay offset by @kixelated in #3528
  • fix(publish)!: restore Firefox hardware encoding and scale screen sources by @kixelated in #3535
  • fix(moq-net): send registered moq-transport request error codes by @kixelated in #3531
  • docs(quest): groom m1 against dev and keep only what the merge needs by @kixelated in #3564
  • fix(moq-mux)!: retain publisher burst jitter and reject invalid catalog edits by @kixelated in #3513
  • fix(moq-mux)!: make an fMP4 export fragment a group, on every track by @kixelated in #3573
  • docs(quest): plan the LAN app id, one LAN mesh, and the relay verb by @kixelated in #3590
  • docs(hang): specify range-addressed archive recording objects by @kixelated in #3571
  • feat(tokio): support pinned connection targets by @kixelated in #3595
  • feat(hang)!: empty frames close the previous frame's duration by @kixelated in #3575
  • docs(quest): fold gap discontinuity into the monotonic timeline by @kixelated in #3611
  • docs(quest): groom m0 into release blockers and m1 into merge gates by @kixelated in #3628
  • test(smoke): detect a leaked player that reuses a pooled transport by @kixelated in #3610
  • feat(cli): accept several adaptive import stages on one connection by @kixelated in #3578
  • fix(moq-stats): keep a departed node's traffic in the merged total by @kixelated in #3625
  • feat(net): createBroadcast, announce(route), and a dynamic handle by @kixelated in #3581
  • feat(relay): merge config with recorded provenance by @kixelated in #3587
  • feat(relay)!: construct the cluster origin once by @kixelated in #3582
  • feat(moq-net): assign NOT_FOUND, OLD, and EVICTED stream codes by @kixelated in #3586
  • fix(moq-tokio): hold feature-extreme builds to -D warnings by @kixelated in #3584
  • feat(hang)!: replace the catalog timeline with archive by @kixelated in #3612
  • fix(hls): rebind a replaced sibling instead of serving its old rows by @kixelated in #3620
  • feat(moq-ffi): expose the reconnect epoch and QUIC stream cap by @kixelated in #3627
  • feat(net)!: collapse Reload and Shared into one Connection class by @kixelated in #3614
  • feat(hang): publishers set stalled on lagging video renditions by @kixelated in #3630
  • feat(net)!: split a connection's send estimate among JS publishers by @kixelated in #3616
  • fix(watch): handle stream resets at playback boundaries by @kixelated in #3580
  • feat(mux): passthrough imports reserve peak-hold bitrate by @kixelated in #3617
  • feat(tokio)!: partition LAN discovery by application by @kixelated in #3621
  • feat(archive): store versioned recording objects by @kixelated in #3613
  • feat(ffi)!: follow the connection's bandwidth share by @kixelated in #3622
  • feat(moq-net)!: abort an oversized group instead of shedding its head by @kixelated in #3585
  • feat(ffi)!: align create_broadcast, announce, and dynamic across bindings by @kixelated in #3577
  • feat(ffi)!: preserve session and stream protocol error details by @kixelated in #3615
  • feat(e2ee): add the moq-e2ee-01 profile and shared vectors by @kixelated in #3629
  • feat(pattern): extract matcher into moq-pattern and @moq/pattern by @kixelated in #3631
  • docs(quest): abandon JSON/binary wrapper lifecycle by @kixelated in #3637
  • fix(net)!: recover a Connection by replacing its URL after auth failure by @kixelated in #3636
  • docs(quest): abandon publisher finish ownership by @kixelated in #3646
  • fix(signals)!: accept any conforming Getter as a readable input by @kixelated in #3639
  • feat(json)!: give JSON and binary wrappers a single options object by @kixelated in #3640
  • docs(quest): borrow publisher finish so abort can follow by @kixelated in #3650
  • fix(ffi): let group and datagram reads progress independently by @kixelated in #3645
  • fix(net)!: refuse unencodable timescale and track delivery properties by @kixelated in #3643
  • feat(relay): mesh CLI and relay LAN peers through Cluster by @kixelated in #3648
  • feat(ffi)!: fail configuration setters that cannot apply by @kixelated in #3642
  • fix(ffi): keep the lane guard alive for the whole read by @kixelated in #3651
  • fix(json)!: fallible modify(), abort the track when a dropped edit fails by @kixelated in #3644
  • feat(net)!: advertise wildcard routes with Pattern events by @kixelated in #3649
  • quest: auth API to m1, IETF on the ring, wildcard docs by @kixelated in #3658
  • docs(quest): move A/V clock from m1 to m2 by @kixelated in #3659
  • docs(quest): scope parallel M2 work and pre-release API groundwork by @kixelated in #3652
  • feat(net)!: make reader group and frame limits explicit by @kixelated in #3647
  • feat(net)!: rename writeDatagram to insertDatagram by @kixelated in #3666
  • test(net): prove anonymous publisher handoff by @kixelated in #3662
  • docs(quest): keep aggregate closure counters monotonic by @kixelated in #3668
  • docs(quest): plan SRT rejection reasons and track priority scoping by @kixelated in #3667
  • docs: path patterns and wildcard advertisements by @kixelated in #3661
  • feat(e2ee): add the Rust moq-e2ee-01 core by @kixelated in #3665
  • feat(libmoq)!: select decoded pixel format and size from C by @kixelated in #3674
  • feat(relay)!: own listeners and workers for embedders by @kixelated in #3638
  • feat(ffi)!: replace MoqAudioCodec enum with opus() object by @kixelated in #3671
  • test(libmoq): run the C decoder fixture outside cargo test by @kixelated in #3691
  • fix(ffi): keep the first-frame cursor across empty groups and cancel by @kixelated in #3641
  • feat(ffi)!: carry the route cold cost through MoqRoute by @kixelated in #3669
  • feat(auth): moq-auth and @moq/auth own the contract and the token by @kixelated in #3684
  • feat(auth): moq auth serve is the reference auth server by @kixelated in #3686
  • docs(e2ee): moq-e2ee-00 with a path epoch, plus the core reshape quests by @kixelated in #3690
  • quest(m1): audit the dev API and plan the release gates by @kixelated in #3700
  • feat(relay): admit every session through a moq-auth lease by @kixelated in #3688
  • chore(quest): joining FETCH for pre-draft-20 peers by @kixelated in #3701
  • quest: track the synchronous MoqServer close by @kixelated in #3716
  • chore: merge main into dev by @kixelated in #3726
  • feat(tokio)!: rename ConnectionStatsReader to connection::Monitor by @kixelated in #3705
  • docs(drafts): note that each draft is AI generated from the implementation by @kixelated in #3728
  • chore(quest): drop the external API proof gate by @kixelated in #3709
  • docs(drafts): add the AI attribution note to the e2ee and pattern drafts by @kixelated in #3729
  • draft(flate): specify group-scoped DEFLATE as an IETF draft by @kixelated in #3715
  • feat(net)!: name stats counter edges started and ended by @kixelated in #3712
  • feat(js)!: mirror Rust names in @moq/net and @moq/pattern by @kixelated in #3710
  • feat(hang)!: timelines only move forward by @kixelated in #3711
  • feat(drafts): specify the MPEG-TS catalog extension and carry it over MSF by @kixelated in #3720
  • feat(ffi)!: use microseconds and matching origin verbs by @kixelated in #3713
  • feat(net): join pre-draft-20 peers with Largest Object plus FETCH by @kixelated in #3727
  • feat(tokio)!: own the worker split group by @kixelated in #3673
  • feat(ffi)!: drop MoqCancel; Go cancels through context.Context by @kixelated in #3723
  • feat!: refuse released spellings and drop unused deprecated APIs by @kixelated in #3719
  • feat(relay): put the client's address on the conn and ws spans by @gquintard in #3706
  • feat(hang)!: one continuous broadcast clock at the catalog root by @kixelated in #3675
  • feat(json)!: Config means the same thing in json and binary by @kixelated in #3718
  • feat(relay): put the moq-auth session id on the ws span by @kixelated in #3736
  • feat(net)!: one name per announce, request, and origin config concept by @kixelated in #3725
  • feat(net)!: scope origins with pattern unions by @kixelated in #3672
  • feat!: borrow publisher finish so abort can still run by @kixelated in #3714
  • quest(m2): plan the intra-refresh GOPs questline by @kixelated in #3738
  • feat(net)!: rank anonymous hop chains last by @kixelated in #3724
  • fix(obs): let each dock tab scroll instead of forcing the dock's height by @kixelated in #3732
  • doc: show GitHub stars and Discord members in the navbar by @kixelated in #3677
  • fix(msf): compile the extension collision check in release builds by @kixelated in #3733
  • fix(nix): give the moq-cli check phase a trust store by @kixelated in #3734
  • feat(relay): let the embedder admit sessions in process by @kixelated in #3735
  • feat(relay)!: public modules and typed cluster peer config by @kixelated in #3670
  • quest(m2): plan the WebSocket to QUIC upgrade questline by @kixelated in #3750
  • feat(auth)!: the lease reports what it ended with, and the relay Lease owns the recheck by @kixelated in #3739
  • fix(relay): compile the io_uring listener after the auth module move by @kixelated in #3749
  • fix(hang): refuse a malformed text catalog section in JS too by @kixelated in #3740
  • feat(net): negotiate the cluster extension with HOP_ID by @kixelated in #3747
  • feat(net)!: register the four placeholder stream codes by @kixelated in #3742
  • fix(smoke): build the Go client without VCS stamping by @kixelated in #3754
  • test(mux): stop copies_share_one_epoch racing the clock by @kixelated in #3752
  • quest: plan the follow-ups from the m0 and m1 spawn run by @kixelated in #3753
  • feat(native): default the QUIC backend to noq by @kixelated in #3757
  • quest(m1): move the one-auth-path quest onto the dev line by @kixelated in #3751
  • feat!: name every rate estimate estimated_*_rate by @kixelated in #3744
  • fix(libmoq): build on the noq backend like the rest of dev by @kixelated in #3758
  • fix(tokio): fail a connect on auth only once every transport has by @kixelated in #3741
  • fix(js/net): a rejected request skips the route that refused it by @kixelated in #3756
  • feat(rtmp): report the connect tcUrl on a publish or play request by @kixelated in #3743
  • quest(m2): drop the link to the landed connect auth race quest by @kixelated in #3763
  • quest(m2): plan network-only bindings and release size hygiene by @kixelated in #3761
  • feat(net)!: fold the session placeholders into PROTOCOL_VIOLATION by @kixelated in #3755
  • quest(m2): plan C++ and C# bindings generated from moq-ffi by @kixelated in #3765
  • quest(m2): plan a pushed re-check for live sessions by @kixelated in #3764
  • quest(m2): plan clean host exit for libmoq/OBS and Kotlin/JVM by @kixelated in #3768
  • quest: plan the dev-to-main API review follow-ups by @kixelated in #3760
  • feat(net)!: reprice a PUBLISH_NAMESPACE with REQUEST_UPDATE by @kixelated in #3762
  • quest(m1): move session revalidate onto the dev line by @kixelated in #3767
  • fix(ffi): stop the runtime thread at Python exit so it never dies mid-callback by @kixelated in #3766
  • feat(tokio)!: settle moq-tokio names under their modules by @kixelated in #3745
  • feat(libmoq): track demand and dynamic track requests by @kixelated in #3748
  • quest(m2): rewrite P2P as product work and plan the one-port demux by @kixelated in #3772
  • feat(net)!: announce prefixes on every wire; consumers read paths by @kixelated in #3770
  • feat(net)!: slim the moq-net public surface by @kixelated in #3779
  • feat(auth)!: one type per contract concept by @kixelated in #3776
  • fix(net): drop origin source track when last reader leaves by @kixelated in #3777
  • feat(relay): push a re-check to live sessions by @kixelated in #3778
  • fix(net): emit ReloadDelay and ReloadStatus in published types by @kixelated in #3775
  • feat(auth)!: reshape @moq/auth around Key and KeySet by @kixelated in #3773
  • fix(auth): end a session when a re-check no longer grants by @kixelated in #3774
  • fix(net): wake the demand aggregate when its widest subscriber changes by @kixelated in #3785
  • chore(ci): add Muse Spark PR reviewer side-by-side with Codex by @kixelated in #3786
  • docs: slim agent guidance and sync rules by @kixelated in #3787
  • quest(e2ee): plan the opaque broadcast path from #3717 by @kixelated in #3782
  • quest(m2): plan the TS mux-rate quest from #3731 by @kixelated in #3781
  • quest(m1): plan the Admissions fold and route cost constructors by @kixelated in #3783
  • fix(moq-mux): rejoin fenced TS tracks once the program clock passes them by @kixelated in #3784
  • chore(quest): abandon JSON config unification by @kixelated in #3780
  • fix(net): every malformed REQUEST_UPDATE is a protocol violation in js by @kixelated in #3771
  • quest(quic): one backend, a noq fork, and the transport roadmap by @kixelated in #3789
  • docs(quest): plan administrative routing cost domains by @kixelated in #3788
  • quest(perf): plan io_uring enter and wake batching by @kixelated in #3790
  • chore(net): format the merged track test by @kixelated in #3791
  • quest(quic): propose BBR3 as noq's default controller by @kixelated in #3792
  • feat(net)!: scope origins with any pattern union and report announce matches by @kixelated in #3746
  • feat!: merge dev into main by @kixelated in #3793
  • quest(quic): correct the ECN plan; noq already does classic ECN by @kixelated in #3796
  • fix(ci): repair nightly and meta-review failures by @kixelated in #3799
  • chore(deps-dev): bump the uv group with 2 updates by @dependabot[bot] in #3806
  • chore(deps): bump the gradle group in /kt with 3 updates by @dependabot[bot] in #3809
  • chore(deps): bump the github-actions group with 3 updates by @dependabot[bot] in #3810
  • chore(deps): bump the cargo group with 20 updates by @dependabot[bot] in #3812
  • quest(video): plan GPU-only CARLA media support by @kixelated in #3808
  • fix(net): retain spliced warm cache by @kixelated in #3814
  • quest(quic): split ECN into the uring fix, a study, and L4S by @kixelated in #3820
  • feat(net): simplify JavaScript API by @kixelated in #3815
  • refactor(js)!: unify watch and publish APIs by @kixelated in #3817
  • refactor(relay): route auth through admissions by @kixelated in #3800
  • refactor(tokio): make API shapes type-safe by @kixelated in #3816
  • fix(hls): advertise only playable renditions by @kixelated in #3824
  • feat(hang)!: unify catalog APIs by @kixelated in #3813
  • refactor(net): expose route cost fields by @kixelated in #3802
  • feat(libmoq)!: finalize release API by @kixelated in #3819
  • feat(net)!: simplify origin scoping by @kixelated in #3804
  • feat(gateway)!: align embedding APIs by @kixelated in #3818
  • refactor(quic)!: keep only the noq backend by @kixelated in #3811
  • chore(quest): retire completed announce event work by @kixelated in #3797
  • docs: plan moq installer and public install URL by @kixelated in #3795
  • quest: ship a prebuilt Linux obs-moq bundle by @kixelated in #3794
  • docs(quest): plan media API stabilization before 0.1 by @kixelated in #3803
  • docs(quest): settle 0.0.x package APIs before release by @kixelated in #3801
  • docs(libmoq): demand no longer waits for the origin cache linger by @pwrwpw in #3827
  • refactor(net)!: drive time and cache cleanup explicitly by @kixelated in #3825
  • feat(uring): carry ECN on the io_uring UDP path by @kixelated in #3821
  • refactor(net)!: return the next deadline from driver polls by @kixelated in #3828
  • refactor(net)!: name path roles without new types by @kixelated in #3826
  • Update index.md by @HenzMiguel in #3847
  • fix(moq-audio,moq-video): build capture and Android again, and gate both on PRs by @Frando in #3850
  • chore: move PR workflow skills into repository by @kixelated in #3853
  • refactor(moq-sock)!: complete groups before serving by @kixelated in #3832
  • fix(alert): handle Bun YAML on-to-true coercion by @kixelated in #3854
  • feat(e2ee): derive opaque broadcast paths by @kixelated in #3830
  • refactor(archive)!: use inclusive group ranges by @kixelated in #3829
  • docs(quest): scope the v4l fork that unblocks capture-by-default by @kixelated in #3852
  • chore(quest): mirror branches in the quest tree by @kixelated in #3855
  • feat(moq-net): add moq-transport draft-22 (moqt-22) by @kixelated in #3858
  • refactor(archive)!: scope listing queries to recordings by @kixelated in #3833
  • feat(moq-mux): record the TS mux rate and pad export to it by @kixelated in #3831
  • fix(video)!: confine synchronous codecs to their thread by @kixelated in #3837
  • feat(video): import retained Vulkan images into CUDA by @kixelated in #3836
  • fix(nvenc)!: retain resources through completion by @kixelated in #3835
  • quest(quic): plan BBR correctness fixes and Google comparison by @kixelated in #3859
  • quest(future): restore the Go docs' vanity paths after the mirrors republish by @kixelated in #3851
  • fix(relay): match the uring driver's terminal error by @kixelated in #3860
  • fix(video): convert CUDA device UUID bytes portably by @kixelated in #3861
  • quest(quic): plan app-limited BBR fixes and media experiments by @kixelated in #3862
  • fix(moq-nvenc): roll back failed resource mapping by @kixelated in #3834
  • refactor(audio)!: remove ineffective FEC flag by @kixelated in #3841
  • chore(just): consolidate full-suite actions by @kixelated in #3823
  • fix(nvenc)!: make driver loading fallible by @kixelated in #3838
  • feat(ffi)!: scope announcement streams with patterns by @kixelated in #3856
  • refactor(mux)!: share media rate policy by @kixelated in #3840
  • refactor(video)!: type frame conversions by @kixelated in #3846
  • Make media backends optional by @kixelated in #3839
  • feat: preserve video capture timing by @kixelated in #3849
  • Unify mux track and rendition ownership by @kixelated in #3857
  • refactor(audio)!: expose demand without track authority by @kixelated in #3842
  • chore(quest): retire the published cluster -01 and merged dev quests by @kixelated in #3872
  • fix(just): pass smoke arguments to the shebang recipe by @kixelated in #3870
  • feat(e2ee)!: implement moq-e2ee-00 with epoch-scoped generations by @kixelated in #3863
  • refactor(audio)!: separate configuration contracts by @kixelated in #3843
  • refactor(uring)!: derive worker and steering identity from the socket by @kixelated in #3865
  • feat(video)!: type the group configuration and make cut fallible by @kixelated in #3876
  • fix(audio)!: enforce exclusive AEC ownership by @kixelated in #3844
  • Report dropped playback sample frames by @kixelated in #3845
  • feat(video): GPU color conversion and NVENC for imported Vulkan frames by @kixelated in #3869
  • fix(video): compile the macOS capture backends after the Frame reshape by @kixelated in #3877
  • fix(just): pass smoke args through to smoke.sh by @kixelated in #3873
  • fix(moq-gst): Drain subscriptions whose track was removed from catalog by @kidq330 in #3864
  • refactor(video)!: separate decoder output from subscription policy by @kixelated in #3875
  • chore(quest): groom next after the dev merge by @kixelated in #3868
  • chore(quest): complete the media release review by @kixelated in #3878
  • fix(mux): read the inline SI form every published moq-cli writes by @kixelated in #3871
  • fix(moq-json): a snapshot edit fails on a shape mismatch instead of seeding a default by @kixelated in #3874
  • quest: plan GPU pool reservations and the io_uring handshake flush by @kixelated in #3880
  • perf(net): build a route's prefix claim once, not per cursor visit by @kixelated in #3881
  • feat(quic)!: build on moq-noq, the MoQ fork of noq by @kixelated in #3866
  • perf(net): key the origin route table by prefix by @kixelated in #3882
  • feat(json): edit a snapshot value through a closure by @kixelated in #3889
  • test(video): validate the GPU conversion and NVENC path on NVIDIA hardware by @kixelated in #3890
  • perf(net): wake a front only when a covering route changes by @kixelated in #3884
  • fix(dart): refresh the moq lockfile so --enforce-lockfile resolves by @kixelated in #3894
  • quest: plan the origin failover state machine by @kixelated in #3891
  • test(bindings): prove the Opus frame duration and throwing setters each binding exposes by @kixelated in #3885
  • feat(moq-ffi): the decode pixel format reaches every uniffi binding by @kixelated in #3892
  • test(moq-gst): decide the cancelled pump race instead of sleeping on it by @kixelated in #3898
  • fix(dart): stop pretending Dependabot covers dart/moq by @kixelated in #3896
  • fix(srt): keep the listener alive until a rejected caller sees the verdict by @kixelated in #3887
  • chore(deps): bump the github-actions group with 2 updates by @dependabot[bot] in #3903
  • feat(bindings): close the additive half of binding parity by @kixelated in #3888
  • chore(deps): bump the cargo group with 3 updates by @dependabot[bot] in #3905
  • chore(deps): bump the bun group across 4 directories with 15 updates by @dependabot[bot] in #3902
  • feat(video): fork v4l in-tree with checked-in V4L2 bindings by @kixelated in #3867
  • refactor(rs): read constant-size chunks with as_chunks by @kixelated in #3899
  • fix(moq-mux): keep a group's last frame duration at its own scale by @kixelated in #3906
  • build: pin rust 1.98.1 so macOS 27 loads our stripped dylibs by @kixelated in #3904
  • fix(moq-json): a lost snapshot group is not fatal by @kixelated in #3907
  • feat(net): origin failover as a state machine by @kixelated in #3895
  • chore(quest): plan allocation-free binary stats and moq-json churn cuts by @kixelated in #3917
  • chore(rs): report the crate version, drop the git-describe build scripts by @kixelated in #3912
  • perf(json): skip the snapshot baseline parse when deltas are disabled by @kixelated in #3916
  • fix(tokio): start jemalloc sampling on demand instead of at startup by @kixelated in #3919
  • test(net): sweep duplicate routes at one prefix by @kixelated in #3922
  • fix(moq-ffi): cancel waits for the listening socket to close by @kixelated in #3914
  • fix(moq-relay): compile the io_uring feature in the per-PR check by @kixelated in #3911
  • quest: plan local announcements and front-side request parking by @kixelated in #3921
  • docs(quest): plan moq ls and moq fetch for inspecting a relay by @kixelated in #3915
  • refactor(net): routed_broadcast waits on the watch alone by @kixelated in #3901
  • test(net): sweep the idle serve poll over a session's routes by @kixelated in #3924
  • chore(moq-ffi): move the bindgen CLI out of the library build by @kixelated in #3908
  • feat(moq-net): reset an unanswered control request with CONTROL_TIMEOUT by @kixelated in #3913
  • quest(audio-jitter-target): the audio playout target line by @kixelated in #3883
  • test: keep a failing harness run and its browser trace by @kixelated in #3909
  • fix: tighten release APIs and preserve Lite compatibility by @kixelated in #3933
  • quest: allocation-free binary stats by @kixelated in #3918
  • feat(watch): add headless Player pipeline by @kixelated in #3931
  • docs(lib): document connection stats on every binding page by @kixelated in #3910
  • fix(smoke): make media log names portable by @kixelated in #3936
  • perf(json): bound snapshot update allocations by @kixelated in #3929
  • fix(net): announce local broadcasts on origin cursors by @kixelated in #3928
  • docs(quest): retire local announcements roadmap entry by @kixelated in #3930
  • feat(relay): expose reusable embedding lifecycle and test fixture by @kixelated in #3927
  • feat(net)!: promote moq-lite-06 ALPN on main by @kixelated in #3941
  • chore: remove Meta Muse Spark review workflow by @kixelated in #3942
  • chore: release by @moq-bot[bot] in #3730
  • fix(auth): enable tokio macros feature for select! by @kixelated in #3957

New Contributors

Full Changelog: moq-relay-v0.14.18...moq-relay-v0.15.0