WeaveDocs
Weave Dht

Relay

Local relay sessions in the Weave DHT — short-lived relay topology for peers behind NAT or restricted networks.

Purpose

Peer discovery, mutable records, DID envelopes, local relay sessions, adapter registry, record stores, and handles.

This page follows the real source shape for Weave Dht 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.

Note

Relay sessions are local-process scoped and short-lived. They are not a substitute for proper NAT traversal — use them to bridge specific pairs of peers, not as a general-purpose relay tier.

Primary types to know

  • AdapterRegistry — network/weave-dht/src/methods.rs
  • AnnouncementState — network/weave-dht/src/weave.rs
  • AnnounceOpts — network/weave-dht/src/weave.rs
  • DhtClient — network/weave-dht/src/lib.rs
  • DhtConfig — network/weave-dht/src/lib.rs
  • DhtHandle — network/weave-dht/src/lib.rs
  • DhtMethodAdapter — network/weave-dht/src/methods.rs
  • DhtNode — network/weave-dht/src/lib.rs
  • DhtNodeBuilder — network/weave-dht/src/lib.rs
  • DidEnvelope — network/weave-dht/src/envelope.rs
  • EnhancedDhtNode — network/weave-dht/src/enhanced.rs
  • MarsAdapter — network/weave-dht/src/methods.rs

Example shape

use std::time::Duration;
use weave_dht::{DhtNode, LocalRelayConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // RelayConfig governs how the node forwards traffic for NAT-blocked peers.
    let relay = LocalRelayConfig {
        allow_relay: true,
        max_sessions: 64,
        session_timeout: Duration::from_secs(30 * 60),
        max_bytes_per_session: 16 * 1024 * 1024,
        rate_limit_per_peer: Some(64 * 1024),
        ..LocalRelayConfig::default()
    };

    // Plug the config into the DhtNode builder. The libp2p relay protocol is
    // enabled inside `start()` based on the supplied config.
    let node = DhtNode::builder()
        .in_memory()
        .listen_port(0)
        .with_relay(relay)
        .relay_peers(vec!["/ip4/198.51.100.7/tcp/4040/p2p/12D3KooW...".into()])
        .start()
        .await?;

    println!(
        "relay_node_id={} listen_port={} relay_enabled=true",
        node.peer_id(),
        node.listen_port(),
    );
    Ok(())
}