ankurah_websocket_client/
sender.rs

1use 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/// PeerSender implementation for websocket connections
8#[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}