ankurah_websocket_client/
sender.rs1use ankurah_core::connector::{PeerSender, SendError};
2use ankurah_proto as proto;
3use async_trait::async_trait;
4use tokio::sync::mpsc;
5use tracing::{debug, warn};
6
7#[derive(Clone)]
9pub struct WebsocketPeerSender {
10 tx: mpsc::UnboundedSender<proto::NodeMessage>,
11 recipient_node_id: proto::EntityId,
12}
13
14impl WebsocketPeerSender {
15 pub fn new(recipient_node_id: proto::EntityId) -> (Self, mpsc::UnboundedReceiver<proto::NodeMessage>) {
16 let (tx, rx) = mpsc::unbounded_channel();
17 (Self { tx, recipient_node_id }, rx)
18 }
19}
20
21#[async_trait]
22impl PeerSender for WebsocketPeerSender {
23 fn send_message(&self, message: proto::NodeMessage) -> Result<(), SendError> {
24 debug!("Queuing message for peer {}", self.recipient_node_id);
25
26 self.tx.send(message).map_err(|_| {
27 warn!("Failed to send message to peer {} - channel closed", self.recipient_node_id);
28 SendError::ConnectionClosed
29 })
30 }
31
32 fn recipient_node_id(&self) -> proto::EntityId { self.recipient_node_id }
33
34 fn cloned(&self) -> Box<dyn PeerSender> { Box::new(self.clone()) }
35}