scatter_net/legacy/net/methods/
init.rs

1use anyhow::Result;
2use iroh::Endpoint;
3use ps_datalake::lake::DataLake;
4use tokio::spawn;
5
6use crate::{
7    spawn_and_forget, NetConfig, NetState, ScatterNet, ScatterNetInnerReadonly,
8    ScatterNetInnerWritable, ALPN,
9};
10
11impl ScatterNet {
12    /// Initializes a [`ScatterNet`] instance.
13    /// # Errors
14    /// An Error is returned if binding the socket fails.
15    pub async fn init(config: NetConfig, state: NetState) -> Result<Self> {
16        let mut builder = Endpoint::builder()
17            .alpns(vec![ALPN.to_vec()])
18            .discovery_dht()
19            .discovery_local_network()
20            .discovery_n0();
21
22        if let Some(secret_key) = config.secret_key.clone() {
23            builder = builder.secret_key(secret_key);
24        }
25
26        let endpoint = builder.bind().await?;
27        let node_id = endpoint.node_id();
28
29        let peers_state = state.peers.clone();
30
31        eprintln!("Initialized node {node_id}");
32
33        let lake = DataLake::init(config.lake.clone())?;
34
35        let readonly = ScatterNetInnerReadonly {
36            config,
37            endpoint,
38            lake,
39            node_id,
40        };
41
42        let writable = ScatterNetInnerWritable {
43            state,
44            ..Default::default()
45        };
46
47        let net = Self::from_inner(readonly, writable);
48
49        spawn(Self::accept_loop(net.clone()));
50
51        Self::init_peer_groups(&net, net.config.peer_groups.clone())?;
52
53        for peer_state in peers_state {
54            let net = net.clone();
55
56            spawn_and_forget(async move {
57                Self::connect_to(&net, peer_state.node_id, Some(peer_state)).await
58            });
59        }
60
61        Ok(net)
62    }
63}