naia_client_socket/backends/native/
packet_sender.rs

1use tokio::sync::mpsc::{error::SendError, Sender, UnboundedSender};
2use webrtc_unreliable_client::{AddrCell, ServerAddr as RTCServerAddr};
3
4use crate::{error::NaiaClientSocketError, packet_sender::PacketSender, server_addr::ServerAddr};
5
6/// Handles sending messages to the Server for a given Client Socket
7#[derive(Clone)]
8pub struct PacketSenderImpl {
9    server_addr: AddrCell,
10    sender_channel: UnboundedSender<Box<[u8]>>,
11    disconnect_channel: Sender<()>,
12}
13
14impl PacketSenderImpl {
15    /// Create a new PacketSender, if supplied with the Server's address & a
16    /// reference back to the parent Socket
17    pub fn new(
18        server_addr: AddrCell,
19        sender_channel: UnboundedSender<Box<[u8]>>,
20        disconnect_channel: Sender<()>,
21    ) -> Self {
22        Self {
23            server_addr,
24            sender_channel,
25            disconnect_channel,
26        }
27    }
28}
29
30impl PacketSender for PacketSenderImpl {
31    /// Send a Packet to the Server
32    fn send(&self, payload: &[u8]) -> Result<(), NaiaClientSocketError> {
33        self.sender_channel
34            .send(payload.into())
35            .map_err(|_err: SendError<_>| NaiaClientSocketError::SendError)
36    }
37
38    /// Get the Server's Socket address
39    fn server_addr(&self) -> ServerAddr {
40        match self.server_addr.get() {
41            RTCServerAddr::Finding => ServerAddr::Finding,
42            RTCServerAddr::Found(addr) => ServerAddr::Found(addr),
43        }
44    }
45
46    fn connected(&self) -> bool {
47        !self.sender_channel.is_closed()
48    }
49
50    fn disconnect(&mut self) {
51        let _ = self.disconnect_channel.blocking_send(());
52    }
53}