Skip to main content

calimero_network/handlers/commands/
bootstrap.rs

1use actix::{Context, Handler, Message, Response};
2use calimero_network_primitives::messages::Bootstrap;
3use eyre::eyre;
4use tokio::sync::oneshot;
5
6use crate::NetworkManager;
7
8impl Handler<Bootstrap> for NetworkManager {
9    type Result = Response<<Bootstrap as Message>::Result>;
10
11    fn handle(&mut self, _msg: Bootstrap, _ctx: &mut Context<Self>) -> Self::Result {
12        let (sender, receiver) = oneshot::channel();
13
14        match self.swarm.behaviour_mut().kad.bootstrap() {
15            Ok(query_id) => {
16                let _ignored = self.pending_bootstrap.insert(query_id, sender);
17            }
18            Err(err) => {
19                return Response::reply(Err(eyre!(err)));
20            }
21        }
22
23        Response::fut(async { receiver.await.expect("Sender not to be dropped.") })
24    }
25}