Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d084f48
wip: webrtc framer transport plugin (str0m on ring, host DTLS shim, d…
MattJackson Oct 7, 2026
1878376
busbar-transport-webrtc: build the webrtc framer on predev, fold its …
MattJackson Oct 10, 2026
400d2fa
qa/construction.toml: name the webrtc framer's own third-party depend…
MattJackson Oct 10, 2026
51630c3
pre-flight: fmt / lock / abi header
MattJackson Oct 10, 2026
b2b849b
busbar-transport-webrtc: clear clippy, register the wire in the root,…
MattJackson Oct 10, 2026
f3f528b
Merge remote-tracking branch 'origin/predev' into lane-task-row-132b-…
MattJackson Oct 10, 2026
f258ec2
pre-flight: fmt / lock / abi header
MattJackson Oct 10, 2026
e89bfde
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
329759a
kind-isolation:law0: give busbar x transport back the 15 hits the web…
MattJackson Oct 10, 2026
653b0a4
Merge remote-tracking branch 'origin/predev' into lane-task-row-132b-…
MattJackson Oct 10, 2026
c923019
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
4fcdbc2
egress swrr_allocation: count only the measuring thread's allocations
MattJackson Oct 10, 2026
960e185
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
ca658fe
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
2366ef8
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
6c528b2
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
8b5b382
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
4c8643c
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
98660be
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
2fb7b8c
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
358bdea
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
f17e306
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 10, 2026
403aaba
Merge branch 'predev' of https://github.com/GetBusbar/busbar into lan…
MattJackson Oct 11, 2026
c406bcb
Re-pin the scan population floor to 947 and ledger the two legacy -> …
MattJackson Oct 11, 2026
43a0489
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 11, 2026
9d9f214
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 11, 2026
e3ad83e
Merge branch 'predev' into lane-task-row-132b-webrtc-framer
MattJackson Oct 11, 2026
a31461a
conformance: the dropped-in leg opens only an image that exports the …
MattJackson Oct 12, 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
140 changes: 136 additions & 4 deletions Cargo.lock

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

10 changes: 10 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ members = [
"crates/plugin-loader",
"crates/store-memory",
"crates/busbar-transport-stdio",
"crates/busbar-transport-webrtc",
"testing/ws-conformance/subject",
"xtask",
]
Expand Down Expand Up @@ -158,6 +159,15 @@ crc32fast = "1"
# DTLS for the connector's dtls engine (WebRTC), on ring through the connector's own provider:
# no default features, so neither aws-lc-rs nor the RustCrypto suite enters.
dimpl = { version = "=0.7.4", default-features = false }
# THE WEBRTC FRAMER's media stack (busbar-transport-webrtc; ARCHITECT WEBRTC spike GO and D2 approval,
# THE DESIGN l.756-765): ICE, SRTP and SCTP, sans-IO. No default features: no aws-lc-rs, no OpenSSL,
# no example server; the framer installs its own crypto provider on ring and a host shim in place of
# str0m's DTLS (the framer holds no DTLS state).
str0m = { version = "=0.24.1", default-features = false }
# THE ONE EXCEPTION TO ring-ONLY (THE DESIGN l.759-761, QUESTIONS Q101): ring has no raw AES block, and
# the SRTP key derivation (RFC 3711 §4.3, RFC 7714 §11) is AES in counter mode over 16-byte blocks.
# aes/cipher/inout enter for that derivation alone; a dependency-closure test confines them to it.
aes = { version = "0.8", default-features = false }
# THE MICROBENCHMARK HARNESS. Dev-only, and deliberately stripped: `default-features = false` drops
# criterion's plotting stack (plotters, its font/image chain) and its rayon thread pool, keeping
# `cargo_bench_support` — the part `cargo bench` actually needs to run a `harness = false` target.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,12 @@ fn a_composition_refusal_says_which_transport_and_which_layer() {
// Each of the three is read by a human at boot, off a node that will not start. A refusal that
// rendered as nothing would leave the operator with an exit code.
let unregistered = CompositionError::UnregisteredLayer {
transport: "webrtc",
transport: "dgram",
layer: "udp",
};
let rendered = unregistered.to_string();
assert!(
rendered.contains("webrtc") && rendered.contains("udp"),
rendered.contains("dgram") && rendered.contains("udp"),
"{rendered}"
);
assert!(rendered.contains("no registered transport"), "{rendered}");
Expand Down
4 changes: 2 additions & 2 deletions crates/busbar-contract/tests/transport_registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ fn the_real_stack_boots() {
fn a_declared_layer_that_nothing_registered_refuses_the_boot() {
let registry = [
declared("tcp", &[], None),
declared("webrtc", &["udp"], None),
declared("dgram", &["udp"], None),
];
assert_eq!(
check_composition(&registry),
Err(CompositionError::UnregisteredLayer {
transport: "webrtc",
transport: "dgram",
layer: "udp",
})
);
Expand Down
10 changes: 5 additions & 5 deletions crates/busbar-core-connector/src/dtls/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
//!
//! # One UDP port, three protocols (RFC 7983 §7)
//!
//! A WebRTC association multiplexes STUN, DTLS and SRTP on one 5-tuple. [`classify`] splits them by
//! A media association multiplexes STUN, DTLS and SRTP on one 5-tuple. [`classify`] splits them by
//! the first byte, and [`Association::ingest`] is the record layer's host side:
//!
//! * **STUN** goes up the raw lane to the framer's ICE agent — except the answers to core's own
Expand Down Expand Up @@ -86,7 +86,7 @@ pub const CONSENT_TIMEOUT: Duration = Duration::from_secs(30);
/// How long a probe is awaited before a heard path is probed again.
const PROBE_RETRY: Duration = Duration::from_millis(500);

/// What one datagram on a WebRTC port is (RFC 7983 §7).
/// What one datagram on a media port is (RFC 7983 §7).
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Class {
/// First byte 0–3: STUN.
Expand Down Expand Up @@ -242,7 +242,7 @@ pub enum Up {
Connected,
/// The exported SRTP keying material.
Keyed(SrtpKeying),
/// Decrypted DTLS application data (SCTP, for WebRTC).
/// Decrypted DTLS application data (SCTP, for the data channels).
Plaintext(Vec<u8>),
/// The peer closed the DTLS session.
Closed,
Expand Down Expand Up @@ -284,7 +284,7 @@ pub enum Bind {
WhenProven,
}

/// One WebRTC association's DTLS engine and demux.
/// One media association's DTLS engine and demux.
pub struct Association {
cert: Arc<SessionCert>,
role: Role,
Expand Down Expand Up @@ -467,7 +467,7 @@ impl Association {
self.bound == Some(path)
}

/// Seal `plaintext` (SCTP, for WebRTC) as DTLS application data toward the bound path.
/// Seal `plaintext` (SCTP, for the data channels) as DTLS application data toward the bound path.
///
/// # Errors
///
Expand Down
2 changes: 1 addition & 1 deletion crates/busbar-core-connector/src/dtls/ring.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
//! exactly the record-number mask for ChaCha20 (dimpl checks its first 5 bytes), so
//! `TLS_CHACHA20_POLY1305_SHA256` is offered to satisfy it. The AES-GCM 1.3 suites need a full
//! 16-byte AES-ECB block, which ring does not expose. Associations are built DTLS 1.2
//! (`Dtls::new_12`), the version every browser's WebRTC stack speaks.
//! (`Dtls::new_12`), the version every browser's media stack speaks.

use dimpl::crypto::{
Aad, ActiveKeyExchange, Buf, Cipher, CryptoProvider, Dtls12CipherSuite, Dtls13CipherSuite,
Expand Down
2 changes: 1 addition & 1 deletion crates/busbar-core-connector/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
//! * [`guard`] is THE DESTINATION GUARD, the one check deciding which addresses any outbound
//! connection may be dialled at (private refused unless allowlisted, metadata always).
//! * [`tls`] is connection security — core-only, never a plugin, never crossing the ABI.
//! * [`dtls`] is its datagram sibling — the DTLS engine a WebRTC association runs on (the RFC 7983
//! * [`dtls`] is its datagram sibling — the DTLS engine a media association runs on (the RFC 7983
//! demux, the ICE-gated bind, the SRTP exporter), on ring like [`tls`].
//! * [`udp`] is the host's datagram socket: one bound port, a peer per datagram.
//!
Expand Down
2 changes: 1 addition & 1 deletion crates/busbar-core-connector/src/udp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! binds one. The stream carriers are a separate path: a datagram has
//! a peer per read and no connection, so it is never folded into the stream socket types.
//!
//! One bound port serves every WebRTC association on it: each read answers the datagram AND the
//! One bound port serves every media association on it: each read answers the datagram AND the
//! peer it came from, each write names the peer it goes to, and the dtls engine
//! ([`crate::dtls`]) demultiplexes by path. Nothing here waits: a read or write that would block
//! answers `None`, and the caller waits on the socket's read/write readiness — the per-worker
Expand Down
Loading
Loading