@@ -103,9 +103,9 @@ use logger::{log_error, log_info, FilesystemLogger, Logger};
103103
104104use lightning:: chain:: keysinterface:: EntropySource ;
105105use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Watch } ;
106- use lightning:: ln:: channelmanager:: { self , RecipientOnionFields } ;
107106use lightning:: ln:: channelmanager:: {
108- ChainParameters , ChannelDetails , ChannelManagerReadArgs , PaymentId , Retry ,
107+ self , ChainParameters , ChannelDetails , ChannelManagerReadArgs , PaymentId , RecipientOnionFields ,
108+ Retry ,
109109} ;
110110use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
111111use lightning:: ln:: { PaymentHash , PaymentPreimage } ;
@@ -843,7 +843,74 @@ impl Node {
843843 self . channel_manager . list_channels ( )
844844 }
845845
846- /// Connect to a node and opens a new channel.
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, address } ;
860+
861+ let con_peer_pubkey = peer_info. pubkey ;
862+ let con_peer_addr = peer_info. address ;
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+ log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. pubkey, peer_info. address, ) ;
882+
883+ if permanently {
884+ self . peer_store . add_peer ( peer_info) ?;
885+ }
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+
913+ /// Connect to a node and open a new channel. Disconnects and re-connects are handled automatically
847914 ///
848915 /// Disconnects and reconnects are handled automatically.
849916 ///
@@ -871,8 +938,8 @@ impl Node {
871938
872939 let peer_info = PeerInfo { pubkey : node_id, address } ;
873940
874- let con_peer_pubkey = peer_info. pubkey . clone ( ) ;
875- let con_peer_addr = peer_info. address . clone ( ) ;
941+ let con_peer_pubkey = peer_info. pubkey ;
942+ let con_peer_addr = peer_info. address ;
876943 let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
877944 let con_success_cloned = Arc :: clone ( & con_success) ;
878945 let con_logger = Arc :: clone ( & self . logger ) ;
@@ -915,12 +982,12 @@ impl Node {
915982 Some ( user_config) ,
916983 ) {
917984 Ok ( _) => {
918- self . peer_store . add_peer ( peer_info. clone ( ) ) ?;
919985 log_info ! (
920986 self . logger,
921987 "Initiated channel creation with peer {}. " ,
922988 peer_info. pubkey
923989 ) ;
990+ self . peer_store . add_peer ( peer_info) ?;
924991 Ok ( ( ) )
925992 }
926993 Err ( e) => {
0 commit comments