Skip to content

Commit c1ac3d3

Browse files
committed
Move connection logic to connection.rs
.. just a minor cleanup to further modularize the codebase. Also, we'll be reusing these methods in `Event::ConnectionNeeded` soon.
1 parent d40bf0e commit c1ac3d3

File tree

2 files changed

+66
-53
lines changed

2 files changed

+66
-53
lines changed

src/connection.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use crate::logger::{log_error, log_info, FilesystemLogger, Logger};
2+
use crate::types::PeerManager;
3+
use crate::Error;
4+
5+
use lightning::ln::msgs::SocketAddress;
6+
7+
use bitcoin::secp256k1::PublicKey;
8+
9+
use std::net::ToSocketAddrs;
10+
use std::sync::Arc;
11+
use std::time::Duration;
12+
13+
pub(crate) async fn connect_peer_if_necessary(
14+
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
15+
logger: Arc<FilesystemLogger>,
16+
) -> Result<(), Error> {
17+
if peer_manager.peer_by_node_id(&node_id).is_some() {
18+
return Ok(());
19+
}
20+
21+
do_connect_peer(node_id, addr, peer_manager, logger).await
22+
}
23+
24+
pub(crate) async fn do_connect_peer(
25+
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
26+
logger: Arc<FilesystemLogger>,
27+
) -> Result<(), Error> {
28+
log_info!(logger, "Connecting to peer: {}@{}", node_id, addr);
29+
30+
let socket_addr = addr
31+
.to_socket_addrs()
32+
.map_err(|e| {
33+
log_error!(logger, "Failed to resolve network address: {}", e);
34+
Error::InvalidSocketAddress
35+
})?
36+
.next()
37+
.ok_or(Error::ConnectionFailed)?;
38+
39+
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), node_id, socket_addr)
40+
.await
41+
{
42+
Some(connection_closed_future) => {
43+
let mut connection_closed_future = Box::pin(connection_closed_future);
44+
loop {
45+
match futures::poll!(&mut connection_closed_future) {
46+
std::task::Poll::Ready(_) => {
47+
log_info!(logger, "Peer connection closed: {}@{}", node_id, addr);
48+
return Err(Error::ConnectionFailed);
49+
},
50+
std::task::Poll::Pending => {},
51+
}
52+
// Avoid blocking the tokio context by sleeping a bit
53+
match peer_manager.peer_by_node_id(&node_id) {
54+
Some(_) => return Ok(()),
55+
None => tokio::time::sleep(Duration::from_millis(10)).await,
56+
}
57+
}
58+
},
59+
None => {
60+
log_error!(logger, "Failed to connect to peer: {}@{}", node_id, addr);
61+
Err(Error::ConnectionFailed)
62+
},
63+
}
64+
}

src/lib.rs

Lines changed: 2 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
mod balance;
7979
mod builder;
8080
mod config;
81+
mod connection;
8182
mod error;
8283
mod event;
8384
mod fee_estimator;
@@ -124,6 +125,7 @@ use config::{
124125
LDK_PAYMENT_RETRY_TIMEOUT, NODE_ANN_BCAST_INTERVAL, PEER_RECONNECTION_INTERVAL,
125126
RGS_SYNC_INTERVAL, WALLET_SYNC_INTERVAL_MINIMUM_SECS,
126127
};
128+
use connection::{connect_peer_if_necessary, do_connect_peer};
127129
use event::{EventHandler, EventQueue};
128130
use gossip::GossipSource;
129131
use liquidity::LiquiditySource;
@@ -1847,56 +1849,3 @@ pub struct NodeStatus {
18471849
/// Will be `None` if we have no public channels or we haven't broadcasted since the [`Node`] was initialized.
18481850
pub latest_node_announcement_broadcast_timestamp: Option<u64>,
18491851
}
1850-
1851-
async fn connect_peer_if_necessary(
1852-
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
1853-
logger: Arc<FilesystemLogger>,
1854-
) -> Result<(), Error> {
1855-
if peer_manager.peer_by_node_id(&node_id).is_some() {
1856-
return Ok(());
1857-
}
1858-
1859-
do_connect_peer(node_id, addr, peer_manager, logger).await
1860-
}
1861-
1862-
async fn do_connect_peer(
1863-
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
1864-
logger: Arc<FilesystemLogger>,
1865-
) -> Result<(), Error> {
1866-
log_info!(logger, "Connecting to peer: {}@{}", node_id, addr);
1867-
1868-
let socket_addr = addr
1869-
.to_socket_addrs()
1870-
.map_err(|e| {
1871-
log_error!(logger, "Failed to resolve network address: {}", e);
1872-
Error::InvalidSocketAddress
1873-
})?
1874-
.next()
1875-
.ok_or(Error::ConnectionFailed)?;
1876-
1877-
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), node_id, socket_addr)
1878-
.await
1879-
{
1880-
Some(connection_closed_future) => {
1881-
let mut connection_closed_future = Box::pin(connection_closed_future);
1882-
loop {
1883-
match futures::poll!(&mut connection_closed_future) {
1884-
std::task::Poll::Ready(_) => {
1885-
log_info!(logger, "Peer connection closed: {}@{}", node_id, addr);
1886-
return Err(Error::ConnectionFailed);
1887-
},
1888-
std::task::Poll::Pending => {},
1889-
}
1890-
// Avoid blocking the tokio context by sleeping a bit
1891-
match peer_manager.peer_by_node_id(&node_id) {
1892-
Some(_) => return Ok(()),
1893-
None => tokio::time::sleep(Duration::from_millis(10)).await,
1894-
}
1895-
}
1896-
},
1897-
None => {
1898-
log_error!(logger, "Failed to connect to peer: {}@{}", node_id, addr);
1899-
Err(Error::ConnectionFailed)
1900-
},
1901-
}
1902-
}

0 commit comments

Comments
 (0)