p2p_chat/network/
commands.rs

1//! This module contains the handlers for `NetworkCommand`s.
2use super::{NetworkCommand, NetworkLayer, NetworkResponse};
3use crate::types::{ChatRequest, MailboxRequest};
4use anyhow::Result;
5use libp2p::PeerId;
6use tracing::debug;
7
8impl NetworkLayer {
9    /// Handles an incoming `NetworkCommand`.
10    ///
11    /// This function processes commands sent to the `NetworkLayer` from other
12    /// parts of the application.
13    ///
14    /// # Arguments
15    ///
16    /// * `command` - The `NetworkCommand` to handle.
17    ///
18    /// # Errors
19    ///
20    /// This function will return an error if handling the command fails.
21    pub(super) async fn handle_command(&mut self, command: NetworkCommand) -> Result<()> {
22        match command {
23            NetworkCommand::SendMessage {
24                peer_id,
25                message,
26                response,
27            } => {
28                if !self.swarm.is_connected(&peer_id) {
29                    debug!(
30                        "Peer {} not connected, failing send request immediately.",
31                        peer_id
32                    );
33                    let _ = response.send(NetworkResponse::Error("Peer not connected".to_string()));
34                    return Ok(());
35                }
36
37                let request = ChatRequest::SendMessage { message };
38                let request_id = self
39                    .swarm
40                    .behaviour_mut()
41                    .chat
42                    .send_request(&peer_id, request);
43                self.pending_requests.insert(request_id, response);
44            }
45
46            NetworkCommand::SendChatRequest {
47                peer_id,
48                request,
49                response,
50            } => {
51                if !self.swarm.is_connected(&peer_id) {
52                    debug!(
53                        "Peer {} not connected, failing chat request immediately.",
54                        peer_id
55                    );
56                    let _ = response.send(NetworkResponse::Error("Peer not connected".to_string()));
57                    return Ok(());
58                }
59
60                let request_id = self
61                    .swarm
62                    .behaviour_mut()
63                    .chat
64                    .send_request(&peer_id, request);
65                self.pending_requests.insert(request_id, response);
66            }
67
68            NetworkCommand::MailboxPut {
69                peer_id,
70                recipient,
71                message,
72                response,
73            } => {
74                let request = MailboxRequest::Put { recipient, message };
75                let request_id = self
76                    .swarm
77                    .behaviour_mut()
78                    .mailbox
79                    .send_request(&peer_id, request);
80                self.pending_requests.insert(request_id, response);
81            }
82
83            NetworkCommand::MailboxFetch {
84                peer_id,
85                recipient,
86                limit,
87                response,
88            } => {
89                let request = MailboxRequest::Fetch { recipient, limit };
90                let request_id = self
91                    .swarm
92                    .behaviour_mut()
93                    .mailbox
94                    .send_request(&peer_id, request);
95                self.pending_requests.insert(request_id, response);
96            }
97
98            NetworkCommand::MailboxAck {
99                peer_id,
100                recipient,
101                msg_ids,
102                response,
103            } => {
104                let request = MailboxRequest::Ack { recipient, msg_ids };
105                let request_id = self
106                    .swarm
107                    .behaviour_mut()
108                    .mailbox
109                    .send_request(&peer_id, request);
110                self.pending_requests.insert(request_id, response);
111            }
112
113            NetworkCommand::GetConnectedPeers { response } => {
114                let peers: Vec<PeerId> = self.swarm.connected_peers().cloned().collect();
115                let _ = response.send(NetworkResponse::ConnectedPeers { peers });
116            }
117
118            NetworkCommand::StartDhtProviderQuery { key, response } => {
119                let query_id = self.swarm.behaviour_mut().discovery.get_providers(key);
120                let _ = response.send(Ok(query_id));
121            }
122        }
123
124        Ok(())
125    }
126}