pub trait ConnectionHandler: Send + 'static {
    type InEvent: Debug + Send + 'static;
    type OutEvent: Debug + Send + 'static;
    type Error: Error + Debug + Send + 'static;
    type InboundProtocol: InboundUpgradeSend;
    type OutboundProtocol: OutboundUpgradeSend;
    type InboundOpenInfo: Send + 'static;
    type OutboundOpenInfo: Send + 'static;

Show 14 methods // Required methods fn listen_protocol( &self ) -> SubstreamProtocol<Self::InboundProtocol, Self::InboundOpenInfo>; fn connection_keep_alive(&self) -> KeepAlive; fn poll( &mut self, cx: &mut Context<'_> ) -> Poll<ConnectionHandlerEvent<Self::OutboundProtocol, Self::OutboundOpenInfo, Self::OutEvent, Self::Error>>; // Provided methods fn inject_fully_negotiated_inbound( &mut self, protocol: <Self::InboundProtocol as InboundUpgradeSend>::Output, info: Self::InboundOpenInfo ) { ... } fn inject_fully_negotiated_outbound( &mut self, protocol: <Self::OutboundProtocol as OutboundUpgradeSend>::Output, info: Self::OutboundOpenInfo ) { ... } fn inject_event(&mut self, event: Self::InEvent) { ... } fn inject_address_change(&mut self, new_address: &Multiaddr) { ... } fn inject_dial_upgrade_error( &mut self, info: Self::OutboundOpenInfo, error: ConnectionHandlerUpgrErr<<Self::OutboundProtocol as OutboundUpgradeSend>::Error> ) { ... } fn inject_listen_upgrade_error( &mut self, info: Self::InboundOpenInfo, error: ConnectionHandlerUpgrErr<<Self::InboundProtocol as InboundUpgradeSend>::Error> ) { ... } fn map_in_event<TNewIn, TMap>( self, map: TMap ) -> MapInEvent<Self, TNewIn, TMap> where Self: Sized, TMap: Fn(&TNewIn) -> Option<&Self::InEvent> { ... } fn map_out_event<TMap, TNewOut>(self, map: TMap) -> MapOutEvent<Self, TMap> where Self: Sized, TMap: FnMut(Self::OutEvent) -> TNewOut { ... } fn select<TProto2>( self, other: TProto2 ) -> ConnectionHandlerSelect<Self, TProto2> where Self: Sized { ... } fn on_behaviour_event(&mut self, _event: Self::InEvent) { ... } fn on_connection_event( &mut self, _event: ConnectionEvent<'_, Self::InboundProtocol, Self::OutboundProtocol, Self::InboundOpenInfo, Self::OutboundOpenInfo> ) { ... }
}
Expand description

A handler for a set of protocols used on a connection with a remote.

This trait should be implemented for a type that maintains the state for the execution of a specific protocol with a remote.

Handling a protocol

Communication with a remote over a set of protocols is initiated in one of two ways:

  1. Dialing by initiating a new outbound substream. In order to do so, ConnectionHandler::poll() must return an ConnectionHandlerEvent::OutboundSubstreamRequest, providing an instance of libp2p_core::upgrade::OutboundUpgrade that is used to negotiate the protocol(s). Upon success, ConnectionHandler::on_connection_event is called with ConnectionEvent::FullyNegotiatedOutbound translating the final output of the upgrade.

  2. Listening by accepting a new inbound substream. When a new inbound substream is created on a connection, ConnectionHandler::listen_protocol is called to obtain an instance of libp2p_core::upgrade::InboundUpgrade that is used to negotiate the protocol(s). Upon success, ConnectionHandler::on_connection_event is called with ConnectionEvent::FullyNegotiatedInbound translating the final output of the upgrade.

Connection Keep-Alive

A ConnectionHandler can influence the lifetime of the underlying connection through ConnectionHandler::connection_keep_alive. That is, the protocol implemented by the handler can include conditions for terminating the connection. The lifetime of successfully negotiated substreams is fully controlled by the handler.

Implementors of this trait should keep in mind that the connection can be closed at any time. When a connection is closed gracefully, the substreams used by the handler may still continue reading data until the remote closes its side of the connection.

Required Associated Types§

source

type InEvent: Debug + Send + 'static

