Skip to main content

Session Lifecycle

A session is an encrypted channel between two paired peers. Sessions handle connection management, automatic reconnection, and forward-secret message delivery.

Connection States

Sessions move through a simple state machine:

connecting -> connected -> reconnecting -> connected
\-> disconnected
StateDescription
connectingNoise XX handshake in progress
connectedSession active, messages can be sent and received
reconnectingTransport dropped, attempting to re-establish
disconnectedSession ended or reconnection failed

Automatic Reconnection

When a transport drops (e.g., switching from WiFi to cellular), sessions automatically attempt to reconnect. Key properties:

  • Double Ratchet state is preserved -- no re-pairing is needed. The ratchet picks up where it left off.
  • Transport-agnostic -- sessions persist across transport changes. A connection that started over WebRTC can resume over a relay, or vice versa.
  • Transparent to your app -- messages sent during reconnection are queued and delivered once the session is re-established.

Event Handling for State Changes

Listen for StateChanged events to update your UI or trigger application logic when a session's state changes.

let mut events = node.subscribe();
while let Some(event) = events.recv().await {
match event {
Event::StateChanged { peer_id, state } => {
println!("Peer {} state: {:?}", peer_id, state);
}
_ => {}
}
}

The state value is one of: connecting, connected, reconnecting, disconnected.

Session Properties

You can inspect a session's current state and the peer it is connected to.

let session = node.connect(&peer_id).await?;
println!("Peer: {}", session.peer_id());
println!("State: {:?}", session.state());