diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 2297fe6a52f72..a678564722e2f 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -41,7 +41,7 @@ use crate::{ protocol::{self, event::Event, LegacyConnectionKillError, sync::SyncState, PeerInfo, Protocol}, transport, ReputationChange, }; -use futures::prelude::*; +use futures::{channel::oneshot, prelude::*}; use libp2p::{PeerId, Multiaddr}; use libp2p::core::{ConnectedPoint, Executor, connection::{ConnectionError, PendingConnectionError}, either::EitherError}; use libp2p::kad::record; @@ -747,6 +747,15 @@ impl NetworkService { .unbounded_send(ServiceToWorkerMsg::UpdateChain); } + /// Returns a stream containing the listen addresses + pub fn listen_addresses(&self) -> impl Future> { + let (tx, rx) = oneshot::channel(); + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::ListenAddresses(tx)); + + async { + rx.await.expect("the sender is never dropped; qed") + } + } } impl sp_consensus::SyncOracle @@ -813,6 +822,7 @@ enum ServiceToWorkerMsg { }, DisconnectPeer(PeerId), UpdateChain, + ListenAddresses(oneshot::Sender>), } /// Main network worker. Must be polled in order for the network to advance. @@ -1143,6 +1153,9 @@ impl Future for NetworkWorker { this.network_service.user_protocol_mut().disconnect_peer(&who), ServiceToWorkerMsg::UpdateChain => this.network_service.user_protocol_mut().update_chain(), + ServiceToWorkerMsg::ListenAddresses(sender) => { + let _ = sender.send(this.listen_addresses().cloned().collect()); + }, } }