Custom event that can be received from the outside.

source

type OutEvent: Debug + Send + 'static

Custom event that can be produced by the handler and that will be returned to the outside.

source

type Error: Error + Debug + Send + 'static

The type of errors returned by ConnectionHandler::poll.

source

type InboundProtocol: InboundUpgradeSend

The inbound upgrade for the protocol(s) used by the handler.

source

type OutboundProtocol: OutboundUpgradeSend

The outbound upgrade for the protocol(s) used by the handler.

source

type InboundOpenInfo: Send + 'static

The type of additional information returned from listen_protocol.

source

type OutboundOpenInfo: Send + 'static

The type of additional information passed to an OutboundSubstreamRequest.

Required Methods§

source

fn listen_protocol( &self ) -> SubstreamProtocol<Self::InboundProtocol, Self::InboundOpenInfo>

The InboundUpgrade to apply on inbound substreams to negotiate the desired protocols.

Note: The returned InboundUpgrade should always accept all the generally supported protocols, even if in a specific context a particular one is not supported, (eg. when only allowing one substream at a time for a protocol). This allows a remote to put the list of supported protocols in a cache.

source

fn connection_keep_alive(&self) -> KeepAlive

Returns until when the connection should be kept alive.

This method is called by the Swarm after each invocation of ConnectionHandler::poll to determine if the connection and the associated ConnectionHandlers should be kept alive as far as this handler is concerned and if so, for how long.

Returning KeepAlive::No indicates that the connection should be closed and this handler destroyed immediately.

Returning KeepAlive::Until indicates that the connection may be closed and this handler destroyed after the specified Instant.

Returning KeepAlive::Yes indicates that the connection should be kept alive until the next call to this method.

Note: The connection is always closed and the handler destroyed when ConnectionHandler::poll returns an error. Furthermore, the connection may be closed for reasons outside of the control of the handler.

source

