open-standards/joule-code/joule-code-rs/crates/joule-moq/Cargo.toml
Transaction Science 76383460e9 MoQ monitoring as libraries: metrics and log tracks, qlog events, and MoQ Feedback mapped onto delivery telemetry
Landscape package LS-08, its library level. Four drafts read whole at the latest revision in
the IETF archive on 10 November 2026: draft-jennings-moq-metrics-03,
draft-jennings-moq-log-04, draft-pardue-moq-qlog-moq-events-08 and
draft-liu-moq-feedback-01.

- joule_moq::metrics_track: one group a capture, made from the text exposition GET /metrics
  answers with, and equal_to_exposition, which refuses the first number, kind or series in
  which a group and its exposition differ.
- joule_moq::log_track: one group a second; an attribute whose value is a network address
  is refused.
- joule_moq::qlog (feature qlog): the draft's fifteen events from the crate's own messages
  and headers, a sink, and a checker of a log's order. Lengths, never bytes.
- joule_moq::feedback: the MQF report and a consumer's mapping of every field: written as
  an observation a sink may already report, kept as a tally, consumed, or withheld with its
  reason. The feedback-source-id is not read; a field with no mapping is refused. The
  draft's two unassigned code points are placeholders in that module (D8).

No identifier of a person or a device is added: a resource is named from a public key it
already publishes. Decision D14 records the readings.

Corpora with Python second implementations sharing no code, 98 planted faults each refused
with its own reason by both, every changed copy caught and every weakened verifier caught.

Left: the relay publishes no metrics or log track, writes no qlog and consumes no Feedback
Track yet; no text says it does.

Co-Authored-By: Claude Fable 5.2 <[email protected]>
2026-11-11 07:40:49 -05:00

66 lines
3.3 KiB
TOML

[package]
name = "joule-moq"
version = "0.3.0"
description = "MoQT (Media over QUIC Transport, draft-ietf-moq-transport-22, with -18 and -16 for interoperation) wire protocol + JWP receipt extension for WAI broadcast media. Trait surface lets the Realtime stack publish, subscribe, and relay tracks with object-level signed provenance and joule receipts."
edition = "2024"
license = "Apache-2.0"
repository = "https://github.com/transaction-science/open-standards"
[dependencies]
bytes = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "2"
blake3 = "1"
ed25519-dalek = { version = "2", features = ["serde", "rand_core"] }
# SHA-256 for a room grant's digest (WAI live-rooms §4.2), the one a proof names.
sha2 = "0.10"
# The async surface's dependencies (feature `runtime`).
jwp = { path = "../jwp", optional = true }
async-trait = { version = "0.1", optional = true }
tracing = { version = "0.1", optional = true }
tokio = { version = "1", features = ["sync", "rt", "macros", "io-util", "net", "time"], optional = true }
uuid = { version = "1", features = ["v4", "v5", "v7", "serde", "js"], optional = true }
chrono = { version = "0.4", features = ["serde"], optional = true }
rand_core_06 = { package = "rand_core", version = "0.6", features = ["getrandom"], optional = true }
futures = { version = "0.3", optional = true }
# End-to-end sealed objects (feature `secure-objects`): RustCrypto's AES-GCM, AES-CTR,
# HMAC and HKDF, all Apache-2.0 OR MIT, at the versions this workspace's lock already
# holds. No default features: nothing here draws randomness.
aes-gcm = { version = "0.10", default-features = false, features = ["aes", "alloc"], optional = true }
aes = { version = "0.8", optional = true }
ctr = { version = "0.9", optional = true }
hmac = { version = "0.12", optional = true }
hkdf = { version = "0.12", optional = true }
[features]
default = ["runtime"]
# The async surface: the endpoint traits, the in-memory mock, and (with `quic`) the QUIC
# transport, on tokio and the JWP framing crate. Without it the crate is the -22 codec,
# the carriage of objects and receipts, the receipts and the session's setup rules, with
# no runtime and no native dependency, and it builds for wasm32-unknown-unknown
# (`joule-moq-web` builds it so).
runtime = ["dep:jwp", "dep:async-trait", "dep:tracing", "dep:tokio", "dep:uuid", "dep:chrono", "dep:rand_core_06", "dep:futures"]
quic = ["runtime", "dep:quinn", "dep:rustls", "dep:rcgen"]
# Sealing and opening objects end to end (WAI confidentiality §4, §6): no runtime, so it
# builds for wasm32-unknown-unknown beside the codec.
secure-objects = ["dep:aes-gcm", "dep:aes", "dep:ctr", "dep:hmac", "dep:hkdf"]
# MOQT events for qlog (draft-pardue-moq-qlog-moq-events-08): the event types, a sink a
# session or a relay logs to, and the checker of a log. No dependency of its own.
qlog = []
[dependencies.quinn]
version = "0.11"
optional = true
[dependencies.rustls]
version = "0.23"
features = ["ring", "std"]
optional = true
[dependencies.rcgen]
version = "0.14"
optional = true
[dev-dependencies]
tokio = { version = "1", features = ["macros", "rt", "rt-multi-thread"] }