subspace_networking/
behavior.rs1#![expect(
2 unreachable_code,
3 reason = "Some kind of false-positive related to proc macro handling"
4)]
5
6pub(crate) mod persistent_parameters;
7#[cfg(test)]
8mod tests;
9
10use crate::constructor::DummyRecordStore;
11use crate::protocols::autonat_wrapper::{
12 Behaviour as AutonatWrapper, Config as AutonatWrapperConfig,
13};
14use crate::protocols::request_response::request_response_factory::{
15 Event as RequestResponseEvent, RequestHandler, RequestResponseFactoryBehaviour,
16};
17use crate::protocols::reserved_peers::{
18 Behaviour as ReservedPeersBehaviour, Config as ReservedPeersConfig, Event as ReservedPeersEvent,
19};
20use crate::protocols::subspace_connection_limits::Behaviour as ConnectionLimitsBehaviour;
21use derive_more::From;
22use libp2p::PeerId;
23use libp2p::allow_block_list::{Behaviour as AllowBlockListBehaviour, BlockedPeers};
24use libp2p::autonat::Event as AutonatEvent;
25use libp2p::connection_limits::ConnectionLimits;
26use libp2p::gossipsub::{
27 Behaviour as Gossipsub, Config as GossipsubConfig, Event as GossipsubEvent, MessageAuthenticity,
28};
29use libp2p::identify::{Behaviour as Identify, Config as IdentifyConfig, Event as IdentifyEvent};
30use libp2p::kad::{Behaviour as Kademlia, Config as KademliaConfig, Event as KademliaEvent};
31use libp2p::ping::{Behaviour as Ping, Event as PingEvent};
32use libp2p::swarm::NetworkBehaviour;
33use libp2p::swarm::behaviour::toggle::Toggle;
34use void::Void as VoidEvent;
35
36type BlockListBehaviour = AllowBlockListBehaviour<BlockedPeers>;
37
38pub(crate) struct BehaviorConfig {
39 pub(crate) peer_id: PeerId,
41 pub(crate) identify: IdentifyConfig,
43 pub(crate) kademlia: KademliaConfig,
45 pub(crate) gossipsub: Option<GossipsubConfig>,
47 pub(crate) request_response_protocols: Vec<Box<dyn RequestHandler>>,
49 pub(crate) request_response_max_concurrent_streams: usize,
52 pub(crate) connection_limits: ConnectionLimits,
54 pub(crate) reserved_peers: ReservedPeersConfig,
56 pub(crate) autonat: AutonatWrapperConfig,
58}
59
60#[derive(NetworkBehaviour)]
61#[behaviour(to_swarm = "Event")]
62pub(crate) struct Behavior {
63 pub(crate) connection_limits: ConnectionLimitsBehaviour,
66 pub(crate) identify: Identify,
67 pub(crate) kademlia: Kademlia<DummyRecordStore>,
68 pub(crate) gossipsub: Toggle<Gossipsub>,
69 pub(crate) ping: Ping,
70 pub(crate) request_response: RequestResponseFactoryBehaviour,
71 pub(crate) block_list: BlockListBehaviour,
72 pub(crate) reserved_peers: ReservedPeersBehaviour,
73 pub(crate) autonat: AutonatWrapper,
74}
75
76impl Behavior {
77 pub(crate) fn new(config: BehaviorConfig) -> Self {
78 let kademlia = Kademlia::with_config(config.peer_id, DummyRecordStore, config.kademlia);
79
80 let gossipsub = config
81 .gossipsub
82 .map(|gossip_config| {
83 Gossipsub::new(
84 MessageAuthenticity::Anonymous,
86 gossip_config,
87 )
88 .expect("Correct configuration")
89 })
90 .into();
91
92 Self {
93 connection_limits: ConnectionLimitsBehaviour::new(config.connection_limits),
94 identify: Identify::new(config.identify),
95 kademlia,
96 gossipsub,
97 ping: Ping::default(),
98 request_response: RequestResponseFactoryBehaviour::new(
99 config.request_response_protocols,
100 config.request_response_max_concurrent_streams,
101 )
102 .expect("RequestResponse protocols registration failed."),
104 block_list: BlockListBehaviour::default(),
105 reserved_peers: ReservedPeersBehaviour::new(config.reserved_peers),
106 autonat: AutonatWrapper::new(config.autonat),
107 }
108 }
109}
110
111#[expect(clippy::large_enum_variant)]
112#[derive(Debug, From)]
113pub(crate) enum Event {
114 Identify(IdentifyEvent),
115 Kademlia(KademliaEvent),
116 Gossipsub(GossipsubEvent),
117 Ping(PingEvent),
118 RequestResponse(RequestResponseEvent),
119 VoidEventStub(VoidEvent),
121 ReservedPeers(ReservedPeersEvent),
122 Autonat(AutonatEvent),
123}
124
125impl From<!> for Event {
127 fn from(_: !) -> Self {
128 unreachable!()
129 }
130}