Skip to content

Commit 84780ba

Browse files
committed
WIP connect/disconnect
1 parent 1f7d8c9 commit 84780ba

File tree

1 file changed

+68
-3
lines changed

1 file changed

+68
-3
lines changed

src/lib.rs

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,71 @@ impl Node {
799799
self.channel_manager.list_channels()
800800
}
801801

802+
/// Connect to a node on the peer-to-peer network.
803+
///
804+
/// If `permanently` is set to `true`, we'll remember the peer and reconnect on restart.
805+
pub fn connect_peer(
806+
&self, node_pubkey_and_address: &str, permanently: bool) -> Result<(), Error> {
807+
let runtime_lock = self.running.read().unwrap();
808+
if runtime_lock.is_none() {
809+
return Err(Error::NotRunning);
810+
}
811+
812+
let runtime = runtime_lock.as_ref().unwrap();
813+
814+
let peer_info = PeerInfo::try_from(node_pubkey_and_address.to_string())?;
815+
816+
let con_peer_pubkey = peer_info.pubkey.clone();
817+
let con_peer_addr = peer_info.address.clone();
818+
let con_success = Arc::new(AtomicBool::new(false));
819+
let con_success_cloned = Arc::clone(&con_success);
820+
let con_logger = Arc::clone(&self.logger);
821+
let con_pm = Arc::clone(&self.peer_manager);
822+
823+
tokio::task::block_in_place(move || {
824+
runtime.tokio_runtime.block_on(async move {
825+
let res =
826+
connect_peer_if_necessary(con_peer_pubkey, con_peer_addr, con_pm, con_logger)
827+
.await;
828+
con_success_cloned.store(res.is_ok(), Ordering::Release);
829+
})
830+
});
831+
832+
if !con_success.load(Ordering::Acquire) {
833+
return Err(Error::ConnectionFailed);
834+
}
835+
836+
if permanently {
837+
self.peer_store.add_peer(peer_info.clone())?;
838+
}
839+
840+
log_info!(
841+
self.logger,
842+
"Connected to peer {}@{}. ",
843+
peer_info.pubkey,
844+
peer_info.address,
845+
);
846+
Ok(())
847+
}
848+
849+
/// Disconnects the peer with the given node id.
850+
///
851+
/// Will also remove the peer from the peer store, i.e., after this has been called we won't
852+
/// try to reconnect on restart.
853+
pub fn disconnect_peer(&self, counterparty_node_id: &PublicKey) {
854+
log_info!(
855+
self.logger,
856+
"Disconnecting peer {}..",
857+
counterparty_node_id,
858+
);
859+
860+
match self.peer_store.remove_peer(counterparty_node_id) {
861+
Ok(()) => {},
862+
Err(e) => log_error!(self.logger, "Failed to remove peer {}: {}", counterparty_node_id, e),
863+
}
864+
self.peer_manager.disconnect_by_node_id(*counterparty_node_id);
865+
}
866+
802867
/// Connect to a node and open a new channel. Disconnects and re-connects are handled automatically
803868
///
804869
/// Returns a temporary channel id
@@ -1237,15 +1302,15 @@ async fn do_connect_peer(
12371302
pubkey: PublicKey, peer_addr: SocketAddr, peer_manager: Arc<PeerManager>,
12381303
logger: Arc<FilesystemLogger>,
12391304
) -> Result<(), Error> {
1240-
log_info!(logger, "connecting to peer: {}@{}", pubkey, peer_addr);
1305+
log_info!(logger, "Connecting to peer: {}@{}", pubkey, peer_addr);
12411306
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), pubkey, peer_addr).await
12421307
{
12431308
Some(connection_closed_future) => {
12441309
let mut connection_closed_future = Box::pin(connection_closed_future);
12451310
loop {
12461311
match futures::poll!(&mut connection_closed_future) {
12471312
std::task::Poll::Ready(_) => {
1248-
log_info!(logger, "peer connection closed: {}@{}", pubkey, peer_addr);
1313+
log_info!(logger, "Peer connection closed: {}@{}", pubkey, peer_addr);
12491314
return Err(Error::ConnectionFailed);
12501315
}
12511316
std::task::Poll::Pending => {}
@@ -1258,7 +1323,7 @@ async fn do_connect_peer(
12581323
}
12591324
}
12601325
None => {
1261-
log_error!(logger, "failed to connect to peer: {}@{}", pubkey, peer_addr);
1326+
log_error!(logger, "Failed to connect to peer: {}@{}", pubkey, peer_addr);
12621327
Err(Error::ConnectionFailed)
12631328
}
12641329
}

0 commit comments

Comments
 (0)