snowstorm/net/behaviour/
config.rs

1use crate::config::Config;
2use instant::Duration;
3use libp2p::swarm::behaviour::toggle::Toggle;
4pub use libp2p::{
5    identify,
6    ping,
7    rendezvous,
8    upnp,
9};
10use libp2p_stream as stream;
11use log::debug;
12use rand::Rng;
13
14use crate::net::behaviour::SnowstormBehaviour;
15
16impl From<&Config> for Toggle<ping::Behaviour> {
17    fn from(_config: &Config) -> Toggle<ping::Behaviour> {
18        let max = rand::rng().random_range(1.0..=6.0);
19        let min = rand::rng().random_range(0.0..=max);
20        let ping_interval = rand::rng().random_range(min..=max);
21        return Toggle::from(Some(ping::Behaviour::new(
22            ping::Config::new()
23                .with_interval(Duration::from_secs_f32(ping_interval))
24                .with_timeout(Duration::from_secs_f32(ping_interval * 2.0)),
25        )));
26    }
27}
28
29impl From<&Config> for Toggle<stream::Behaviour> {
30    fn from(_config: &Config) -> Toggle<stream::Behaviour> {
31        return Toggle::from(Some(stream::Behaviour::new()));
32        // if config.roles.contains(&crate::identity::Role::Client)
33        //     || config.roles.contains(&crate::identity::Role::Exit)
34        // {
35        //     debug!("stream behaviour enabled");
36        //     return Toggle::from(Some(stream::Behaviour::new()));
37        // }
38
39        // Toggle::from(None)
40    }
41}
42
43impl From<&Config> for Toggle<upnp::tokio::Behaviour> {
44    fn from(config: &Config) -> Toggle<upnp::tokio::Behaviour> {
45        #[cfg(not(target_arch = "wasm32"))]
46        if config.roles.contains(&crate::identity::Role::Volunteer)
47            || config.roles.contains(&crate::identity::Role::Exit)
48        {
49            debug!("upnp behaviour enabled");
50            return Toggle::from(Some(upnp::tokio::Behaviour::default()));
51        }
52
53        Toggle::from(None)
54    }
55}
56
57// impl From<&Config> for Toggle<autonat::Behaviour> {
58//     fn from(config: &Config) -> Toggle<autonat::Behaviour> {
59//         debug!("autonat behaviour enabled");
60//
61//         Toggle::from(Some(autonat::Behaviour::new(
62//             config.keypair.public().into(),
63//             autonat::Config {
64//                 retry_interval: Duration::from_secs(1),
65//                 refresh_interval: Duration::from_secs(1),
66//                 boot_delay: Duration::from_secs(1),
67//                 throttle_server_period: Duration::ZERO,
68//                 only_global_ips: false,
69//                 ..Default::default()
70//             },
71//         )))
72//     }
73// }
74
75impl From<&Config> for Toggle<rendezvous::server::Behaviour> {
76    fn from(config: &Config) -> Toggle<rendezvous::server::Behaviour> {
77        if config.roles.contains(&crate::identity::Role::Volunteer) {
78            debug!("rendezvous server behaviour enabled");
79            return Toggle::from(Some(rendezvous::server::Behaviour::new(
80                rendezvous::server::Config::default(),
81            )));
82        }
83
84        Toggle::from(None)
85    }
86}
87
88impl From<&Config> for Toggle<rendezvous::client::Behaviour> {
89    fn from(config: &Config) -> Toggle<rendezvous::client::Behaviour> {
90        debug!("rendezvous client behaviour enabled");
91        return Toggle::from(Some(rendezvous::client::Behaviour::new(
92            config.keypair.clone(),
93        )));
94    }
95}
96
97impl From<&Config> for Toggle<identify::Behaviour> {
98    fn from(config: &Config) -> Toggle<identify::Behaviour> {
99        debug!("identify behaviour enabled");
100
101        return Toggle::from(Some(identify::Behaviour::new(identify::Config::new(
102            "snowstorm-rendezvous/0.0.0".to_string(),
103            config.keypair.public(),
104        ))));
105    }
106}
107
108impl From<&Config> for SnowstormBehaviour {
109    fn from(config: &Config) -> SnowstormBehaviour {
110        SnowstormBehaviour {
111            ping: Toggle::from(config),
112            upnp: Toggle::from(config),
113            identify: Toggle::from(config),
114            rendezvous_server: Toggle::from(config),
115            rendezvous_client: Toggle::from(config),
116            stream: Toggle::from(config),
117        }
118    }
119}