@@ -799,6 +799,71 @@ impl Node {
799
799
self . channel_manager . list_channels ( )
800
800
}
801
801
802
+ /// Connect to a node on the peer-to-peer network.
803
+ ///
804
+ /// If `permanently` is set to `true`, we'll remember the peer and reconnect on restart.
805
+ pub fn connect_peer (
806
+ & self , node_pubkey_and_address : & str , permanently : bool ) -> Result < ( ) , Error > {
807
+ let runtime_lock = self . running . read ( ) . unwrap ( ) ;
808
+ if runtime_lock. is_none ( ) {
809
+ return Err ( Error :: NotRunning ) ;
810
+ }
811
+
812
+ let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
813
+
814
+ let peer_info = PeerInfo :: try_from ( node_pubkey_and_address. to_string ( ) ) ?;
815
+
816
+ let con_peer_pubkey = peer_info. pubkey . clone ( ) ;
817
+ let con_peer_addr = peer_info. address . clone ( ) ;
818
+ let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
819
+ let con_success_cloned = Arc :: clone ( & con_success) ;
820
+ let con_logger = Arc :: clone ( & self . logger ) ;
821
+ let con_pm = Arc :: clone ( & self . peer_manager ) ;
822
+
823
+ tokio:: task:: block_in_place ( move || {
824
+ runtime. tokio_runtime . block_on ( async move {
825
+ let res =
826
+ connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
827
+ . await ;
828
+ con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
829
+ } )
830
+ } ) ;
831
+
832
+ if !con_success. load ( Ordering :: Acquire ) {
833
+ return Err ( Error :: ConnectionFailed ) ;
834
+ }
835
+
836
+ if permanently {
837
+ self . peer_store . add_peer ( peer_info. clone ( ) ) ?;
838
+ }
839
+
840
+ log_info ! (
841
+ self . logger,
842
+ "Connected to peer {}@{}. " ,
843
+ peer_info. pubkey,
844
+ peer_info. address,
845
+ ) ;
846
+ Ok ( ( ) )
847
+ }
848
+
849
+ /// Disconnects the peer with the given node id.
850
+ ///
851
+ /// Will also remove the peer from the peer store, i.e., after this has been called we won't
852
+ /// try to reconnect on restart.
853
+ pub fn disconnect_peer ( & self , counterparty_node_id : & PublicKey ) {
854
+ log_info ! (
855
+ self . logger,
856
+ "Disconnecting peer {}.." ,
857
+ counterparty_node_id,
858
+ ) ;
859
+
860
+ match self . peer_store . remove_peer ( counterparty_node_id) {
861
+ Ok ( ( ) ) => { } ,
862
+ Err ( e) => log_error ! ( self . logger, "Failed to remove peer {}: {}" , counterparty_node_id, e) ,
863
+ }
864
+ self . peer_manager . disconnect_by_node_id ( * counterparty_node_id) ;
865
+ }
866
+
802
867
/// Connect to a node and open a new channel. Disconnects and re-connects are handled automatically
803
868
///
804
869
/// Returns a temporary channel id
@@ -1237,15 +1302,15 @@ async fn do_connect_peer(
1237
1302
pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1238
1303
logger : Arc < FilesystemLogger > ,
1239
1304
) -> Result < ( ) , Error > {
1240
- log_info ! ( logger, "connecting to peer: {}@{}" , pubkey, peer_addr) ;
1305
+ log_info ! ( logger, "Connecting to peer: {}@{}" , pubkey, peer_addr) ;
1241
1306
match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , pubkey, peer_addr) . await
1242
1307
{
1243
1308
Some ( connection_closed_future) => {
1244
1309
let mut connection_closed_future = Box :: pin ( connection_closed_future) ;
1245
1310
loop {
1246
1311
match futures:: poll!( & mut connection_closed_future) {
1247
1312
std:: task:: Poll :: Ready ( _) => {
1248
- log_info ! ( logger, "peer connection closed: {}@{}" , pubkey, peer_addr) ;
1313
+ log_info ! ( logger, "Peer connection closed: {}@{}" , pubkey, peer_addr) ;
1249
1314
return Err ( Error :: ConnectionFailed ) ;
1250
1315
}
1251
1316
std:: task:: Poll :: Pending => { }
@@ -1258,7 +1323,7 @@ async fn do_connect_peer(
1258
1323
}
1259
1324
}
1260
1325
None => {
1261
- log_error ! ( logger, "failed to connect to peer: {}@{}" , pubkey, peer_addr) ;
1326
+ log_error ! ( logger, "Failed to connect to peer: {}@{}" , pubkey, peer_addr) ;
1262
1327
Err ( Error :: ConnectionFailed )
1263
1328
}
1264
1329
}
0 commit comments