The provider call-control seam (green zone, ADR-0008). The trait locks the boundary so the next provider (Telnyx, etc.) is an implementation, not a refactor. MockCallControlClient is the CI test double; the live TwilioCallControlClient (T6) lives behind the twilio-live feature flag. TwilioCredentials lives ONLY in crates/rutster-trunk/ -- never re-exported through the workspace (ADR-0009 -- provider credentials never reach the brain). Its Debug impl is hand-written (NOT derived) so the auth_token renders as <redacted>, never leaking into tracing/panic output. Option<SpendToken> on originate is the pre-paved seam for spearhead step-6 (spend cap); this slice passes None everywhere. The signature is locked so step 6 is additive, not a refactor. T2 of slice-5. lib.rs gains `pub mod provider;` -- stacked-branches carve-out (rebase-merge, not squash) per AGENTS.md Git workflow; dev-c rebases forward for the FOB-side pub mod declarations (g711/twilio_media_streams/session/ loop_driver). Signed-off-by: Aaron D. Lee <himself@adlee.work>
38 lines
1.8 KiB
TOML
38 lines
1.8 KiB
TOML
# 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; no first-party SIP (spearhead step 5, ADR-0007)."
|
|
|
|
[dependencies]
|
|
# async-trait: lets us declare `async fn` in the CallControlClient trait while
|
|
# still using it as a trait object (`Box<dyn CallControlClient>`) in the route
|
|
# handlers. Native async-fn-in-traits (stable since 1.75) does NOT support
|
|
# `dyn` dispatch without manual desugaring — async_trait rewrites the signature
|
|
# to `fn -> Pin<Box<dyn Future + Send>>` for us (spec §3.4).
|
|
async-trait = { workspace = true }
|
|
# url: the `TwilioCredentials::webhook_base` field is a `url::Url` (the
|
|
# operator's public base URL Twilio calls back). Parsed in `config::twilio_credentials`.
|
|
url = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
# tokio: only the dev-dep is needed for the mock's `#[tokio::test]` attribute
|
|
# (`#[tokio::test]` expands to a `#[test]` that spins up a current-thread
|
|
# runtime + drives the async fn to completion). The library itself is
|
|
# runtime-agnostic: async_trait's desugared futures poll on whatever runtime
|
|
# the caller drives them with — the mock's bodies are synchronous (lock + push,
|
|
# no `.await`), so no tokio dependency leaks into the library's public surface.
|
|
tokio = { workspace = true }
|
|
|
|
[features]
|
|
default = []
|
|
# The live `TwilioCallControlClient` (T6) is feature-gated behind `twilio-live`
|
|
# so the routine CI gate stays feature-default-off: `MockCallControlClient` is
|
|
# the per-PR test surface; the maintainer runs `cargo test --features=twilio-live`
|
|
# + the e2e suite only when validating a release (against real Twilio creds).
|
|
# Spec §1.2 + plan T6 + ADR-0009 (credentials never reach the brain).
|
|
twilio-live = []
|