Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 3 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,9 @@ For non-trivial tasks, file an issue or offer to run `/quest-plan`.

# Forks

[moq-dev/noq](https://github.com/moq-dev/noq) publishes `moq-noq*`, the QUIC stack every published MoQ crate builds on; iroh keeps upstream noq.
Its `moq-sync` workflow merges n0-computer/noq weekly as a PR; review it like any other, and `PARENT` names the upstream commit each release includes.
A carried change lists its upstream PR, or the reason it has none, in the fork PR.
For an advisory against noq or Quinn, compare the pinned release's `PARENT` with the fixing upstream commit, then sync, release the fork, and bump the pin here.
`rs/moq-quic` is our hard fork of quinn, the QUIC stack MoQ builds on; iroh keeps upstream noq.
It never merges upstream: fixes are cherry-picked by hand, and each carried change is listed in its README with its upstream PR, or the reason it has none.
For an advisory against Quinn, follow the advisory triage in [`rs/moq-quic/README.md`](rs/moq-quic/README.md).

# Releases

Expand Down
114 changes: 10 additions & 104 deletions Cargo.lock

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

12 changes: 4 additions & 8 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ mdns-sd = { version = "0.21", features = ["async"] }
moq-archive = { version = "0.0.11", path = "rs/moq-archive" }
moq-audio = { version = "0.1.10", path = "rs/moq-audio", default-features = false }
moq-auth = { version = "0.2.1", path = "rs/moq-auth" }
moq-clock = { version = "0.11.0", path = "rs/moq-clock" }
moq-clock-macros = { version = "0.1.0", path = "rs/moq-clock/macros" }
moq-flate = { version = "0.2.0", path = "rs/moq-flate" }
moq-hls = { version = "0.5.11", path = "rs/moq-hls", default-features = false }
Expand All @@ -157,14 +158,13 @@ moq-loc = { version = "0.2.19", path = "rs/moq-loc" }
moq-msf = { version = "0.5.1", path = "rs/moq-msf" }
moq-mux = { version = "0.10.11", path = "rs/moq-mux" }
moq-net = { version = "0.3.10", path = "rs/moq-net" }
# The MoQ fork of noq (moq-dev/noq). iroh keeps upstream noq, so a build with the
# iroh feature carries both stacks.
moq-noq-proto = { version = "2.0.5", default-features = false }
# NVENC bindings, forked from ViliamVadocz/nvidia-video-codec-sdk to dlopen the
# driver at runtime. Compiles on any platform (macOS included) but only actually
# used by moq-video on Linux.
moq-nvenc = { version = "0.1.2", path = "rs/moq-nvenc" }
moq-pattern = { version = "0.1.2", path = "rs/moq-pattern" }
# default-features off so each consumer picks its crypto provider.
moq-quic = { version = "0.1.0", path = "rs/moq-quic", default-features = false }
moq-relay = { version = "0.17.2", path = "rs/moq-relay", default-features = false }
moq-rtc = { version = "0.3.12", path = "rs/moq-rtc" }
moq-rtmp = { version = "0.3.11", path = "rs/moq-rtmp" }
Expand All @@ -178,7 +178,7 @@ moq-tokio = { version = "0.19.23", path = "rs/moq-tokio", default-features = fal
# VAAPI is opt-in everywhere; its decoder is hardware-validated, while its
# encoder is not yet.
moq-transcode = { version = "0.1.10", path = "rs/moq-transcode", default-features = false }
# default-features off (the noq backend) so the consumer picks which QUIC
# default-features off (the `quic` backend) so the consumer opts into the QUIC
# stack the io_uring path compiles; cargo features are additive, so a default-on
# backend could not be opted out of.
moq-uring = { version = "0.0.12", path = "rs/moq-uring", default-features = false }
Expand Down Expand Up @@ -240,10 +240,6 @@ usage = { package = "usage-rs", version = "6.11.1" }
uuid = { version = "1.26", features = ["v7"] }
web-async = { version = "0.1.5", features = ["tracing"] }
web-transport-iroh = "0.8.3"
# default-features off so the QUIC crypto provider is chosen by moq-tokio's
# aws-lc-rs / ring features.
# The WebTransport adapter released with moq-noq, from the same repository.
web-transport-moq = { version = "2.0.5", default-features = false }
web-transport-proto = "0.6"
web-transport-trait = "0.5"
web-transport-wasm = "0.8"
Expand Down
2 changes: 1 addition & 1 deletion doc/bin/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ Playback is behind the `play` feature, since it pulls in windowing and
audio-device dependencies:

```bash
cargo install moq-cli --no-default-features --features "noq,websocket,play"
cargo install moq-cli --no-default-features --features "quic,websocket,play"
```

`moq play` skips disabled renditions. If none are enabled, it waits for a later catalog. Disabling the current rendition stops it and selects an enabled replacement.
Expand Down
2 changes: 1 addition & 1 deletion doc/bin/relay/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ io_uring = false # Drive them with io_uring instead of tokio
```

Packets are steered by connection ID, so a client that migrates stays with its
worker. `workers` needs the `noq` feature. Every worker and the TLS stream
worker. `workers` needs the `quic` feature. Every worker and the TLS stream
listener serve one shared identity, generated or file-backed, so a certificate
rotation reaches them together and `/certificate.sha256` stays accurate.

Expand Down
7 changes: 7 additions & 0 deletions doc/setup/upgrade.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ These land with the next breaking release, not the 2026-09-23 train.
with `Catalog.Video.ranked(renditions)`. `Catalog.Audio.ranked(renditions)`
orders audio by enabled state, bitrate, sample rate, channel count, and name.
Both helpers put disabled renditions last.
- **The `noq` cargo feature is `quic`.** Rename it wherever you enable it on
moq-tokio, moq-uring, moq-relay, moq-cli, or the other crates that forward
it. The QUIC stack is now MoQ's own `moq-quic` rather than the `moq-noq`
crates. In Rust, `moq_tokio::noq::Error` is `moq_tokio::quic::Error`, and
`moq_tokio::Error::Noq` is `moq_tokio::Error::Quic`. A qlog directory gets one
file per endpoint instead of one per connection; on io\_uring workers, one per
endpoint and one per dial.
- **moq-tokio config durations are optional.** Wrap durations in `Some(...)` for
connect `race`, `resolution_delay`, and `timeout`; listen `timeout`; QUIC
`idle_timeout` and `keep_alive`; backoff `initial`, `max`, and `timeout`;
Expand Down
5 changes: 1 addition & 4 deletions quest/m1/p2p/native-quic.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ Decided with the maintainer on 2026-10-13:
candidates through the module [webrtc](/quest/m1/p2p/webrtc.md) lifts out
of `moq-rtc`, with host candidates, `.local` resolution, and the STUN
Binding client; don't copy it.
- QUIC is `moq-quic`, fed datagrams from the nominated pair, so this waits
on [the switch](/quest/m1/quic/fork/switch.md) instead of building on
`moq-noq` and porting it.
- QUIC is `moq-quic`, fed datagrams from the nominated pair.
- Authentication: each side generates a self-signed certificate and sends
its SHA-256 fingerprint in its offer or answer, as DTLS fingerprints ride
in SDP. Both sides pin it with the existing `tls.fingerprint` check. MoQ
Expand Down Expand Up @@ -61,7 +59,6 @@ covers LAN and NAT pairs between two `moq-cli --p2p` nodes.

## Required

- [Switch MoQ onto moq-quic](/quest/m1/quic/fork/switch.md) - `moq-quic` replaces `moq-noq` in moq-tokio
- [UDP demux](/quest/m1/p2p/udp-demux.md) - the classifier that splits STUN from QUIC
- [Native data channel transport](/quest/m1/p2p/webrtc.md) - the shared ICE gathering module
- [Signaling and policy](/quest/m1/p2p/signal.md) - the offer schema and roster this extends
5 changes: 2 additions & 3 deletions quest/m1/p2p/udp-demux.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@ one. Bound queues per stack with a per-source drop rather than unbounded
growth; report drops as a counter.

QUIC: the server takes the virtual socket through whatever the QUIC stack
accepts: noq's `new_with_abstract_socket` today, `moq-quic`'s fed datagrams
after [the switch](/quest/m1/quic/fork/switch.md). Build on whichever has
landed rather than both. QUIC-bit greasing is already off for sharded endpoints.
accepts: the driver's `new_with_abstract_socket` on `moq-quic`. QUIC-bit
greasing is already off for sharded endpoints.

STUN: an ICE connectivity check is a Binding request carrying USERNAME, so
it goes to the WebRTC hook, whose mux reads the local ufrag from it. A
Expand Down
10 changes: 3 additions & 7 deletions quest/m1/quic/fork/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Hard-fork quinn into the monorepo as moq-quic
# [XS] Hard-fork quinn into the monorepo as moq-quic

## Goal

Expand Down Expand Up @@ -55,12 +55,8 @@ them:
This README's own work: delete moq-dev/noq's `moq-sync.yml` and mark its
README frozen. Advisory triage is documented in `rs/moq-quic/README.md`.
Every carried change in moq-dev/noq's `CHANGELOG-MOQ.md`
is either ported by a child quest or recorded as not applicable in the
[switch](/quest/m1/quic/fork/switch.md) PR.

## Required

- [Switch](/quest/m1/quic/fork/switch.md) - quinn's async layer and `web-transport-moq` join moq-tokio, both runtimes run on `moq-quic`, `moq-noq*` is gone, and relay memory matches `moq-noq`
is either ported by a child quest or recorded as not applicable in
[#5664](https://github.com/moq-dev/moq/pull/5664).

## Related

Expand Down
58 changes: 0 additions & 58 deletions quest/m1/quic/fork/switch.md

This file was deleted.

Loading
Loading