network_libp2p/
common.rs

1use std::collections::{HashMap, HashSet};
2
3use libp2p::PeerId;
4
5use crate::behaviour::ChatBehaviour;
6use crate::NodeOptions;
7
8/// Shared libp2p network implementation fields used by both native and WASM builds.
9pub struct Libp2pNetwork {
10    pub swarm: libp2p::Swarm<ChatBehaviour>,
11    pub local_peer_id: PeerId,
12    pub dht_discovery_enabled: bool,
13    pub bootstrap_peer_ids: Vec<PeerId>,
14    pub(crate) pending_responses:
15        HashMap<String, libp2p::request_response::ResponseChannel<Vec<u8>>>,
16    pub(crate) next_response_id: u64,
17    pub(crate) peer_addrs: HashMap<PeerId, Vec<libp2p::Multiaddr>>,
18    pub(crate) peer_conn_addrs: HashMap<PeerId, Vec<String>>,
19    /// Peers we are currently dialing from user-initiated dial requests.
20    /// Prevents queuing multiple concurrent dials to the same peer.
21    pub(crate) pending_dials: HashSet<PeerId>,
22}
23
24/// Shared post-build initialisation for a [`Libp2pNetwork`].
25pub fn init_libp2p_network(
26    mut swarm: libp2p::Swarm<ChatBehaviour>,
27    local_peer_id: PeerId,
28    options: &NodeOptions,
29    bootstrap_peer_ids: Vec<PeerId>,
30) -> Libp2pNetwork {
31    if let Err(e) = swarm.listen_on("/p2p-circuit".parse().unwrap()) {
32        tracing::warn!("Failed to listen on /p2p-circuit: {}", e);
33    }
34
35    Libp2pNetwork {
36        swarm,
37        local_peer_id,
38        dht_discovery_enabled: options.dht_discovery_enabled,
39        bootstrap_peer_ids,
40        pending_responses: HashMap::new(),
41        next_response_id: 0,
42        peer_addrs: HashMap::new(),
43        peer_conn_addrs: HashMap::new(),
44        pending_dials: HashSet::new(),
45    }
46}