@@ -24,8 +24,10 @@ use lightning::routing::gossip::NodeId;
2424use lightning:: util:: logger:: Logger ;
2525use lightning:: { ln:: msgs:: SocketAddress , log_warn} ;
2626use lightning:: { log_debug, log_error} ;
27+ use std:: collections:: HashMap ;
2728use std:: sync:: atomic:: AtomicBool ;
2829use std:: sync:: Arc ;
30+ use utils:: Mutex ;
2931
3032#[ cfg( target_arch = "wasm32" ) ]
3133use crate :: networking:: ws_socket:: WsTcpSocketDescriptor ;
@@ -36,6 +38,9 @@ use lightning::ln::peer_handler::SocketDescriptor as LdkSocketDescriptor;
3638#[ cfg( target_arch = "wasm32" ) ]
3739use 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) ]
4045pub trait PeerManager : Send + Sync + ' static {
4146 fn get_peer_node_ids ( & self ) -> Vec < PublicKey > ;
@@ -581,3 +586,82 @@ 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 ( "Failed to lock logger" ) ;
639+ guard. clone ( )
640+ } ;
641+ if inserted {
642+ if let Some ( logger) = logger {
643+ log_debug ! ( logger, "Connected to peer: {}" , their_node_id) ;
644+ }
645+ }
646+ }
647+
648+ pub fn remove_peer ( & self , their_node_id : & PublicKey ) {
649+ let mut peers = self . peers . lock ( ) . unwrap ( ) ;
650+ let removed = peers. remove ( their_node_id) . is_some ( ) ;
651+
652+ let logger = {
653+ let guard = self . logger . lock ( ) . expect ( "Failed to lock logger" ) ;
654+ guard. clone ( )
655+ } ;
656+ if removed {
657+ if let Some ( logger) = logger {
658+ log_debug ! ( logger, "Disconnected from peer: {}" , their_node_id) ;
659+ }
660+ }
661+ }
662+
663+ pub fn is_any_connected ( & self ) -> bool {
664+ let lock = self . peers . lock ( ) . unwrap ( ) ;
665+ !lock. is_empty ( )
666+ }
667+ }
0 commit comments