Skip to main content

huddle_core/network/
behavior.rs

1use libp2p::swarm::behaviour::toggle::Toggle;
2use libp2p::swarm::NetworkBehaviour;
3use libp2p::{autonat, dcutr, gossipsub, identify, mdns, ping, relay};
4
5#[derive(NetworkBehaviour)]
6#[behaviour(to_swarm = "HuddleBehaviorEvent")]
7pub struct HuddleBehavior {
8    pub mdns: Toggle<mdns::tokio::Behaviour>,
9    pub identify: identify::Behaviour,
10    pub ping: ping::Behaviour,
11    pub gossipsub: gossipsub::Behaviour,
12    // Phase D — internet reach. Relay-client lets us register with a
13    // public relay (`listen_on(<relay>/p2p-circuit)`). AutoNAT
14    // estimates whether we're behind NAT. DCUtR upgrades a relayed
15    // connection to a direct one via hole-punching when possible.
16    pub relay_client: relay::client::Behaviour,
17    // AutoNAT v2 (upgraded from v1 in the 0.3.x follow-up). v2 split
18    // the single v1 Behaviour into separate client + server halves;
19    // for a P2P mesh where any node may be asked to probe another's
20    // reachability, we include both — matching v1's symmetric design.
21    // Client emits an `Event` per address probe (Ok ⇒ reachable); the
22    // app layer consumes that to render the lobby reachability badge.
23    // Server runs silently behind the scenes — nodes use it to test
24    // each other.
25    pub autonat_client: autonat::v2::client::Behaviour,
26    pub autonat_server: autonat::v2::server::Behaviour,
27    pub dcutr: dcutr::Behaviour,
28}
29
30#[derive(Debug)]
31pub enum HuddleBehaviorEvent {
32    Mdns(mdns::Event),
33    Identify(identify::Event),
34    Ping(ping::Event),
35    Gossipsub(gossipsub::Event),
36    RelayClient(relay::client::Event),
37    AutonatClient(autonat::v2::client::Event),
38    AutonatServer(autonat::v2::server::Event),
39    Dcutr(dcutr::Event),
40}
41
42impl From<mdns::Event> for HuddleBehaviorEvent {
43    fn from(event: mdns::Event) -> Self {
44        Self::Mdns(event)
45    }
46}
47
48impl From<identify::Event> for HuddleBehaviorEvent {
49    fn from(event: identify::Event) -> Self {
50        Self::Identify(event)
51    }
52}
53
54impl From<ping::Event> for HuddleBehaviorEvent {
55    fn from(event: ping::Event) -> Self {
56        Self::Ping(event)
57    }
58}
59
60impl From<gossipsub::Event> for HuddleBehaviorEvent {
61    fn from(event: gossipsub::Event) -> Self {
62        Self::Gossipsub(event)
63    }
64}
65
66impl From<relay::client::Event> for HuddleBehaviorEvent {
67    fn from(event: relay::client::Event) -> Self {
68        Self::RelayClient(event)
69    }
70}
71
72impl From<autonat::v2::client::Event> for HuddleBehaviorEvent {
73    fn from(event: autonat::v2::client::Event) -> Self {
74        Self::AutonatClient(event)
75    }
76}
77
78impl From<autonat::v2::server::Event> for HuddleBehaviorEvent {
79    fn from(event: autonat::v2::server::Event) -> Self {
80        Self::AutonatServer(event)
81    }
82}
83
84impl From<dcutr::Event> for HuddleBehaviorEvent {
85    fn from(event: dcutr::Event) -> Self {
86        Self::Dcutr(event)
87    }
88}