WeaveDocs
Zer0 Secret Stream

Bridge IO

Bridge IO adapters in `zer0-secret-stream` — wrap a secret stream around any async-IO endpoint with consistent framing.

Purpose

Noise-style secret stream with handshakes, framing, bridge IO, tunables, metrics, and typed errors.

This page follows the real source shape for Zer0 Secret Stream and explains the workflow a developer is likely to use first.

Developer workflow

Start from the smallest constructor or builder, perform one meaningful operation, inspect the returned state, then add the relevant policy, storage, or network integration. The examples below should be expanded whenever the crate API changes.

Primary types to know

  • Bridge — network/zer0-secret-stream/src/bridge.rs
  • BridgeReverse — network/zer0-secret-stream/src/bridge.rs
  • Handshake — network/zer0-secret-stream/src/handshake.rs
  • HandshakeResult — network/zer0-secret-stream/src/handshake.rs
  • Message — network/zer0-secret-stream/src/lib.rs
  • SecretOptions — network/zer0-secret-stream/src/lib.rs
  • SecretStream — network/zer0-secret-stream/src/lib.rs
  • SecretStreamMetrics — network/zer0-secret-stream/src/metrics.rs
  • SecretStreamMetricsSnapshot — network/zer0-secret-stream/src/metrics.rs
  • SecretTunables — network/zer0-secret-stream/src/config.rs
  • HandshakeError — network/zer0-secret-stream/src/handshake.rs
  • HandshakePattern — network/zer0-secret-stream/src/handshake.rs

Example shape

use zer0_secret_stream::{Bridge, SecretOptions, SecretStream};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Bridge wires two SecretStream halves together — useful for testing,
    // proxying between transports, or stitching a relay session.
    let (a, b) = tokio::io::duplex(8192);
    let alice = SecretStream::new(a, true, SecretOptions::default())?;
    let bob = SecretStream::new(b, false, SecretOptions::default())?;

    let bridge = Bridge::new(alice, bob);
    // Driving the bridge yields aggregate byte counters from both halves.
    let stats = bridge.run().await?;

    println!(
        "bridge_a_to_b={} bytes bridge_b_to_a={} bytes",
        stats.a_to_b_bytes, stats.b_to_a_bytes,
    );
    Ok(())
}