Skip to content

Commit b826243

Browse files
committed
impl ConnectedPeerManager
1 parent 461e13f commit b826243

File tree

4 files changed

+104
-1
lines changed

4 files changed

+104
-1
lines changed

mutiny-core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ mod networking;
2828
mod node;
2929
pub mod nodemanager;
3030
mod onchain;
31-
mod peermanager;
31+
pub mod peermanager;
3232
pub mod scorer;
3333
pub mod storage;
3434
mod subscription;

mutiny-core/src/messagehandler.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use lightning::util::ser::{Writeable, Writer};
1010
use serde::{Deserialize, Serialize};
1111

1212
use crate::node::LiquidityManager;
13+
use crate::peermanager::CONNECTED_PEER_MANAGER;
1314
use crate::storage::MutinyStorage;
1415

1516
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)]
@@ -175,6 +176,14 @@ impl<S: MutinyStorage> CustomMessageHandler for MutinyMessageHandler<S> {
175176
msg: &lightning::ln::msgs::Init,
176177
inbound: bool,
177178
) -> Result<(), ()> {
179+
CONNECTED_PEER_MANAGER.add_peer(
180+
*their_node_id,
181+
inbound,
182+
msg.remote_network_address
183+
.as_ref()
184+
.map(|addr| format!("{}", addr)),
185+
);
186+
178187
if let Some(cb) = self.ln_event_callback.clone() {
179188
let event = CommonLnEvent::OnConnect {
180189
their_node_id: their_node_id.to_string(),
@@ -190,6 +199,8 @@ impl<S: MutinyStorage> CustomMessageHandler for MutinyMessageHandler<S> {
190199
}
191200

192201
fn peer_disconnected(&self, their_node_id: &PublicKey) {
202+
CONNECTED_PEER_MANAGER.remove_peer(their_node_id);
203+
193204
if let Some(cb) = self.ln_event_callback.clone() {
194205
let event = CommonLnEvent::OnDisconnect {
195206
their_node_id: their_node_id.to_string(),

mutiny-core/src/peermanager.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ use lightning::routing::gossip::NodeId;
2424
use lightning::util::logger::Logger;
2525
use lightning::{ln::msgs::SocketAddress, log_warn};
2626
use lightning::{log_debug, log_error};
27+
use std::collections::HashMap;
2728
use std::sync::atomic::AtomicBool;
2829
use std::sync::Arc;
30+
use utils::Mutex;
2931

3032
#[cfg(target_arch = "wasm32")]
3133
use crate::networking::ws_socket::WsTcpSocketDescriptor;
@@ -36,6 +38,9 @@ use lightning::ln::peer_handler::SocketDescriptor as LdkSocketDescriptor;
3638
#[cfg(target_arch = "wasm32")]
3739
use crate::networking::proxy::WsProxy;
3840

41+
pub static CONNECTED_PEER_MANAGER: once_cell::sync::Lazy<ConnectedPeerManager> =
42+
once_cell::sync::Lazy::new(ConnectedPeerManager::default);
43+
3944
#[allow(dead_code)]
4045
pub trait PeerManager: Send + Sync + 'static {
4146
fn get_peer_node_ids(&self) -> Vec<PublicKey>;
@@ -581,3 +586,88 @@ fn try_parse_addr_string(addr: &str) -> (Option<std::net::SocketAddr>, Option<So
581586
});
582587
(socket_addr, net_addr)
583588
}
589+
590+
#[derive(Debug, Clone)]
591+
pub struct ConnectedPeerInfo {
592+
pub inbound: bool,
593+
pub remote_address: Option<String>,
594+
pub connected_at_timestamp: u64,
595+
}
596+
597+
pub struct ConnectedPeerManager {
598+
peers: Arc<Mutex<HashMap<PublicKey, ConnectedPeerInfo>>>,
599+
logger: Mutex<Option<Arc<MutinyLogger>>>,
600+
}
601+
602+
impl Default for ConnectedPeerManager {
603+
fn default() -> Self {
604+
Self::new()
605+
}
606+
}
607+
608+
impl ConnectedPeerManager {
609+
pub fn new() -> Self {
610+
Self {
611+
peers: Arc::new(Mutex::new(HashMap::new())),
612+
logger: Mutex::new(None),
613+
}
614+
}
615+
616+
pub fn set_logger(&self, logger: Arc<MutinyLogger>) {
617+
let mut lock = self.logger.lock().unwrap();
618+
*lock = Some(logger);
619+
}
620+
621+
pub fn add_peer(
622+
&self,
623+
their_node_id: PublicKey,
624+
inbound: bool,
625+
remote_address: Option<String>,
626+
) {
627+
let timestamp = utils::now().as_secs();
628+
629+
let info = ConnectedPeerInfo {
630+
inbound,
631+
remote_address,
632+
connected_at_timestamp: timestamp,
633+
};
634+
635+
let mut peers = self.peers.lock().unwrap();
636+
let inserted = peers.insert(their_node_id, info).is_none();
637+
let logger = {
638+
let guard = self.logger.lock().expect(
639+
"
640+
Failed to lock logger",
641+
);
642+
guard.clone()
643+
};
644+
if inserted {
645+
if let Some(logger) = logger {
646+
log_debug!(logger, "Connected to peer: {}", their_node_id);
647+
}
648+
}
649+
}
650+
651+
pub fn remove_peer(&self, their_node_id: &PublicKey) {
652+
let mut peers = self.peers.lock().unwrap();
653+
let removed = peers.remove(their_node_id).is_some();
654+
655+
let logger = {
656+
let guard = self.logger.lock().expect(
657+
"
658+
Failed to lock logger",
659+
);
660+
guard.clone()
661+
};
662+
if removed {
663+
if let Some(logger) = logger {
664+
log_debug!(logger, "Disconnected from peer: {}", their_node_id);
665+
}
666+
}
667+
}
668+
669+
pub fn is_any_connected(&self) -> bool {
670+
let lock = self.peers.lock().unwrap();
671+
!lock.is_empty()
672+
}
673+
}

mutiny-wasm/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use mutiny_core::authmanager::AuthManager;
3232
use mutiny_core::encrypt::decrypt_with_password;
3333
use mutiny_core::error::MutinyError;
3434
use mutiny_core::messagehandler::{CommonLnEvent, CommonLnEventCallback};
35+
use mutiny_core::peermanager::CONNECTED_PEER_MANAGER;
3536
use mutiny_core::storage::{DeviceLock, MutinyStorage, DEVICE_LOCK_KEY};
3637
use mutiny_core::utils::sleep;
3738
use mutiny_core::vss::{MutinyVssClient, VSS_MANAGER};
@@ -225,6 +226,7 @@ impl MutinyWallet {
225226
log_info!(logger, "Node version {version}");
226227

227228
VSS_MANAGER.set_logger(logger.clone());
229+
CONNECTED_PEER_MANAGER.set_logger(logger.clone());
228230

229231
let cipher = password
230232
.as_ref()

0 commit comments

Comments
 (0)