Skip to content

Commit 0df58e1

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 8d1b497 commit 0df58e1

File tree

2 files changed

+68
-55
lines changed

2 files changed

+68
-55
lines changed

src/connection.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
for (pman_node_id, _pman_addr) in peer_manager.get_peer_node_ids() {
18+
if node_id == pman_node_id {
19+
return Ok(());
20+
}
21+
}
22+
23+
do_connect_peer(node_id, addr, peer_manager, logger).await
24+
}
25+
26+
pub(crate) async fn do_connect_peer(
27+
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
28+
logger: Arc<FilesystemLogger>,
29+
) -> Result<(), Error> {
30+
log_info!(logger, "Connecting to peer: {}@{}", node_id, addr);
31+
32+
let socket_addr = addr
33+
.to_socket_addrs()
34+
.map_err(|e| {
35+
log_error!(logger, "Failed to resolve network address: {}", e);
36+
Error::InvalidSocketAddress
37+
})?
38+
.next()
39+
.ok_or(Error::ConnectionFailed)?;
40+
41+
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), node_id, socket_addr)
42+
.await
43+
{
44+
Some(connection_closed_future) => {
45+
let mut connection_closed_future = Box::pin(connection_closed_future);
46+
loop {
47+
match futures::poll!(&mut connection_closed_future) {
48+
std::task::Poll::Ready(_) => {
49+
log_info!(logger, "Peer connection closed: {}@{}", node_id, addr);
50+
return Err(Error::ConnectionFailed);
51+
}
52+
std::task::Poll::Pending => {}
53+
}
54+
// Avoid blocking the tokio context by sleeping a bit
55+
match peer_manager.get_peer_node_ids().iter().find(|(id, _addr)| *id == node_id) {
56+
Some(_) => return Ok(()),
57+
None => tokio::time::sleep(Duration::from_millis(10)).await,
58+
}
59+
}
60+
}
61+
None => {
62+
log_error!(logger, "Failed to connect to peer: {}@{}", node_id, addr);
63+
Err(Error::ConnectionFailed)
64+
}
65+
}
66+
}

src/lib.rs

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
7777

7878
mod builder;
79+
mod connection;
7980
mod error;
8081
mod event;
8182
mod fee_estimator;
@@ -116,6 +117,7 @@ pub use builder::BuildError;
116117
#[cfg(not(feature = "uniffi"))]
117118
pub use builder::NodeBuilder as Builder;
118119

120+
use connection::{connect_peer_if_necessary, do_connect_peer};
119121
use event::{EventHandler, EventQueue};
120122
use gossip::GossipSource;
121123
use liquidity::LiquiditySource;
@@ -1831,58 +1833,3 @@ impl Drop for Node {
18311833
let _ = self.stop();
18321834
}
18331835
}
1834-
1835-
async fn connect_peer_if_necessary(
1836-
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
1837-
logger: Arc<FilesystemLogger>,
1838-
) -> Result<(), Error> {
1839-
for (pman_node_id, _pman_addr) in peer_manager.get_peer_node_ids() {
1840-
if node_id == pman_node_id {
1841-
return Ok(());
1842-
}
1843-
}
1844-
1845-
do_connect_peer(node_id, addr, peer_manager, logger).await
1846-
}
1847-
1848-
async fn do_connect_peer(
1849-
node_id: PublicKey, addr: SocketAddress, peer_manager: Arc<PeerManager>,
1850-
logger: Arc<FilesystemLogger>,
1851-
) -> Result<(), Error> {
1852-
log_info!(logger, "Connecting to peer: {}@{}", node_id, addr);
1853-
1854-
let socket_addr = addr
1855-
.to_socket_addrs()
1856-
.map_err(|e| {
1857-
log_error!(logger, "Failed to resolve network address: {}", e);
1858-
Error::InvalidSocketAddress
1859-
})?
1860-
.next()
1861-
.ok_or(Error::ConnectionFailed)?;
1862-
1863-
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), node_id, socket_addr)
1864-
.await
1865-
{
1866-
Some(connection_closed_future) => {
1867-
let mut connection_closed_future = Box::pin(connection_closed_future);
1868-
loop {
1869-
match futures::poll!(&mut connection_closed_future) {
1870-
std::task::Poll::Ready(_) => {
1871-
log_info!(logger, "Peer connection closed: {}@{}", node_id, addr);
1872-
return Err(Error::ConnectionFailed);
1873-
}
1874-
std::task::Poll::Pending => {}
1875-
}
1876-
// Avoid blocking the tokio context by sleeping a bit
1877-
match peer_manager.get_peer_node_ids().iter().find(|(id, _addr)| *id == node_id) {
1878-
Some(_) => return Ok(()),
1879-
None => tokio::time::sleep(Duration::from_millis(10)).await,
1880-
}
1881-
}
1882-
}
1883-
None => {
1884-
log_error!(logger, "Failed to connect to peer: {}@{}", node_id, addr);
1885-
Err(Error::ConnectionFailed)
1886-
}
1887-
}
1888-
}

0 commit comments

Comments
 (0)