subspace_networking/
behavior.rspub(crate) mod persistent_parameters;
#[cfg(test)]
mod tests;
use crate::constructor::DummyRecordStore;
use crate::protocols::autonat_wrapper::{
Behaviour as AutonatWrapper, Config as AutonatWrapperConfig,
};
use crate::protocols::request_response::request_response_factory::{
Event as RequestResponseEvent, RequestHandler, RequestResponseFactoryBehaviour,
};
use crate::protocols::reserved_peers::{
Behaviour as ReservedPeersBehaviour, Config as ReservedPeersConfig, Event as ReservedPeersEvent,
};
use crate::protocols::subspace_connection_limits::Behaviour as ConnectionLimitsBehaviour;
use derive_more::From;
use libp2p::allow_block_list::{Behaviour as AllowBlockListBehaviour, BlockedPeers};
use libp2p::autonat::Event as AutonatEvent;
use libp2p::connection_limits::ConnectionLimits;
use libp2p::gossipsub::{
Behaviour as Gossipsub, Config as GossipsubConfig, Event as GossipsubEvent, MessageAuthenticity,
};
use libp2p::identify::{Behaviour as Identify, Config as IdentifyConfig, Event as IdentifyEvent};
use libp2p::kad::{Behaviour as Kademlia, Config as KademliaConfig, Event as KademliaEvent};
use libp2p::ping::{Behaviour as Ping, Event as PingEvent};
use libp2p::swarm::behaviour::toggle::Toggle;
use libp2p::swarm::NetworkBehaviour;
use libp2p::PeerId;
use std::convert::Infallible;
use void::Void as VoidEvent;
type BlockListBehaviour = AllowBlockListBehaviour<BlockedPeers>;
pub(crate) struct BehaviorConfig {
pub(crate) peer_id: PeerId,
pub(crate) identify: IdentifyConfig,
pub(crate) kademlia: KademliaConfig,
pub(crate) gossipsub: Option<GossipsubConfig>,
pub(crate) request_response_protocols: Vec<Box<dyn RequestHandler>>,
pub(crate) request_response_max_concurrent_streams: usize,
pub(crate) connection_limits: ConnectionLimits,
pub(crate) reserved_peers: ReservedPeersConfig,
pub(crate) autonat: AutonatWrapperConfig,
}
#[derive(NetworkBehaviour)]
#[behaviour(to_swarm = "Event")]
pub(crate) struct Behavior {
pub(crate) connection_limits: ConnectionLimitsBehaviour,
pub(crate) identify: Identify,
pub(crate) kademlia: Kademlia<DummyRecordStore>,
pub(crate) gossipsub: Toggle<Gossipsub>,
pub(crate) ping: Ping,
pub(crate) request_response: RequestResponseFactoryBehaviour,
pub(crate) block_list: BlockListBehaviour,
pub(crate) reserved_peers: ReservedPeersBehaviour,
pub(crate) autonat: AutonatWrapper,
}
impl Behavior {
pub(crate) fn new(config: BehaviorConfig) -> Self {
let kademlia = Kademlia::with_config(config.peer_id, DummyRecordStore, config.kademlia);
let gossipsub = config
.gossipsub
.map(|gossip_config| {
Gossipsub::new(
MessageAuthenticity::Anonymous,
gossip_config,
)
.expect("Correct configuration")
})
.into();
Self {
connection_limits: ConnectionLimitsBehaviour::new(config.connection_limits),
identify: Identify::new(config.identify),
kademlia,
gossipsub,
ping: Ping::default(),
request_response: RequestResponseFactoryBehaviour::new(
config.request_response_protocols,
config.request_response_max_concurrent_streams,
)
.expect("RequestResponse protocols registration failed."),
block_list: BlockListBehaviour::default(),
reserved_peers: ReservedPeersBehaviour::new(config.reserved_peers),
autonat: AutonatWrapper::new(config.autonat),
}
}
}
#[derive(Debug, From)]
pub(crate) enum Event {
Identify(IdentifyEvent),
Kademlia(KademliaEvent),
Gossipsub(GossipsubEvent),
Ping(PingEvent),
RequestResponse(RequestResponseEvent),
VoidEventStub(VoidEvent),
ReservedPeers(ReservedPeersEvent),
Autonat(AutonatEvent),
}
impl From<Infallible> for Event {
fn from(_: Infallible) -> Self {
unreachable!()
}
}