X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fcli.rs;h=34987a8bc4f3e32ad10182fe89923dde627527f9;hb=dfe7a0603e61e5709e58212f0165b2b47c27c9fc;hp=c5dda5fc33e11f19cad785bb5e042855e7babf68;hpb=a73d564d2b7f0733578747ed1c2604bd880efcd9;p=ldk-sample diff --git a/src/cli.rs b/src/cli.rs index c5dda5f..34987a8 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -18,7 +18,7 @@ use lightning_invoice::{utils, Currency, Invoice}; use std::env; use std::io; use std::io::{BufRead, Write}; -use std::net::{SocketAddr, TcpStream}; +use std::net::{SocketAddr, ToSocketAddrs}; use std::ops::Deref; use std::path::Path; use std::str::FromStr; @@ -103,7 +103,9 @@ pub(crate) async fn poll_for_user_input( event_notifier: mpsc::Sender<()>, ldk_data_dir: String, logger: Arc, network: Network, ) { - println!("LDK startup successful. To view available commands: \"help\".\nLDK logs are available at /.ldk/logs"); + println!("LDK startup successful. To view available commands: \"help\"."); + println!("LDK logs are available at /.ldk/logs"); + println!("Local Node ID is {}.", channel_manager.get_our_node_id()); let stdin = io::stdin(); print!("> "); io::stdout().flush().unwrap(); // Without flushing, the `>` doesn't print @@ -149,6 +151,7 @@ pub(crate) async fn poll_for_user_input( peer_manager.clone(), event_notifier.clone(), ) + .await .is_err() { print!("> "); @@ -298,6 +301,7 @@ pub(crate) async fn poll_for_user_input( peer_manager.clone(), event_notifier.clone(), ) + .await .is_ok() { println!("SUCCESS: connected to peer {}", pubkey); @@ -402,7 +406,7 @@ fn list_channels(channel_manager: Arc) { } println!("\t\tpending_open: {},", pending_channel); println!("\t\tchannel_value_satoshis: {},", chan_info.channel_value_satoshis); - println!("\t\tchannel_can_send_payments: {},", chan_info.is_live); + println!("\t\tchannel_can_send_payments: {},", chan_info.is_usable); println!("\t}},"); } println!("]"); @@ -450,7 +454,7 @@ fn list_payments(inbound_payments: PaymentInfoStorage, outbound_payments: Paymen println!("]"); } -pub(crate) fn connect_peer_if_necessary( +pub(crate) async fn connect_peer_if_necessary( pubkey: PublicKey, peer_addr: SocketAddr, peer_manager: Arc, event_notifier: mpsc::Sender<()>, ) -> Result<(), ()> { @@ -459,24 +463,36 @@ pub(crate) fn connect_peer_if_necessary( return Ok(()); } } - match TcpStream::connect_timeout(&peer_addr, Duration::from_secs(10)) { - Ok(stream) => { - let peer_mgr = peer_manager.clone(); - let event_ntfns = event_notifier.clone(); - tokio::spawn(async move { - lightning_net_tokio::setup_outbound(peer_mgr, event_ntfns, pubkey, stream).await; - }); + match lightning_net_tokio::connect_outbound( + Arc::clone(&peer_manager), + event_notifier, + pubkey, + peer_addr, + ) + .await + { + Some(conn_closed_fut) => { + let mut closed_fut_box = Box::pin(conn_closed_fut); let mut peer_connected = false; while !peer_connected { + match futures::poll!(&mut closed_fut_box) { + std::task::Poll::Ready(_) => { + println!("ERROR: Peer disconnected before we finished the handshake"); + return Err(()); + } + std::task::Poll::Pending => {} + } for node_pubkey in peer_manager.get_peer_node_ids() { if node_pubkey == pubkey { peer_connected = true; } } + // Avoid blocking the tokio context by sleeping a bit + tokio::time::sleep(Duration::from_millis(10)).await; } } - Err(e) => { - println!("ERROR: failed to connect to peer: {:?}", e); + None => { + println!("ERROR: failed to connect to peer"); return Err(()); } } @@ -623,12 +639,12 @@ pub(crate) fn parse_peer_info( return Err(std::io::Error::new( std::io::ErrorKind::Other, "ERROR: incorrectly formatted peer - info. Should be formatted as: `pubkey@host:port`", + info. Should be formatted as: `pubkey@host:port`", )); } - let peer_addr: Result = peer_addr_str.unwrap().parse(); - if peer_addr.is_err() { + let peer_addr = peer_addr_str.unwrap().to_socket_addrs().map(|mut r| r.next()); + if peer_addr.is_err() || peer_addr.as_ref().unwrap().is_none() { return Err(std::io::Error::new( std::io::ErrorKind::Other, "ERROR: couldn't parse pubkey@host:port into a socket address", @@ -643,5 +659,5 @@ pub(crate) fn parse_peer_info( )); } - Ok((pubkey.unwrap(), peer_addr.unwrap())) + Ok((pubkey.unwrap(), peer_addr.unwrap().unwrap())) }