Skip to main content

calimero_network/handlers/commands/
open_stream.rs

1use actix::{Context, Handler, Message, ResponseFuture};
2use calimero_network_primitives::messages::OpenStream;
3use calimero_network_primitives::stream::{Stream, CALIMERO_STREAM_PROTOCOL};
4use eyre::bail;
5
6use crate::NetworkManager;
7
8impl Handler<OpenStream> for NetworkManager {
9    type Result = ResponseFuture<<OpenStream as Message>::Result>;
10
11    fn handle(
12        &mut self,
13        OpenStream(peer_id): OpenStream,
14        _ctx: &mut Context<Self>,
15    ) -> Self::Result {
16        let mut stream_control = self.swarm.behaviour().stream.new_control();
17
18        Box::pin(async move {
19            let stream = match stream_control
20                .open_stream(peer_id, CALIMERO_STREAM_PROTOCOL)
21                .await
22            {
23                Ok(stream) => stream,
24                Err(err) => {
25                    bail!("Failed to open stream: {:?}", err);
26                }
27            };
28
29            Ok(Stream::new(stream))
30        })
31    }
32}