fn poll( &mut self, cx: &mut Context<'_> ) -> Poll<ConnectionHandlerEvent<Self::OutboundProtocol, Self::OutboundOpenInfo, Self::OutEvent, Self::Error>>

Should behave like Stream::poll().

Provided Methods§

source

fn inject_fully_negotiated_inbound( &mut self, protocol: <Self::InboundProtocol as InboundUpgradeSend>::Output, info: Self::InboundOpenInfo )

👎Deprecated since 0.41.0: Handle ConnectionEvent::FullyNegotiatedInbound on ConnectionHandler::on_connection_event instead. The default implemention of this inject_* method delegates to it.

Injects the output of a successful upgrade on a new inbound substream.

Note that it is up to the ConnectionHandler implementation to manage the lifetime of the negotiated inbound substreams. E.g. the implementation has to enforce a limit on the number of simultaneously open negotiated inbound substreams. In other words it is up to the ConnectionHandler implementation to stop a malicious remote node to open and keep alive an excessive amount of inbound substreams.

source

fn inject_fully_negotiated_outbound( &mut self, protocol: <Self::OutboundProtocol as OutboundUpgradeSend>::Output, info: Self::OutboundOpenInfo )

👎Deprecated since 0.41.0: Handle ConnectionEvent::FullyNegotiatedOutbound on ConnectionHandler::on_connection_event instead. The default implemention of this inject_* method delegates to it.

Injects the output of a successful upgrade on a new outbound substream.

The second argument is the information that was previously passed to ConnectionHandlerEvent::OutboundSubstreamRequest.

source

fn inject_event(&mut self, event: Self::InEvent)

👎Deprecated since 0.41.0: Implement ConnectionHandler::on_behaviour_event instead. The default implementation of inject_event delegates to it.

Injects an event coming from the outside in the handler.

source

fn inject_address_change(&mut self, new_address: &Multiaddr)

👎Deprecated since 0.41.0: Handle ConnectionEvent::AddressChange on ConnectionHandler::on_connection_event instead. The default implemention of this inject_* method delegates to it.

Notifies the handler of a change in the address of the remote.

source

fn inject_dial_upgrade_error( &mut self, info: Self::OutboundOpenInfo, error: ConnectionHandlerUpgrErr<<Self::OutboundProtocol as OutboundUpgradeSend>::Error> )

👎Deprecated since 0.41.0: Handle ConnectionEvent::DialUpgradeError on ConnectionHandler::on_connection_event instead. The default implemention of this inject_* method delegates to it.

Indicates to the handler that upgrading an outbound substream to the given protocol has failed.

source

fn inject_listen_upgrade_error( &mut self, info: Self::InboundOpenInfo, error: ConnectionHandlerUpgrErr<<Self::InboundProtocol as InboundUpgradeSend>::Error> )

👎Deprecated since 0.41.0: Handle ConnectionEvent::ListenUpgradeError on ConnectionHandler::on_connection_event instead. The default implemention of this inject_* method delegates to it.

Indicates to the handler that upgrading an inbound substream to the given protocol has failed.

source

fn map_in_event<TNewIn, TMap>(self, map: TMap) -> MapInEvent<Self, TNewIn, TMap>where Self: Sized, TMap: Fn(&TNewIn) -> Option<&Self::InEvent>,

Adds a closure that turns the input event into something else.

source

fn map_out_event<TMap, TNewOut>(self, map: TMap) -> MapOutEvent<Self, TMap>where Self: Sized, TMap: FnMut(Self::OutEvent) -> TNewOut,

Adds a closure that turns the output event into something else.

source

fn select<TProto2>( self, other: TProto2 ) -> ConnectionHandlerSelect<Self, TProto2>where Self: Sized,

Creates a new ConnectionHandler that selects either this handler or other by delegating methods calls appropriately.

Note: The largest KeepAlive returned by the two handlers takes precedence, i.e. is returned from ConnectionHandler::connection_keep_alive by the returned handler.

source

fn on_behaviour_event(&mut self, _event: Self::InEvent)

Informs the handler about an event from the NetworkBehaviour.

source

fn on_connection_event( &mut self, _event: ConnectionEvent<'_, Self::InboundProtocol, Self::OutboundProtocol, Self::InboundOpenInfo, Self::OutboundOpenInfo> )

Implementations on Foreign Types§

source§

impl<L, R> ConnectionHandler for Either<L, R>where L: ConnectionHandler, R: ConnectionHandler,

Implementation of a ConnectionHandler that represents either of two ConnectionHandler implementations.

§

type InEvent = Either<<L as ConnectionHandler>::InEvent, <R as ConnectionHandler>::InEvent>

§

type OutEvent = Either<<L as ConnectionHandler>::OutEvent, <R as ConnectionHandler>::OutEvent>

§

type Error = Either<<L as ConnectionHandler>::Error, <R as ConnectionHandler>::Error>

§

type InboundProtocol = EitherUpgrade<SendWrapper<<L as ConnectionHandler>::InboundProtocol>, SendWrapper<<R as ConnectionHandler>::InboundProtocol>>

§

type OutboundProtocol = EitherUpgrade<SendWrapper<<L as ConnectionHandler>::OutboundProtocol>, SendWrapper<<R as ConnectionHandler>::OutboundProtocol>>

§

type InboundOpenInfo = Either<<L as ConnectionHandler>::InboundOpenInfo, <R as ConnectionHandler>::InboundOpenInfo>

§

type OutboundOpenInfo = Either<<L as ConnectionHandler>::OutboundOpenInfo, <R as ConnectionHandler>::OutboundOpenInfo>

source§

fn listen_protocol( &self ) -> SubstreamProtocol<<Either<L, R> as ConnectionHandler>::InboundProtocol, <Either<L, R> as ConnectionHandler>::InboundOpenInfo>

source§

fn on_behaviour_event( &mut self, event: <Either<L, R> as ConnectionHandler>::InEvent )

source§

fn connection_keep_alive(&self) -> KeepAlive

source§

fn poll( &mut self, cx: &mut Context<'_> ) -> Poll<ConnectionHandlerEvent<<Either<L, R> as ConnectionHandler>::OutboundProtocol, <Either<L, R> as ConnectionHandler>::OutboundOpenInfo, <Either<L, R> as ConnectionHandler>::OutEvent, <Either<L, R> as ConnectionHandler>::Error>>

source§

fn on_connection_event( &mut self, event: ConnectionEvent<'_, <Either<L, R> as ConnectionHandler>::InboundProtocol, <Either<L, R> as ConnectionHandler>::OutboundProtocol, <Either<L, R> as ConnectionHandler>::InboundOpenInfo, <Either<L, R> as ConnectionHandler>::OutboundOpenInfo> )

Implementors§

source§

impl ConnectionHandler for libp2p::swarm::dummy::ConnectionHandler

source§

impl ConnectionHandler for libp2p::swarm::keep_alive::ConnectionHandler

source§

impl ConnectionHandler for PendingConnectionHandler

source§

impl<K, H> ConnectionHandler for MultiHandler<K, H>where K: Clone + Debug + Hash + Eq + Send + 'static, H: ConnectionHandler, <H as ConnectionHandler>::InboundProtocol: InboundUpgradeSend, <H as ConnectionHandler>::OutboundProtocol: OutboundUpgradeSend,

source§

impl<TConnectionHandler, TMap, TNewIn> ConnectionHandler for MapInEvent<TConnectionHandler, TNewIn, TMap>where TConnectionHandler: ConnectionHandler, TMap: Fn(TNewIn) -> Option<<TConnectionHandler as ConnectionHandler>::InEvent> + Send + 'static, TNewIn: Debug + Send + 'static,

§

type InEvent = TNewIn

§

type OutEvent = <TConnectionHandler as ConnectionHandler>::OutEvent

§

type Error = <TConnectionHandler as ConnectionHandler>::Error

§

type InboundProtocol = <TConnectionHandler as ConnectionHandler>::InboundProtocol

§

type OutboundProtocol = <TConnectionHandler as ConnectionHandler>::OutboundProtocol

§

type InboundOpenInfo = <TConnectionHandler as ConnectionHandler>::InboundOpenInfo

§

type OutboundOpenInfo = <TConnectionHandler as ConnectionHandler>::OutboundOpenInfo

source§

impl<TConnectionHandler, TMap, TNewOut> ConnectionHandler for MapOutEvent<TConnectionHandler, TMap>where TConnectionHandler: ConnectionHandler, TMap: FnMut(<TConnectionHandler as ConnectionHandler>::OutEvent) -> TNewOut + Send + 'static, TNewOut: Debug + Send + 'static,

§

type InEvent = <TConnectionHandler as ConnectionHandler>::InEvent

§

type OutEvent = TNewOut

§

type Error = <TConnectionHandler as ConnectionHandler>::Error

§

type InboundProtocol = <TConnectionHandler as ConnectionHandler>::InboundProtocol

§

type OutboundProtocol = <TConnectionHandler as ConnectionHandler>::OutboundProtocol

§

type InboundOpenInfo = <TConnectionHandler as ConnectionHandler>::InboundOpenInfo

§

type OutboundOpenInfo = <TConnectionHandler as ConnectionHandler>::OutboundOpenInfo

source§

impl<TInbound, TOutbound, TEvent> ConnectionHandler for OneShotHandler<TInbound, TOutbound, TEvent>where TInbound: InboundUpgradeSend + Send + 'static, TOutbound: Debug + OutboundUpgradeSend, <TInbound as InboundUpgradeSend>::Output: Into<TEvent>, <TOutbound as OutboundUpgradeSend>::Output: Into<TEvent>, <TOutbound as OutboundUpgradeSend>::Error: Error + Send + 'static, SubstreamProtocol<TInbound, ()>: Clone, TEvent: Debug + Send + 'static,

§

type InEvent = TOutbound

§

type OutEvent = TEvent

§

type Error = ConnectionHandlerUpgrErr<<<OneShotHandler<TInbound, TOutbound, TEvent> as ConnectionHandler>::OutboundProtocol as OutboundUpgradeSend>::Error>

§

type InboundProtocol = TInbound

§

type OutboundProtocol = TOutbound

§

type OutboundOpenInfo = ()

§

type InboundOpenInfo = ()

source§

impl<TInner> ConnectionHandler for ToggleConnectionHandler<TInner>where TInner: ConnectionHandler,

source§

impl<TProto1, TProto2> ConnectionHandler for ConnectionHandlerSelect<TProto1, TProto2>where TProto1: ConnectionHandler, TProto2: ConnectionHandler,

source§

impl<TUserData> ConnectionHandler for KademliaHandler<TUserData>where TUserData: Clone + Debug + Send + 'static + Unpin,