Skip to content

Commit 872c3de

Browse files
committed
Implement and expose connect/disconnect
1 parent 4e7fd00 commit 872c3de

File tree

1 file changed

+69
-2
lines changed

1 file changed

+69
-2
lines changed

src/lib.rs

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ 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::{self, RecipientOnionFields};
107106
use lightning::ln::channelmanager::{
108-
ChainParameters, ChannelDetails, ChannelManagerReadArgs, PaymentId, Retry,
107+
self, ChainParameters, ChannelDetails, ChannelManagerReadArgs, PaymentId, RecipientOnionFields,
108+
Retry,
109109
};
110110
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
111111
use lightning::ln::{PaymentHash, PaymentPreimage};
@@ -843,6 +843,73 @@ impl Node {
843843
self.channel_manager.list_channels()
844844
}
845845

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

0 commit comments

Comments
 (0)