diff --git a/Cargo.lock b/Cargo.lock index 5307a8e..f1b3428 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1200,10 +1200,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "rutster-signaling-sip" -version = "0.0.0" - [[package]] name = "rutster-spend" version = "0.0.0" @@ -1238,6 +1234,10 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "rutster-trunk" +version = "0.0.0" + [[package]] name = "ryu" version = "1.0.23" diff --git a/Cargo.toml b/Cargo.toml index b98b5e6..1efc567 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ "crates/rutster", "crates/rutster-call-model", "crates/rutster-media", - "crates/rutster-signaling-sip", + "crates/rutster-trunk", "crates/rutster-tap", "crates/rutster-tap-echo", "crates/rutster-spend", @@ -16,8 +16,8 @@ members = [ [workspace.package] license = "GPL-3.0-or-later" -edition = "2021" -repository = "https://github.com/anomalyco/rutster" +edition = "2024" +repository = "https://git.adlee.work/alee/rutster" # Pinned versions for all member crates. References are `foo.workspace = true` # in the member manifest. Keeps the dep tree unified (§2.1). diff --git a/crates/rutster-signaling-sip/Cargo.toml b/crates/rutster-signaling-sip/Cargo.toml deleted file mode 100644 index e123875..0000000 --- a/crates/rutster-signaling-sip/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -# crates/rutster-signaling-sip/Cargo.toml -[package] -name = "rutster-signaling-sip" -version = "0.0.0" -license.workspace = true -edition.workspace = true -repository.workspace = true -description = "Rust-native trunk SIP — stub crate (filled in spearhead step 5)." diff --git a/crates/rutster-signaling-sip/src/lib.rs b/crates/rutster-signaling-sip/src/lib.rs deleted file mode 100644 index 2111346..0000000 --- a/crates/rutster-signaling-sip/src/lib.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! # rutster-signaling-sip -//! -//! **Status:** stub. Fills in at spearhead step 5 (PSTN trunk). -//! -//! This crate will hold the Rust-native trunk SIP stack: the SIP parser, -//! transaction layer, dialog state, and the carrier trunk integration. See -//! [ADR-0003](../../../docs/adr/0003-sip-rust-native-trunk.md) for the -//! "own the parser from day one" thesis and [PORT_PLAN §1](../../../docs/PORT_PLAN.md) -//! for the surface area (`res_pjsip_session`, `chan_sip`, `_sdp_rtp` rows). -//! -//! Slice 1's WebRTC-only ingress needs no SIP — this stub exists to lock the -//! crate boundary without anticipating code (spec §2.2). It depends on -//! nothing in the workspace in slice 1. Its future dependency direction is -//! `rutster-signaling-sip` → `rutster-call-model` + `rutster-media` (once -//! the SDP help lives here, moved out of `rutster-media`'s WebRTC-ICE-coupled -//! SDP module — see §3.7 of the slice-1 spec for the split rationale). - -#[cfg(test)] -mod tests { - /// Stub crates lock boundaries; the compile-test is the lock. - #[test] - fn crate_compiles() {} -} diff --git a/crates/rutster-spend/src/lib.rs b/crates/rutster-spend/src/lib.rs index 2ea0d1c..2eaaf81 100644 --- a/crates/rutster-spend/src/lib.rs +++ b/crates/rutster-spend/src/lib.rs @@ -4,15 +4,17 @@ //! //! In-boundary spend and abuse control is constitutive of the wedge //! ([ADR-0002](../../../docs/adr/0002-north-star-and-fused-core.md)): the -//! runaway brain structurally cannot exceed spend or pacing because it -//! doesn't hold the wire — the trunk termination + spend gate do, in one -//! boundary. Pulling spend out into a service re-introduces the 3-vendor -//! structural hole the fused vertical was chosen to eliminate. +//! runaway brain structurally cannot exceed spend or pacing because it never +//! holds the wire — rutster mediates both the provider call-control API and +//! the brain tap, and the spend gate sits in that boundary +//! ([ADR-0007](../../../docs/adr/0007-trunk-rented-transport.md)). Pulling +//! spend out into a service re-introduces the 3-vendor structural hole the +//! fused vertical was chosen to eliminate. //! //! This crate will hold: spend caps, pacing caps, deny-by-default routing, -//! rate-limits, toll-fraud pattern detection — co-located with trunk -//! termination in `rutster-signaling-sip` (step 5). Depends on nothing in -//! the workspace in slice 1. +//! rate-limits, toll-fraud pattern detection — co-located with call +//! origination + the tap (the rented-transport ingress lives in +//! `rutster-trunk`, step 5). Depends on nothing in the workspace in slice 1. #[cfg(test)] mod tests { diff --git a/crates/rutster-trunk/Cargo.toml b/crates/rutster-trunk/Cargo.toml new file mode 100644 index 0000000..bd92d0d --- /dev/null +++ b/crates/rutster-trunk/Cargo.toml @@ -0,0 +1,8 @@ +# crates/rutster-trunk/Cargo.toml +[package] +name = "rutster-trunk" +version = "0.0.0" +license.workspace = true +edition.workspace = true +repository.workspace = true +description = "Rented carrier transport — CPaaS media-leg ingress / out-of-tree SBC; no first-party SIP (filled in step 5, ADR-0007)." diff --git a/crates/rutster-trunk/src/lib.rs b/crates/rutster-trunk/src/lib.rs new file mode 100644 index 0000000..96aee3b --- /dev/null +++ b/crates/rutster-trunk/src/lib.rs @@ -0,0 +1,24 @@ +//! # rutster-trunk +//! +//! **Status:** stub. Fills in at spearhead step 5 (a real phone number via rented transport). +//! +//! Carrier / PSTN reach for rutster — **rented transport, no first-party SIP** +//! ([ADR-0007](../../../docs/adr/0007-trunk-rented-transport.md)). This crate will hold the +//! rented-transport ingress: the **CPaaS media-leg adapter** — a WebSocket server accepting a +//! provider raw-media fork (Twilio Media Streams / Telnyx) plus the provider call-control +//! client — and later the glue for an **out-of-tree SBC** when PSTN media must stay on-prem. +//! It owns **no SIP stack**: SIP lives outside the trust boundary, in the rented transport +//! (green zone — [ADR-0008](../../../docs/adr/0008-fob-and-green-zone.md)). +//! +//! Slice 1's WebRTC-only ingress needs none of this — this stub exists to lock the crate +//! boundary without anticipating code (spec §2.2). Its future dependency direction is +//! `rutster-trunk` → `rutster-call-model` + `rutster-media`: PSTN audio is resampled to the +//! canonical tap format and handed to the media plane as a media-leg ingress, parallel to +//! WebRTC. + +#[cfg(test)] +mod tests { + /// Stub crates lock boundaries; the compile-test is the lock. + #[test] + fn crate_compiles() {} +}