[package] name = "joule-moq-relay" version = "0.1.0" description = "A MOQT relay for draft-ietf-moq-transport-22 (and -18 and -16, bridged): native QUIC and WebTransport over HTTP/3 on one UDP port, a WebSocket fallback, priority-ordered fan-out with per-subscriber delivery timeouts, and every object's receipts forwarded whether the object was delivered or dropped." edition = "2024" license = "Apache-2.0" repository = "https://github.com/transaction-science/open-standards" [lib] path = "src/lib.rs" # The binary is `wai-relay`; the crate keeps its name (WAI toolchain decision 11). [[bin]] name = "wai-relay" path = "src/main.rs" [dependencies] # `secure-objects` for its Key ID reader alone: the DVR store keeps nothing of a room whose # objects are sealed (dvr.rs), and the relay never opens one. joule-moq = { path = "../joule-moq", features = ["secure-objects"] } quinn = "0.11" # The per-core UDP sockets (transport::quic::bind_udp_group): SO_REUSEPORT before the bind, and the # filter that steers a packet to the socket holding its connection. socket2 = { version = "0.6", features = ["all"] } libc = "0.2" rustls = { version = "0.23", default-features = false, features = ["ring", "std"] } ring = "0.17" # WebTransport over HTTP/3 (MIT OR Apache-2.0). Its `quinn` feature lets one quinn # endpoint serve both the native MOQT ALPN and `h3`. wtransport = { version = "0.7.2", default-features = false, features = ["ring", "self-signed", "quinn"] } tokio-tungstenite = "0.30" # TLS under a `wss://` upstream (crate::cascade), with the relay's own verifier: ring, as # rustls above, and no other provider. tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] } # The platform's roots, for an upstream whose front holds a public certificate. rustls-native-certs = "0.8" tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "time", "net", "io-util", "signal"] } bytes = "1.12" futures = "0.3" async-trait = "0.1" tracing = "0.1" tracing-subscriber = "0.3" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["raw_value"] } toml = "1.2" ed25519-dalek = { version = "3", features = ["alloc", "rand_core"] } rand_core_06 = { package = "rand_core", version = "0.6", features = ["getrandom"] } blake3 = "1" hex = "0.4" base64 = "0.23" thiserror = "2" # GET /metrics on the control listener, in the text exposition format (src/control.rs). wai-metrics = { path = "../../../../wai/wai-metrics" } # WebTransport over HTTP/2 (feature `webtransport-h2`): HTTP/2 with extended CONNECT (MIT), # vendored with settings of identifiers it does not interpret (vendor/h2/VENDORED.md), so a # workspace that enables the feature patches it in; and the request and response types it takes. h2 = { version = "0.4.20", optional = true } http = { version = "1", optional = true } [features] # Write each session's MOQT events as a qlog (draft-pardue-moq-qlog-moq-events-08) where # `monitoring.qlog_dir` names a directory (src/monitoring.rs). Off: the relay holds no qlog # code and refuses to start with `qlog_dir` set. qlog = ["joule-moq/qlog"] # WebTransport over HTTP/2 (`draft-ietf-webtrans-http2-16`) on `webtransport_h2_listen` # (src/transport/webtransport_h2.rs). Off: the relay holds none of it and refuses to start with # the listener set. Its test, tests/relay_webtransport_h2.rs, runs with the feature alone. webtransport-h2 = ["dep:h2", "dep:http"] [[test]] name = "relay_webtransport_h2" required-features = ["webtransport-h2"] [dev-dependencies] tokio = { version = "1", features = ["rt-multi-thread", "macros"] }