Skip to main content

Node

The Node is the core object in cairn. It represents your local peer, manages identity, handles pairing, and establishes encrypted sessions.

Constructor / Factory

Create a new cairn node with optional configuration.

use cairn_p2p::{CairnConfig, create, create_server};

// Default configuration
let node = create(CairnConfig::default())?;
node.start().await?;

// Server mode
let server = create_server(CairnConfig::default())?;
server.start().await?;

Signature: create(config: CairnConfig) -> Result<Node, CairnError>

Pairing Methods

pair_generate_pin

Generate a PIN code for the initiator side of PIN pairing. Returns the PIN string and, once the responder enters it, the paired peer's ID.

let data = node.pair_generate_pin().await?;
println!("PIN: {}", data.pin);
let peer_id = data.peer_id; // available after responder enters PIN

Signature: pair_generate_pin() -> Result<PairingData, CairnError>

Returns: PairingData { pin: String, peer_id: PeerID }

pair_enter_pin

Enter a PIN code as the responder. Returns the paired peer's ID.

let peer_id = node.pair_enter_pin("A1B2-C3D4").await?;

Signature: pair_enter_pin(pin: &str) -> Result<PeerID, CairnError>

Generate a pairing link URI as the initiator. The URI can be shared via any channel.

let data = node.pair_generate_link().await?;
println!("Link: {}", data.uri);
let peer_id = data.peer_id;

Signature: pair_generate_link() -> Result<LinkData, CairnError>

Accept a pairing link as the responder. Returns the paired peer's ID.

let peer_id = node.pair_from_link(&uri).await?;

Signature: pair_from_link(uri: &str) -> Result<PeerID, CairnError>

Connection

connect

Open an encrypted session with a paired peer. Returns a Session object for sending and receiving messages.

let session = node.connect(&peer_id).await?;

Signature: connect(peer_id: &PeerID) -> Result<Session, CairnError>

Events

Subscribe to node events (messages, state changes, peer connections/disconnections). The subscription mechanism varies by language.

let mut events = node.subscribe();
while let Some(event) = events.recv().await {
match event {
Event::MessageReceived { peer_id, channel, data } => {
println!("[{}] {}: {}", channel, peer_id, String::from_utf8_lossy(&data));
}
Event::PeerConnected { peer_id } => {
println!("Connected: {}", peer_id);
}
Event::PeerDisconnected { peer_id } => {
println!("Disconnected: {}", peer_id);
}
Event::StateChanged { peer_id, state } => {
println!("State: {} -> {:?}", peer_id, state);
}
_ => {}
}
}

Signature: subscribe() -> broadcast::Receiver<Event>

Returns a broadcast stream of Event values.

Info

peer_id

Returns the local peer's identifier (Base58-encoded Ed25519 public key).

let id = node.peer_id();
println!("Peer ID: {}", id);

Type: peer_id() -> PeerID (method)