Skip to content

Commit b8bcb04

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 4f4904d commit b8bcb04

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

0 commit comments

Comments
 (0)