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    pub autonat: autonat::v1::Behaviour,
18    pub dcutr: dcutr::Behaviour,
19}
20
21#[derive(Debug)]
22pub enum HuddleBehaviorEvent {
23    Mdns(mdns::Event),
24    Identify(identify::Event),
25    Ping(ping::Event),
26    Gossipsub(gossipsub::Event),
27    RelayClient(relay::client::Event),
28    Autonat(autonat::v1::Event),
29    Dcutr(dcutr::Event),
30}
31
32impl From<mdns::Event> for HuddleBehaviorEvent {
33    fn from(event: mdns::Event) -> Self {
34        Self::Mdns(event)
35    }
36}
37
38impl From<identify::Event> for HuddleBehaviorEvent {
39    fn from(event: identify::Event) -> Self {
40        Self::Identify(event)
41    }
42}
43
44impl From<ping::Event> for HuddleBehaviorEvent {
45    fn from(event: ping::Event) -> Self {
46        Self::Ping(event)
47    }
48}
49
50impl From<gossipsub::Event> for HuddleBehaviorEvent {
51    fn from(event: gossipsub::Event) -> Self {
52        Self::Gossipsub(event)
53    }
54}
55
56impl From<relay::client::Event> for HuddleBehaviorEvent {
57    fn from(event: relay::client::Event) -> Self {
58        Self::RelayClient(event)
59    }
60}
61
62impl From<autonat::v1::Event> for HuddleBehaviorEvent {
63    fn from(event: autonat::v1::Event) -> Self {
64        Self::Autonat(event)
65    }
66}
67
68impl From<dcutr::Event> for HuddleBehaviorEvent {
69    fn from(event: dcutr::Event) -> Self {
70        Self::Dcutr(event)
71    }
72}