mod either;
mod external_addresses;
mod listen_addresses;
mod peer_addresses;
pub mod toggle;
use std::task::{Context, Poll};
pub use external_addresses::ExternalAddresses;
use libp2p_core::{
transport::{ListenerId, PortUse},
ConnectedPoint, Endpoint, Multiaddr,
};
use libp2p_identity::PeerId;
pub use listen_addresses::ListenAddresses;
pub use peer_addresses::PeerAddresses;
use crate::{
connection::ConnectionId, dial_opts::DialOpts, listen_opts::ListenOpts, ConnectionDenied,
ConnectionError, ConnectionHandler, DialError, ListenError, THandler, THandlerInEvent,
THandlerOutEvent,
};
pub trait NetworkBehaviour: 'static {
type ConnectionHandler: ConnectionHandler;
type ToSwarm: Send + 'static;
fn handle_pending_inbound_connection(
&mut self,
_connection_id: ConnectionId,
_local_addr: &Multiaddr,
_remote_addr: &Multiaddr,
) -> Result<(), ConnectionDenied> {
Ok(())
}
fn handle_established_inbound_connection(
&mut self,
_connection_id: ConnectionId,
peer: PeerId,
local_addr: &Multiaddr,
remote_addr: &Multiaddr,
) -> Result<THandler<Self>, ConnectionDenied>;
fn handle_pending_outbound_connection(
&mut self,
_connection_id: ConnectionId,
_maybe_peer: Option<PeerId>,
_addresses: &[Multiaddr],
_effective_role: Endpoint,
) -> Result<Vec<Multiaddr>, ConnectionDenied> {
Ok(vec![])
}
fn handle_established_outbound_connection(
&mut self,
_connection_id: ConnectionId,
peer: PeerId,
addr: &Multiaddr,
role_override: Endpoint,
port_use: PortUse,
) -> Result<THandler<Self>, ConnectionDenied>;
fn on_swarm_event(&mut self, event: FromSwarm);
fn on_connection_handler_event(
&mut self,
_peer_id: PeerId,
_connection_id: ConnectionId,
_event: THandlerOutEvent<Self>,
);
fn poll(&mut self, cx: &mut Context<'_>)
-> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>>;
}
#[derive(Debug)]
#[non_exhaustive]
pub enum ToSwarm<TOutEvent, TInEvent> {
GenerateEvent(TOutEvent),
Dial { opts: DialOpts },
ListenOn { opts: ListenOpts },
RemoveListener { id: ListenerId },
NotifyHandler {
peer_id: PeerId,
handler: NotifyHandler,
event: TInEvent,
},
NewExternalAddrCandidate(Multiaddr),
ExternalAddrConfirmed(Multiaddr),
ExternalAddrExpired(Multiaddr),
CloseConnection {
peer_id: PeerId,
connection: CloseConnection,
},
NewExternalAddrOfPeer { peer_id: PeerId, address: Multiaddr },
}
impl<TOutEvent, TInEventOld> ToSwarm<TOutEvent, TInEventOld> {
pub fn map_in<TInEventNew>(
self,
f: impl FnOnce(TInEventOld) -> TInEventNew,
) -> ToSwarm<TOutEvent, TInEventNew> {
match self {
ToSwarm::GenerateEvent(e) => ToSwarm::GenerateEvent(e),
ToSwarm::Dial { opts } => ToSwarm::Dial { opts },
ToSwarm::ListenOn { opts } => ToSwarm::ListenOn { opts },
ToSwarm::RemoveListener { id } => ToSwarm::RemoveListener { id },
ToSwarm::NotifyHandler {
peer_id,
handler,
event,
} => ToSwarm::NotifyHandler {
peer_id,
handler,
event: f(event),
},
ToSwarm::CloseConnection {
peer_id,
connection,
} => ToSwarm::CloseConnection {
peer_id,
connection,
},
ToSwarm::NewExternalAddrCandidate(addr) => ToSwarm::NewExternalAddrCandidate(addr),
ToSwarm::ExternalAddrConfirmed(addr) => ToSwarm::ExternalAddrConfirmed(addr),
ToSwarm::ExternalAddrExpired(addr) => ToSwarm::ExternalAddrExpired(addr),
ToSwarm::NewExternalAddrOfPeer {
address: addr,
peer_id,
} => ToSwarm::NewExternalAddrOfPeer {
address: addr,
peer_id,
},
}
}
}
impl<TOutEvent, THandlerIn> ToSwarm<TOutEvent, THandlerIn> {
pub fn map_out<E>(self, f: impl FnOnce(TOutEvent) -> E) -> ToSwarm<E, THandlerIn> {
match self {
ToSwarm::GenerateEvent(e) => ToSwarm::GenerateEvent(f(e)),
ToSwarm::Dial { opts } => ToSwarm::Dial { opts },
ToSwarm::ListenOn { opts } => ToSwarm::ListenOn { opts },
ToSwarm::RemoveListener { id } => ToSwarm::RemoveListener { id },
ToSwarm::NotifyHandler {
peer_id,
handler,
event,
} => ToSwarm::NotifyHandler {
peer_id,
handler,
event,
},
ToSwarm::NewExternalAddrCandidate(addr) => ToSwarm::NewExternalAddrCandidate(addr),
ToSwarm::ExternalAddrConfirmed(addr) => ToSwarm::ExternalAddrConfirmed(addr),
ToSwarm::ExternalAddrExpired(addr) => ToSwarm::ExternalAddrExpired(addr),
ToSwarm::CloseConnection {
peer_id,
connection,
} => ToSwarm::CloseConnection {
peer_id,
connection,
},
ToSwarm::NewExternalAddrOfPeer {
address: addr,
peer_id,
} => ToSwarm::NewExternalAddrOfPeer {
address: addr,
peer_id,
},
}
}
}
#[derive(Debug, Clone)]
pub enum NotifyHandler {
One(ConnectionId),
Any,
}
#[derive(Debug, Clone, Default)]
pub enum CloseConnection {
One(ConnectionId),
#[default]
All,
}
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub enum FromSwarm<'a> {
ConnectionEstablished(ConnectionEstablished<'a>),
ConnectionClosed(ConnectionClosed<'a>),
AddressChange(AddressChange<'a>),
DialFailure(DialFailure<'a>),
ListenFailure(ListenFailure<'a>),
NewListener(NewListener),
NewListenAddr(NewListenAddr<'a>),
ExpiredListenAddr(ExpiredListenAddr<'a>),
ListenerError(ListenerError<'a>),
ListenerClosed(ListenerClosed<'a>),
NewExternalAddrCandidate(NewExternalAddrCandidate<'a>),
ExternalAddrConfirmed(ExternalAddrConfirmed<'a>),
ExternalAddrExpired(ExternalAddrExpired<'a>),
NewExternalAddrOfPeer(NewExternalAddrOfPeer<'a>),
}
#[derive(Debug, Clone, Copy)]
pub struct ConnectionEstablished<'a> {
pub peer_id: PeerId,
pub connection_id: ConnectionId,
pub endpoint: &'a ConnectedPoint,
pub failed_addresses: &'a [Multiaddr],
pub other_established: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct ConnectionClosed<'a> {
pub peer_id: PeerId,
pub connection_id: ConnectionId,
pub endpoint: &'a ConnectedPoint,
pub cause: Option<&'a ConnectionError>,
pub remaining_established: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct AddressChange<'a> {
pub peer_id: PeerId,
pub connection_id: ConnectionId,
pub old: &'a ConnectedPoint,
pub new: &'a ConnectedPoint,
}
#[derive(Debug, Clone, Copy)]
pub struct DialFailure<'a> {
pub peer_id: Option<PeerId>,
pub error: &'a DialError,
pub connection_id: ConnectionId,
}
#[derive(Debug, Clone, Copy)]
pub struct ListenFailure<'a> {
pub local_addr: &'a Multiaddr,
pub send_back_addr: &'a Multiaddr,
pub error: &'a ListenError,
pub connection_id: ConnectionId,
pub peer_id: Option<PeerId>,
}
#[derive(Debug, Clone, Copy)]
pub struct NewListener {
pub listener_id: ListenerId,
}
#[derive(Debug, Clone, Copy)]
pub struct NewListenAddr<'a> {
pub listener_id: ListenerId,
pub addr: &'a Multiaddr,
}
#[derive(Debug, Clone, Copy)]
pub struct ExpiredListenAddr<'a> {
pub listener_id: ListenerId,
pub addr: &'a Multiaddr,
}
#[derive(Debug, Clone, Copy)]
pub struct ListenerError<'a> {
pub listener_id: ListenerId,
pub err: &'a (dyn std::error::Error + 'static),
}
#[derive(Debug, Clone, Copy)]
pub struct ListenerClosed<'a> {
pub listener_id: ListenerId,
pub reason: Result<(), &'a std::io::Error>,
}
#[derive(Debug, Clone, Copy)]
pub struct NewExternalAddrCandidate<'a> {
pub addr: &'a Multiaddr,
}
#[derive(Debug, Clone, Copy)]
pub struct ExternalAddrConfirmed<'a> {
pub addr: &'a Multiaddr,
}
#[derive(Debug, Clone, Copy)]
pub struct ExternalAddrExpired<'a> {
pub addr: &'a Multiaddr,
}
#[derive(Clone, Copy, Debug)]
pub struct NewExternalAddrOfPeer<'a> {
pub peer_id: PeerId,
pub addr: &'a Multiaddr,
}