p2p_chat/network/
commands.rs1use super::{NetworkCommand, NetworkLayer, NetworkResponse};
3use crate::types::{ChatRequest, MailboxRequest};
4use anyhow::Result;
5use libp2p::PeerId;
6use tracing::debug;
7
8impl NetworkLayer {
9 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}