Skip to content

Setting up a PeerManager

The PeerManager is responsible for managing a set of peer connections and data associated with those peers.

Adding a PeerManager

To add a PeerManager to your application, run:

rust
use lightning::ln::peer_handler::{MessageHandler, PeerManager, IgnoringMessageHandler};

let mut ephemeral_bytes = [0; 32];
rand::thread_rng().fill_bytes(&mut ephemeral_bytes);

let lightning_msg_handler = MessageHandler {
  chan_handler: channel_manager.clone(),
  route_handler: gossip_sync.clone(),
  onion_message_handler: onion_messenger.clone(),
  custom_message_handler: IgnoringMessageHandler {},
  // New in 0.2: a send-only handler for peer-storage messages (the ChainMonitor).
  send_only_message_handler: chain_monitor.clone(),
};

let peer_manager = PeerManager::new(
    lightning_msg_handler,
    current_time as u32,
    &ephemeral_bytes,
    logger.clone(),
    keys_manager.clone(), // node_signer
);
java
import org.ldk.structs.PeerManager

// The ChannelManagerConstructor wires up the PeerManager for you. Note it is
// `null` until you call `channelManagerConstructor.chain_sync_completed(..)`.
val peerManager: PeerManager = channelManagerConstructor.peer_manager
typescript
import * as ldk from "lightningdevkit";

// In TypeScript there is no MessageHandler wrapper — pass each handler to
// PeerManager.constructor_new directly. Use IgnoringMessageHandler for any
// role you don't need (here: routing, onion and custom messages).
const ignorer = ldk.IgnoringMessageHandler.constructor_new();

const peerManager = ldk.PeerManager.constructor_new(
  channelManager.as_ChannelMessageHandler(),
  ignorer.as_RoutingMessageHandler(),   // or gossipSync.as_RoutingMessageHandler()
  ignorer.as_OnionMessageHandler(),     // or onionMessenger.as_OnionMessageHandler()
  ignorer.as_CustomMessageHandler(),
  chainMonitor.as_SendOnlyMessageHandler(),
  Math.floor(Date.now() / 1000),        // current time / nonce
  keysManager.as_EntropySource().get_secure_random_bytes(), // 32 ephemeral bytes
  logger,
  keysManager.as_NodeSigner()
);

Implementation notes: if you did not initialize P2PGossipSync in the previous step, you can pass an IgnoringMessageHandler (as shown in the TypeScript example) or your own struct implementing RoutingMessageHandler in its place.

Dependencies: ChannelManager, RoutingMessageHandler, ChainMonitor, KeysManager, random bytes, Logger

References: Rust PeerManager docs, Rust MessageHandler docs, Java/Kotlin PeerManager bindings, TypeScript PeerManager bindings