Skip to content

Commit 13f8c55

Browse files
committed
Implement and expose connect/disconnect
1 parent 4460781 commit 13f8c55

File tree

1 file changed

+68
-2
lines changed

1 file changed

+68
-2
lines changed

src/lib.rs

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,8 @@ use logger::{log_error, log_info, FilesystemLogger, Logger};
103103

104104
use lightning::chain::keysinterface::EntropySource;
105105
use lightning::chain::{chainmonitor, BestBlock, Confirm, Watch};
106-
use lightning::ln::channelmanager;
107106
use lightning::ln::channelmanager::{
108-
ChainParameters, ChannelDetails, ChannelManagerReadArgs, PaymentId, Retry,
107+
self, ChainParameters, ChannelDetails, ChannelManagerReadArgs, PaymentId, Retry,
109108
};
110109
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
111110
use lightning::ln::{PaymentHash, PaymentPreimage};
@@ -845,6 +844,73 @@ impl Node {
845844
self.channel_manager.list_channels()
846845
}
847846

847+
/// Connect to a node on the peer-to-peer network.
848+
///
849+
/// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
850+
pub fn connect(
851+
&self, node_id: &PublicKey, address: &SocketAddr, permanently: bool,
852+
) -> Result<(), Error> {
853+
let runtime_lock = self.running.read().unwrap();
854+
if runtime_lock.is_none() {
855+
return Err(Error::NotRunning);
856+
}
857+
858+
let runtime = runtime_lock.as_ref().unwrap();
859+
860+
let peer_info = PeerInfo { pubkey: node_id.clone(), address: address.clone() };
861+
862+
let con_peer_pubkey = peer_info.pubkey.clone();
863+
let con_peer_addr = peer_info.address.clone();
864+
let con_success = Arc::new(AtomicBool::new(false));
865+
let con_success_cloned = Arc::clone(&con_success);
866+
let con_logger = Arc::clone(&self.logger);
867+
let con_pm = Arc::clone(&self.peer_manager);
868+
869+
tokio::task::block_in_place(move || {
870+
runtime.tokio_runtime.block_on(async move {
871+
let res =
872+
connect_peer_if_necessary(con_peer_pubkey, con_peer_addr, con_pm, con_logger)
873+
.await;
874+
con_success_cloned.store(res.is_ok(), Ordering::Release);
875+
})
876+
});
877+
878+
if !con_success.load(Ordering::Acquire) {
879+
return Err(Error::ConnectionFailed);
880+
}
881+
882+
if permanently {
883+
self.peer_store.add_peer(peer_info.clone())?;
884+
}
885+
886+
log_info!(self.logger, "Connected to peer {}@{}. ", peer_info.pubkey, peer_info.address,);
887+
888+
Ok(())
889+
}
890+
891+
/// Disconnects the peer with the given node id.
892+
///
893+
/// Will also remove the peer from the peer store, i.e., after this has been called we won't
894+
/// try to reconnect on restart.
895+
pub fn disconnect(&self, counterparty_node_id: &PublicKey) -> Result<(), Error> {
896+
let runtime_lock = self.running.read().unwrap();
897+
if runtime_lock.is_none() {
898+
return Err(Error::NotRunning);
899+
}
900+
901+
log_info!(self.logger, "Disconnecting peer {}..", counterparty_node_id);
902+
903+
match self.peer_store.remove_peer(&counterparty_node_id) {
904+
Ok(()) => {}
905+
Err(e) => {
906+
log_error!(self.logger, "Failed to remove peer {}: {}", counterparty_node_id, e)
907+
}
908+
}
909+
910+
self.peer_manager.disconnect_by_node_id(*counterparty_node_id);
911+
Ok(())
912+
}
913+
848914
/// Connect to a node and open a new channel. Disconnects and re-connects are handled automatically
849915
///
850916
/// Returns a temporary channel id

0 commit comments

Comments
 (0)