@@ -103,9 +103,9 @@ use logger::{log_error, log_info, FilesystemLogger, Logger};
103
103
104
104
use lightning:: chain:: keysinterface:: EntropySource ;
105
105
use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Watch } ;
106
- use lightning:: ln:: channelmanager:: { self , RecipientOnionFields } ;
107
106
use lightning:: ln:: channelmanager:: {
108
- ChainParameters , ChannelDetails , ChannelManagerReadArgs , PaymentId , Retry ,
107
+ self , ChainParameters , ChannelDetails , ChannelManagerReadArgs , PaymentId , RecipientOnionFields ,
108
+ Retry ,
109
109
} ;
110
110
use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
111
111
use lightning:: ln:: { PaymentHash , PaymentPreimage } ;
@@ -843,6 +843,73 @@ impl Node {
843
843
self . channel_manager . list_channels ( )
844
844
}
845
845
846
+ /// Connect to a node on the peer-to-peer network.
847
+ ///
848
+ /// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
849
+ pub fn connect (
850
+ & self , node_id : & PublicKey , address : & SocketAddr , permanently : bool ,
851
+ ) -> Result < ( ) , Error > {
852
+ let runtime_lock = self . running . read ( ) . unwrap ( ) ;
853
+ if runtime_lock. is_none ( ) {
854
+ return Err ( Error :: NotRunning ) ;
855
+ }
856
+
857
+ let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
858
+
859
+ let peer_info = PeerInfo { pubkey : node_id. clone ( ) , address : address. clone ( ) } ;
860
+
861
+ let con_peer_pubkey = peer_info. pubkey . clone ( ) ;
862
+ let con_peer_addr = peer_info. address . clone ( ) ;
863
+ let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
864
+ let con_success_cloned = Arc :: clone ( & con_success) ;
865
+ let con_logger = Arc :: clone ( & self . logger ) ;
866
+ let con_pm = Arc :: clone ( & self . peer_manager ) ;
867
+
868
+ tokio:: task:: block_in_place ( move || {
869
+ runtime. tokio_runtime . block_on ( async move {
870
+ let res =
871
+ connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
872
+ . await ;
873
+ con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
874
+ } )
875
+ } ) ;
876
+
877
+ if !con_success. load ( Ordering :: Acquire ) {
878
+ return Err ( Error :: ConnectionFailed ) ;
879
+ }
880
+
881
+ if permanently {
882
+ self . peer_store . add_peer ( peer_info. clone ( ) ) ?;
883
+ }
884
+
885
+ log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. pubkey, peer_info. address, ) ;
886
+
887
+ Ok ( ( ) )
888
+ }
889
+
890
+ /// Disconnects the peer with the given node id.
891
+ ///
892
+ /// Will also remove the peer from the peer store, i.e., after this has been called we won't
893
+ /// try to reconnect on restart.
894
+ pub fn disconnect ( & self , counterparty_node_id : & PublicKey ) -> Result < ( ) , Error > {
895
+ let runtime_lock = self . running . read ( ) . unwrap ( ) ;
896
+ if runtime_lock. is_none ( ) {
897
+ return Err ( Error :: NotRunning ) ;
898
+ }
899
+
900
+ log_info ! ( self . logger, "Disconnecting peer {}.." , counterparty_node_id) ;
901
+
902
+ match self . peer_store . remove_peer ( & counterparty_node_id) {
903
+ Ok ( ( ) ) => { }
904
+ Err ( e) => {
905
+ log_error ! ( self . logger, "Failed to remove peer {}: {}" , counterparty_node_id, e)
906
+ }
907
+ }
908
+
909
+ self . peer_manager . disconnect_by_node_id ( * counterparty_node_id) ;
910
+ Ok ( ( ) )
911
+ }
912
+
846
913
/// Connect to a node and open a new channel. Disconnects and re-connects are handled automatically
847
914
///
848
915
/// Returns a temporary channel id
0 commit comments