Skip to content

Commit 54e7641

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 abd8d1d commit 54e7641

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;
@@ -1740,56 +1742,3 @@ impl Drop for Node {
17401742
let _ = self.stop();
17411743
}
17421744
}
1743-
1744-
async fn connect_peer_if_necessary(
1745-
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
1746-
logger: Arc<FilesystemLogger>,
1747-
) -> Result<(), Error> {
1748-
if peer_manager.peer_by_node_id(&node_id).is_some() {
1749-
return Ok(());
1750-
}
1751-
1752-
do_connect_peer(node_id, addr, peer_manager, logger).await
1753-
}
1754-
1755-
async fn do_connect_peer(
1756-
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
1757-
logger: Arc<FilesystemLogger>,
1758-
) -> Result<(), Error> {
1759-
log_info!(logger, "Connecting to peer: {}@{}", node_id, addr);
1760-
1761-
let socket_addr = addr
1762-
.to_socket_addrs()
1763-
.map_err(|e| {
1764-
log_error!(logger, "Failed to resolve network address: {}", e);
1765-
Error::InvalidSocketAddress
1766-
})?
1767-
.next()
1768-
.ok_or(Error::ConnectionFailed)?;
1769-
1770-
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), node_id, socket_addr)
1771-
.await
1772-
{
1773-
Some(connection_closed_future) => {
1774-
let mut connection_closed_future = Box::pin(connection_closed_future);
1775-
loop {
1776-
match futures::poll!(&mut connection_closed_future) {
1777-
std::task::Poll::Ready(_) => {
1778-
log_info!(logger, "Peer connection closed: {}@{}", node_id, addr);
1779-
return Err(Error::ConnectionFailed);
1780-
},
1781-
std::task::Poll::Pending => {},
1782-
}
1783-
// Avoid blocking the tokio context by sleeping a bit
1784-
match peer_manager.peer_by_node_id(&node_id) {
1785-
Some(_) => return Ok(()),
1786-
None => tokio::time::sleep(Duration::from_millis(10)).await,
1787-
}
1788-
}
1789-
},
1790-
None => {
1791-
log_error!(logger, "Failed to connect to peer: {}@{}", node_id, addr);
1792-
Err(Error::ConnectionFailed)
1793-
},
1794-
}
1795-
}

0 commit comments

Comments
 (0)