[][src]Struct libp2p::core::nodes::listeners::ListenersStream

pub struct ListenersStream<TTrans> where
    TTrans: Transport
{ /* fields omitted */ }

Implementation of futures::Stream that allows listening on multiaddresses.

To start using a ListenersStream, create one with new by passing an implementation of Transport. This Transport will be used to start listening, therefore you want to pass a Transport that supports the protocols you wish you listen on.

Then, call ListenerStream::listen_on for all addresses you want to start listening on.

The ListenersStream never ends and never produces errors. If a listener errors or closes, an event is generated on the stream and the listener is then dropped, but the ListenersStream itself continues.

Example

use futures::prelude::*;
use libp2p_core::nodes::listeners::{ListenersEvent, ListenersStream};

let mut listeners = ListenersStream::new(libp2p_tcp::TcpConfig::new());

// Ask the `listeners` to start listening on the given multiaddress.
listeners.listen_on("/ip4/0.0.0.0/tcp/0".parse().unwrap()).unwrap();

// The `listeners` will now generate events when polled.
futures::executor::block_on(async move {
    while let Some(event) = listeners.next().await {
        match event {
            ListenersEvent::NewAddress { listener_id, listen_addr } => {
                println!("Listener {:?} is listening at address {}", listener_id, listen_addr);
            },
            ListenersEvent::AddressExpired { listener_id, listen_addr } => {
                println!("Listener {:?} is no longer listening at address {}", listener_id, listen_addr);
            },
            ListenersEvent::Closed { listener_id, .. } => {
                println!("Listener {:?} has been closed", listener_id);
            },
            ListenersEvent::Error { listener_id, error } => {
                println!("Listener {:?} has experienced an error: {}", listener_id, error);
            },
            ListenersEvent::Incoming { listener_id, upgrade, local_addr, .. } => {
                println!("Listener {:?} has a new connection on {}", listener_id, local_addr);
                // We don't do anything with the newly-opened connection, but in a real-life
                // program you probably want to use it!
                drop(upgrade);
            },
        }
    }
})

Methods

impl<TTrans> ListenersStream<TTrans> where
    TTrans: Transport
[src]

pub fn new(transport: TTrans) -> ListenersStream<TTrans>[src]

Starts a new stream of listeners.

pub fn with_capacity(
    transport: TTrans,
    capacity: usize
) -> ListenersStream<TTrans>
[src]

Same as new, but pre-allocates enough memory for the given number of simultaneous listeners.

pub fn listen_on(
    &mut self,
    addr: Multiaddr
) -> Result<ListenerId, TransportError<<TTrans as Transport>::Error>> where
    TTrans: Clone
[src]

Start listening on a multiaddress.

Returns an error if the transport doesn't support the given multiaddress.

pub fn remove_listener(&mut self, id: ListenerId) -> Result<(), ()>[src]

Remove the listener matching the given ListenerId.

Return Ok(()) if a listener with this ID was in the list.

pub fn transport(&self) -> &TTrans[src]

Returns the transport passed when building this object.

pub fn listen_addrs(&self) -> impl Iterator<Item = &Multiaddr>[src]

Returns an iterator that produces the list of addresses we're listening on.

pub fn poll(
    self: Pin<&mut ListenersStream<TTrans>>,
    cx: &mut Context
) -> Poll<ListenersEvent<TTrans>>
[src]

Provides an API similar to Stream, except that it cannot end.

Trait Implementations

impl<TTrans> Debug for ListenersStream<TTrans> where
    TTrans: Transport + Debug
[src]

impl<TTrans> Stream for ListenersStream<TTrans> where
    TTrans: Transport
[src]

type Item = ListenersEvent<TTrans>

Values yielded by the stream.

impl<TTrans> Unpin for ListenersStream<TTrans> where
    TTrans: Transport
[src]

Auto Trait Implementations

impl<TTrans> RefUnwindSafe for ListenersStream<TTrans> where
    TTrans: RefUnwindSafe,
    <TTrans as Transport>::Listener: RefUnwindSafe

impl<TTrans> Send for ListenersStream<TTrans> where
    TTrans: Send,
    <TTrans as Transport>::Listener: Send

impl<TTrans> Sync for ListenersStream<TTrans> where
    TTrans: Sync,
    <TTrans as Transport>::Listener: Sync

impl<TTrans> UnwindSafe for ListenersStream<TTrans> where
    TTrans: UnwindSafe,
    <TTrans as Transport>::Listener: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> StreamExt for T where
    T: Stream + ?Sized
[src]

impl<T> StreamExt for T where
    T: Stream + ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,