Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2f113b7
quest: claim m1/quic-qmux
kixelated Oct 21, 2026
8113269
feat(quic): a sans-IO QMux connection on the stream state machine
kixelated Oct 22, 2026
38d07fa
feat(quic): let the mux close on transport-level framing violations
kixelated Oct 22, 2026
b0a2fdf
feat(qmux): move the qmux crate in tree onto the QUIC stream state ma…
kixelated Oct 22, 2026
1b15385
refactor(tokio): run qmux sessions natively on moq-net's poll traits
kixelated Oct 22, 2026
7705211
Merge remote-tracking branch 'origin/main' into quest/m1/quic-qmux
kixelated Oct 22, 2026
d50f866
test(qmux): run the TypeScript interop against the in-tree examples
kixelated Oct 22, 2026
1634644
test(quic): the mux record writer follows QUIC's scheduler
kixelated Oct 22, 2026
ecc20ff
docs(qmux): migration notes, crate docs, and golden records
kixelated Oct 22, 2026
f906b93
ci: build the TypeScript suite when qmux changes
kixelated Oct 22, 2026
973116a
docs(qmux): name the PR in the migration notes
kixelated Oct 22, 2026
4e0f3fc
quest: finish quic-qmux
kixelated Oct 22, 2026
1d89db6
fix(qmux): keep stream resets sticky and bound record sizes
kixelated Oct 22, 2026
632bd7c
fix(qmux): refuse zero timers as invalid config
kixelated Oct 22, 2026
dabfd3c
Merge remote-tracking branch 'origin/main' into quest/m1/quic-qmux
kixelated Oct 22, 2026
93b6a40
quest: point audit-ci at the PR that restored the bench legs
kixelated Oct 22, 2026
331adc2
fix(qmux): refuse empty records and text messages, keep finish's stop
kixelated Oct 22, 2026
b303e20
Merge remote-tracking branch 'origin/main' into quest/m1/quic-qmux
kixelated Oct 22, 2026
17bf7f0
Merge remote-tracking branch 'origin/main' into quest/m1/quic-qmux
kixelated Oct 22, 2026
797a544
fix(qmux): refuse QX_PING on draft-00, resolve a relative target dir
kixelated Oct 22, 2026
6871e10
fix(qmux): keep WebSocket Pings flowing under load, refuse a failed n…
kixelated Oct 22, 2026
1f3c935
fix(qmux): accept an empty WebSocket message as a no-op
kixelated Oct 22, 2026
a35b94c
fix(quic): bound datagram retention, order a mux stream's first frame
kixelated Oct 22, 2026
e48494e
Merge remote-tracking branch 'origin/main' into quest/m1/quic-qmux
kixelated Oct 22, 2026
1bcc38d
fix(qmux): saturate peer lengths instead of truncating them
kixelated Oct 22, 2026
a7cc201
fix(qmux): refuse a peer length that does not fit usize
kixelated Oct 22, 2026
3399e1a
fix(qmux): refuse a keep-alive that expires before its first Pong
kixelated Oct 22, 2026
076f5b6
fix(quic): size mux datagrams by their encoded frame
kixelated Oct 22, 2026
5babf30
fix(qmux): refuse stream counts above QUIC's 2^60 ceiling
kixelated Oct 22, 2026
882177d
Merge remote-tracking branch 'origin/main' into quest/m1/quic-qmux
kixelated Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ jobs:
# `rs audio-devices` plays moq-audio's device tests into a private null sink.
# `rs multicast` runs the mDNS tests, which loop multicast back on the runner.
# `rs render-sw` renders through wgpu on Mesa's software Vulkan driver.
# `test qmux` runs js/qmux against the Rust qmux release, per draft.
# `test qmux` runs js/qmux against the in-tree Rust qmux, per draft.
recipe: ["gate", "rs doctest --workspace", "rs loom", "test drill-sensitivity", "rs uring", "test drain", "gh test", "test json-properties", "rs quic-sim", "test drill impaired", "rs cli-export", "rs quic-stress", "rs audio-devices", "rs multicast", "rs render-sw", "test qmux"]
include:
- recipe: rs send-depth
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/release-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ jobs:
- "rs/moq-srt/**"
- "rs/moq-stats/**"
- "rs/moq-tokio/**"
- "rs/qmux/**"
- "Cargo.toml"
- "Cargo.lock"
- "rust-toolchain.toml"
Expand Down
28 changes: 25 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ members = [
"rs/moq-v4l",
"rs/moq-video",
"rs/moq-wasm",
"rs/qmux",
"rs/uniffi-bindgen",
]
default-members = [
Expand Down Expand Up @@ -89,6 +90,7 @@ default-members = [
"rs/moq-v4l",
"rs/moq-video",
# "rs/moq-wasm", # wasm32-unknown-unknown target only
"rs/qmux",
# Maturin runs the workspace's `uniffi-bindgen` binary from the root to
# generate the Python wheel, and that only searches default members. Its
# `cli` feature keeps a plain check from compiling the generator.
Expand Down Expand Up @@ -221,7 +223,7 @@ percent-encoding = "2"
pollster = "1.0"
# default-features off to skip the fork and timeout machinery; crates opt into what they use.
proptest = { version = "1.12.0", default-features = false, features = ["std"] }
qmux = { version = "0.6.5", default-features = false }
qmux = { version = "0.7.0", path = "rs/qmux", default-features = false }
rand = "0.10.1"
rangemap = "1.8"
# default-features off so each consumer picks its crypto provider.
Expand Down
3 changes: 2 additions & 1 deletion doc/lib/rs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ links cover crates awaiting their first release.
| [moq-net](/lib/rs/moq-net) | The pub/sub layer: sessions, origins, broadcasts, tracks, groups, frames. Transport-agnostic. |
| [moq-pattern](https://docs.rs/moq-pattern) | Path patterns such as `room/**`. Re-exported by moq-net and moq-auth. |
| [moq-tokio](https://docs.rs/moq-tokio) | Connects and listens over QUIC, WebSocket, or iroh, from config or CLI flags. Its `driver` feature alone is a tokio QUIC stack without MoQ. |
| [qmux](https://docs.rs/qmux) | QUIC streams, datagrams, and flow control over TCP, TLS, WebSocket, and Unix sockets, on moq-quic's state machine. |
| [moq-sock](https://docs.rs/moq-sock) | Socket binding and CPU pinning for thread-per-core listeners. |
| [moq-ice](https://github.com/moq-dev/moq/tree/main/rs/moq-ice) | The ICE agent behind native WebRTC: drives a str0m connection over UDP, with a STUN client. |
| [moq-uring](https://docs.rs/moq-uring) | Experimental Linux io\_uring server for moq-lite. |
Expand All @@ -37,7 +38,7 @@ links cover crates awaiting their first release.
| [moq-hls](https://docs.rs/moq-hls), [moq-rtmp](https://docs.rs/moq-rtmp), [moq-srt](https://docs.rs/moq-srt), [moq-rtsp](https://github.com/moq-dev/moq/tree/main/rs/moq-rtsp), [moq-rtc](https://docs.rs/moq-rtc) | The [gateways](/bin/), as libraries you can embed with your own auth. |
| [moq-ffi](https://docs.rs/moq-ffi), [moq-c](/lib/c/) | The UniFFI core behind the language bindings, and the C ABI. |
| [moq-relay](/bin/relay/), [moq-cli](/bin/cli) | The binaries, also usable as crates. |
| [web-transport](https://github.com/moq-dev/web-transport) | The QUIC/WebTransport/qmux transports, in a sibling repository. |
| [web-transport](https://github.com/moq-dev/web-transport) | The WebTransport traits and the browser and iroh transports, in a sibling repository. |

## Quick start

Expand Down
5 changes: 4 additions & 1 deletion doc/setup/upgrade.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,16 @@ ignored; its guide says what replaces it.

- **Binaries:** [moq-relay](https://github.com/moq-dev/moq/blob/main/rs/moq-relay/MIGRATE.md), [moq-cli (`moq`)](https://github.com/moq-dev/moq/blob/main/rs/moq-cli/MIGRATE.md), [moq-gst](https://github.com/moq-dev/moq/blob/main/rs/moq-gst/MIGRATE.md), [obs-moq](https://github.com/moq-dev/moq/blob/main/cpp/obs/MIGRATE.md)
- **Bindings:** [moq-ffi (UniFFI)](https://github.com/moq-dev/moq/blob/main/rs/moq-ffi/MIGRATE.md), [moq-c (C)](https://github.com/moq-dev/moq/blob/main/rs/moq-c/MIGRATE.md), [Python](https://github.com/moq-dev/moq/blob/main/py/moq-rs/MIGRATE.md), [Go](https://github.com/moq-dev/moq/blob/main/go/wrapper/MIGRATE.md), [Swift](https://github.com/moq-dev/moq/blob/main/swift/MIGRATE.md), [Kotlin](https://github.com/moq-dev/moq/blob/main/kt/moq/MIGRATE.md), [Dart](https://github.com/moq-dev/moq/blob/main/dart/moq/MIGRATE.md), [C++](https://github.com/moq-dev/moq/blob/main/cpp/moq/MIGRATE.md)
- **Rust:** [hang](https://github.com/moq-dev/moq/blob/main/rs/hang/MIGRATE.md), [kio](https://github.com/moq-dev/moq/blob/main/rs/kio/MIGRATE.md), [moq-archive](https://github.com/moq-dev/moq/blob/main/rs/moq-archive/MIGRATE.md), [moq-audio](https://github.com/moq-dev/moq/blob/main/rs/moq-audio/MIGRATE.md), [moq-auth](https://github.com/moq-dev/moq/blob/main/rs/moq-auth/MIGRATE.md), [moq-boy](https://github.com/moq-dev/moq/blob/main/rs/moq-boy/MIGRATE.md), [moq-clock](https://github.com/moq-dev/moq/blob/main/rs/moq-clock/MIGRATE.md), [moq-clock-macros](https://github.com/moq-dev/moq/blob/main/rs/moq-clock/macros/MIGRATE.md), [moq-e2ee](https://github.com/moq-dev/moq/blob/main/rs/moq-e2ee/MIGRATE.md), [moq-flate](https://github.com/moq-dev/moq/blob/main/rs/moq-flate/MIGRATE.md), [moq-hls](https://github.com/moq-dev/moq/blob/main/rs/moq-hls/MIGRATE.md), [moq-ice](https://github.com/moq-dev/moq/blob/main/rs/moq-ice/MIGRATE.md), [moq-json](https://github.com/moq-dev/moq/blob/main/rs/moq-json/MIGRATE.md), [moq-loc](https://github.com/moq-dev/moq/blob/main/rs/moq-loc/MIGRATE.md), [moq-msf](https://github.com/moq-dev/moq/blob/main/rs/moq-msf/MIGRATE.md), [moq-mux](https://github.com/moq-dev/moq/blob/main/rs/moq-mux/MIGRATE.md), [moq-net](https://github.com/moq-dev/moq/blob/main/rs/moq-net/MIGRATE.md), [moq-nvenc](https://github.com/moq-dev/moq/blob/main/rs/moq-nvenc/MIGRATE.md), [moq-pattern](https://github.com/moq-dev/moq/blob/main/rs/moq-pattern/MIGRATE.md), [moq-quic](https://github.com/moq-dev/moq/blob/main/rs/moq-quic/MIGRATE.md), [moq-room](https://github.com/moq-dev/moq/blob/main/rs/moq-room/MIGRATE.md), [moq-rtc](https://github.com/moq-dev/moq/blob/main/rs/moq-rtc/MIGRATE.md), [moq-rtmp](https://github.com/moq-dev/moq/blob/main/rs/moq-rtmp/MIGRATE.md), [moq-sock](https://github.com/moq-dev/moq/blob/main/rs/moq-sock/MIGRATE.md), [moq-srt](https://github.com/moq-dev/moq/blob/main/rs/moq-srt/MIGRATE.md), [moq-stats](https://github.com/moq-dev/moq/blob/main/rs/moq-stats/MIGRATE.md), [moq-tokio](https://github.com/moq-dev/moq/blob/main/rs/moq-tokio/MIGRATE.md), [moq-transcode](https://github.com/moq-dev/moq/blob/main/rs/moq-transcode/MIGRATE.md), [moq-uring](https://github.com/moq-dev/moq/blob/main/rs/moq-uring/MIGRATE.md), [moq-v4l](https://github.com/moq-dev/moq/blob/main/rs/moq-v4l/MIGRATE.md), [moq-video](https://github.com/moq-dev/moq/blob/main/rs/moq-video/MIGRATE.md)
- **Rust:** [hang](https://github.com/moq-dev/moq/blob/main/rs/hang/MIGRATE.md), [kio](https://github.com/moq-dev/moq/blob/main/rs/kio/MIGRATE.md), [moq-archive](https://github.com/moq-dev/moq/blob/main/rs/moq-archive/MIGRATE.md), [moq-audio](https://github.com/moq-dev/moq/blob/main/rs/moq-audio/MIGRATE.md), [moq-auth](https://github.com/moq-dev/moq/blob/main/rs/moq-auth/MIGRATE.md), [moq-boy](https://github.com/moq-dev/moq/blob/main/rs/moq-boy/MIGRATE.md), [moq-clock](https://github.com/moq-dev/moq/blob/main/rs/moq-clock/MIGRATE.md), [moq-clock-macros](https://github.com/moq-dev/moq/blob/main/rs/moq-clock/macros/MIGRATE.md), [moq-e2ee](https://github.com/moq-dev/moq/blob/main/rs/moq-e2ee/MIGRATE.md), [moq-flate](https://github.com/moq-dev/moq/blob/main/rs/moq-flate/MIGRATE.md), [moq-hls](https://github.com/moq-dev/moq/blob/main/rs/moq-hls/MIGRATE.md), [moq-ice](https://github.com/moq-dev/moq/blob/main/rs/moq-ice/MIGRATE.md), [moq-json](https://github.com/moq-dev/moq/blob/main/rs/moq-json/MIGRATE.md), [moq-loc](https://github.com/moq-dev/moq/blob/main/rs/moq-loc/MIGRATE.md), [moq-msf](https://github.com/moq-dev/moq/blob/main/rs/moq-msf/MIGRATE.md), [moq-mux](https://github.com/moq-dev/moq/blob/main/rs/moq-mux/MIGRATE.md), [moq-net](https://github.com/moq-dev/moq/blob/main/rs/moq-net/MIGRATE.md), [moq-nvenc](https://github.com/moq-dev/moq/blob/main/rs/moq-nvenc/MIGRATE.md), [moq-pattern](https://github.com/moq-dev/moq/blob/main/rs/moq-pattern/MIGRATE.md), [moq-quic](https://github.com/moq-dev/moq/blob/main/rs/moq-quic/MIGRATE.md), [moq-room](https://github.com/moq-dev/moq/blob/main/rs/moq-room/MIGRATE.md), [moq-rtc](https://github.com/moq-dev/moq/blob/main/rs/moq-rtc/MIGRATE.md), [moq-rtmp](https://github.com/moq-dev/moq/blob/main/rs/moq-rtmp/MIGRATE.md), [moq-sock](https://github.com/moq-dev/moq/blob/main/rs/moq-sock/MIGRATE.md), [moq-srt](https://github.com/moq-dev/moq/blob/main/rs/moq-srt/MIGRATE.md), [moq-stats](https://github.com/moq-dev/moq/blob/main/rs/moq-stats/MIGRATE.md), [moq-tokio](https://github.com/moq-dev/moq/blob/main/rs/moq-tokio/MIGRATE.md), [moq-transcode](https://github.com/moq-dev/moq/blob/main/rs/moq-transcode/MIGRATE.md), [moq-uring](https://github.com/moq-dev/moq/blob/main/rs/moq-uring/MIGRATE.md), [moq-v4l](https://github.com/moq-dev/moq/blob/main/rs/moq-v4l/MIGRATE.md), [moq-video](https://github.com/moq-dev/moq/blob/main/rs/moq-video/MIGRATE.md), [qmux](https://github.com/moq-dev/moq/blob/main/rs/qmux/MIGRATE.md)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- **JavaScript:** [`@moq/auth`](https://github.com/moq-dev/moq/blob/main/js/auth/MIGRATE.md), [`@moq/boy`](https://github.com/moq-dev/moq/blob/main/js/moq-boy/MIGRATE.md), [`@moq/clock`](https://github.com/moq-dev/moq/blob/main/js/clock/MIGRATE.md), [`@moq/flate`](https://github.com/moq-dev/moq/blob/main/js/flate/MIGRATE.md), [`@moq/hang`](https://github.com/moq-dev/moq/blob/main/js/hang/MIGRATE.md), [`@moq/json`](https://github.com/moq-dev/moq/blob/main/js/json/MIGRATE.md), [`@moq/loc`](https://github.com/moq-dev/moq/blob/main/js/loc/MIGRATE.md), [`@moq/msf`](https://github.com/moq-dev/moq/blob/main/js/msf/MIGRATE.md), [`@moq/net`](https://github.com/moq-dev/moq/blob/main/js/net/MIGRATE.md), [`@moq/p2p`](https://github.com/moq-dev/moq/blob/main/js/p2p/MIGRATE.md), [`@moq/pattern`](https://github.com/moq-dev/moq/blob/main/js/pattern/MIGRATE.md), [`@moq/publish`](https://github.com/moq-dev/moq/blob/main/js/publish/MIGRATE.md), [`@moq/qmux`](https://github.com/moq-dev/moq/blob/main/js/qmux/MIGRATE.md), [`@moq/room`](https://github.com/moq-dev/moq/blob/main/js/room/MIGRATE.md), [`@moq/signals`](https://github.com/moq-dev/moq/blob/main/js/signals/MIGRATE.md), [`@moq/video`](https://github.com/moq-dev/moq/blob/main/js/video/MIGRATE.md), [`@moq/watch`](https://github.com/moq-dev/moq/blob/main/js/watch/MIGRATE.md)

## Unreleased

These land with the next breaking release.

- **WebSocket needs a QMux subprotocol** (#6231). Relays answer a WebSocket
upgrade that offers no `qmux-NN` subprotocol with 400 instead of falling back
to the legacy `webtransport` format, so upgrade such clients before relays.
- **Data-track breaks are an object with no bytes** (#5815). A hang data
track (TS private PES, sections, `m2ts`, text) marks a discontinuity with a
group of one empty object instead of a skipped group. Older consumers fail
Expand Down
4 changes: 2 additions & 2 deletions quest/m0/ffi-shutdown-backport.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ one has none. Wrapper workflows skip versions already published, so bump
each changed wrapper's human-owned version (CONTRIBUTING's Versions). Leave
`go/wrapper/VERSION` alone: CI derives Go's patch, and `drain()` is
additive. Run each binding's tests and `just test interop --all`. The
qmux credit fix is out of scope: it arrives with
[qmux on the QUIC stream state machine](/quest/m1/quic-qmux.md).
qmux credit fix is out of scope: main has it from the in-tree qmux
([moq-dev/moq#6231](https://github.com/moq-dev/moq/pull/6231)).

Public API: additive (`MoqSession.drain()` and its binding wrappers). Wire:
none.
Expand Down
1 change: 0 additions & 1 deletion quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ lite-07 stream type here.
- [Routing guide](/quest/m1/routing-guide.md) - concepts and practical outbound federation setup
- [Controlled time](/quest/m1/time/README.md) - every crate and package reads time through moq-clock or @moq/clock, with regression tests for the changed contracts
- [Own the QUIC stack](/quest/m1/quic/README.md) - quinn hard-forked in-tree as `moq-quic`, carrying BBR, reliable reset, hierarchical scheduling, peer limits, and endpoint sharding
- [qmux on the QUIC stream state machine](/quest/m1/quic-qmux.md) - qmux runs in-tree over `moq-quic`'s stream state machine, returning credit for every byte, delivering its close frame, and ending an unfinished read after its buffered data once the session closes
- [lite-07 padding](/quest/m1/lite07-padding.md) - lite-07 reserves a padding stream type that receivers read and discard, for the browser's padding probes
- [Rust request credit](/quest/m1/rs-request-credit.md) - a moq-net request fails at once without stream credit instead of waiting
- [Generated C bindings](/quest/m1/c/README.md) - C generated from moq-ffi ships as `moq-c` 0.8.0 and replaces the hand-written libmoq
Expand Down
Loading
Loading