ec-node: moq-rs draft-07 for Cloudflare relay

This commit is contained in:
every.channel 2026-02-17 02:26:20 -08:00
parent ce8c1319f4
commit 09246513ab
No known key found for this signature in database
6 changed files with 36 additions and 47 deletions

40
Cargo.lock generated
View file

@ -4157,8 +4157,7 @@ dependencies = [
[[package]] [[package]]
name = "moq-catalog" name = "moq-catalog"
version = "0.2.2" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/cloudflare/moq-rs?branch=draft-ietf-moq-transport-07#ebc843de8504e37d36c3134a1181513ebdf7a34a"
checksum = "2b9cf3655b840e98b6527e75975b9406560bdd20a637223e653f04464e114f17"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -4260,9 +4259,8 @@ dependencies = [
[[package]] [[package]]
name = "moq-native-ietf" name = "moq-native-ietf"
version = "0.7.1" version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/cloudflare/moq-rs?branch=draft-ietf-moq-transport-07#ebc843de8504e37d36c3134a1181513ebdf7a34a"
checksum = "3e8e6cb8df625bcf7c5e09d18b155467aa36fe84a47b95af55b485f5613fd91c"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
@ -4271,7 +4269,6 @@ dependencies = [
"log", "log",
"moq-transport", "moq-transport",
"quinn", "quinn",
"rand 0.8.5",
"ring", "ring",
"rustls", "rustls",
"rustls-native-certs 0.7.3", "rustls-native-certs 0.7.3",
@ -4285,9 +4282,8 @@ dependencies = [
[[package]] [[package]]
name = "moq-pub" name = "moq-pub"
version = "0.8.8" version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/cloudflare/moq-rs?branch=draft-ietf-moq-transport-07#ebc843de8504e37d36c3134a1181513ebdf7a34a"
checksum = "c47f3c2fbd884037543088a44c36d8a82388a3c38fde13c4e1946f61b94f0d45"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@ -4308,20 +4304,15 @@ dependencies = [
[[package]] [[package]]
name = "moq-transport" name = "moq-transport"
version = "0.12.2" version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/cloudflare/moq-rs?branch=draft-ietf-moq-transport-07#ebc843de8504e37d36c3134a1181513ebdf7a34a"
checksum = "50d2f896962af0634a5b71f274a07590fbbe21f30c89d986066479078644b477"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures", "futures",
"log", "log",
"paste", "paste",
"serde",
"serde_json",
"serde_with",
"thiserror 1.0.69", "thiserror 1.0.69",
"tokio", "tokio",
"uuid",
"web-transport", "web-transport",
] ]
@ -5703,18 +5694,6 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "qlog"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f15b83c59e6b945f2261c95a1dd9faf239187f32ff0a96af1d1d28c4557f919"
dependencies = [
"serde",
"serde_json",
"serde_with",
"smallvec",
]
[[package]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.38.4" version = "0.38.4"
@ -5755,7 +5734,6 @@ dependencies = [
"fastbloom", "fastbloom",
"getrandom 0.3.4", "getrandom 0.3.4",
"lru-slab", "lru-slab",
"qlog",
"rand 0.9.2", "rand 0.9.2",
"ring", "ring",
"rustc-hash", "rustc-hash",
@ -6631,7 +6609,6 @@ version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [ dependencies = [
"indexmap 2.13.0",
"itoa", "itoa",
"memchr", "memchr",
"serde", "serde",
@ -6889,9 +6866,6 @@ name = "smallvec"
version = "1.15.1" version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "smol_str" name = "smol_str"

View file

@ -32,9 +32,9 @@ tracing-subscriber.workspace = true
hang = "0.14.0" hang = "0.14.0"
moq-mux = "0.2.1" moq-mux = "0.2.1"
moq-native = { version = "0.13.1", default-features = true } moq-native = { version = "0.13.1", default-features = true }
moq-native-ietf = "0.7.1" moq-native-ietf = { git = "https://github.com/cloudflare/moq-rs", branch = "draft-ietf-moq-transport-07" }
moq-pub = "0.8.8" moq-pub = { git = "https://github.com/cloudflare/moq-rs", branch = "draft-ietf-moq-transport-07" }
moq-transport = "0.12.2" moq-transport = { git = "https://github.com/cloudflare/moq-rs", branch = "draft-ietf-moq-transport-07" }
url = "2" url = "2"
[dev-dependencies] [dev-dependencies]

View file

@ -4229,26 +4229,29 @@ async fn wt_publish(args: WtPublishArgs) -> Result<()> {
let relay_url = Url::parse(&args.url) let relay_url = Url::parse(&args.url)
.with_context(|| format!("invalid relay url: {}", args.url))?; .with_context(|| format!("invalid relay url: {}", args.url))?;
// Cloudflare's relay currently implements a subset of the IETF MoQ Transport draft-07. // Cloudflare's public relay currently implements a subset of the IETF MoQ Transport draft-07.
// Use moq-transport (via moq-native-ietf) for interoperability. // The upstream (newer-draft) moq stack does not interop; use the draft-07 compatibility
// implementation from the moq-rs repository.
let mut tls_args = moq_native_ietf::tls::Args::default(); let mut tls_args = moq_native_ietf::tls::Args::default();
tls_args.disable_verify = args.tls_disable_verify; tls_args.disable_verify = args.tls_disable_verify;
let tls = tls_args.load().context("failed to load TLS config")?; let tls = tls_args.load().context("failed to load TLS config")?;
let bind: std::net::SocketAddr = "[::]:0".parse().expect("valid bind addr"); let quic = moq_native_ietf::quic::Endpoint::new(moq_native_ietf::quic::Config {
let quic = moq_native_ietf::quic::Endpoint::new(moq_native_ietf::quic::Config::new( bind: "[::]:0".parse().expect("valid bind addr"),
bind, None, tls, tls,
)) })
.context("failed to init moq-native-ietf endpoint")?; .context("failed to init moq-native-ietf endpoint")?;
let namespace = moq_transport::coding::TrackNamespace::from_utf8_path(&args.name); let (writer, _, reader) = moq_transport::serve::Tracks::new(
let (writer, _, reader) = moq_transport::serve::Tracks::new(namespace).produce(); moq_transport::coding::Tuple::from_utf8_path(&args.name),
)
.produce();
let mut media = moq_pub::Media::new(writer).context("failed to init moq-pub media parser")?; let mut media = moq_pub::Media::new(writer).context("failed to init moq-pub media parser")?;
tracing::info!(url=%relay_url, name=%args.name, "connecting to relay"); tracing::info!(url=%relay_url, name=%args.name, "connecting to relay");
let (session, _cid) = quic let session = quic
.client .client
.connect(&relay_url, None) .connect(&relay_url)
.await .await
.context("failed to connect to relay")?; .context("failed to connect to relay")?;

View file

@ -59,6 +59,7 @@ newer draft implementations.
Implementation choice: Implementation choice:
- `ec-node wt-publish` uses `moq-native-ietf` + `moq-transport` + `moq-pub` (fMP4 ingestion) for Cloudflare relay compatibility. - `ec-node wt-publish` uses `moq-native-ietf` + `moq-transport` + `moq-pub` (fMP4 ingestion) for Cloudflare relay compatibility.
- Pin these crates to the `cloudflare/moq-rs` git branch `draft-ietf-moq-transport-07` until the relay supports newer drafts (crates.io releases observed to fail with `closed by peer`).
### Share link ### Share link

View file

@ -294,7 +294,14 @@ in
${lib.optionalString cfg.tlsDisableVerify "cmd+=(--tls-disable-verify)"} ${lib.optionalString cfg.tlsDisableVerify "cmd+=(--tls-disable-verify)"}
${extraArgsLine} ${extraArgsLine}
exec "''${cmd[@]}" # Keep the unit alive even if the relay is temporarily unreachable.
# This avoids `switch-to-configuration test` failing due to a unit that exits
# quickly during activation.
trap 'exit 0' INT TERM
while true; do
"''${cmd[@]}" || true
sleep 2
done
''; '';
}; };
in in

View file

@ -24,6 +24,10 @@ rustPlatform.buildRustPackage {
cargoLock = { cargoLock = {
lockFile = ../../Cargo.lock; lockFile = ../../Cargo.lock;
outputHashes = {
# Filled iteratively when git dependencies change.
"moq-catalog-0.2.2" = "sha256-df9KXVBRiNewDJ7ZgGBja81PPnk8vC9TA0bDIG0892o=";
};
}; };
cargoBuildFlags = [ "-p" "ec-node" ]; cargoBuildFlags = [ "-p" "ec-node" ];