scatter_net/legacy/net/methods/
init.rs1use 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 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}