naia_client_socket/backends/native/
packet_receiver.rs

1use std::sync::{Arc, Mutex};
2
3use tokio::sync::mpsc::UnboundedReceiver;
4use webrtc_unreliable_client::{AddrCell, ServerAddr as RTCServerAddr};
5
6use crate::{
7    error::NaiaClientSocketError, packet_receiver::PacketReceiver, server_addr::ServerAddr,
8};
9
10/// Handles receiving messages from the Server through a given Client Socket
11#[derive(Clone)]
12pub struct PacketReceiverImpl {
13    server_addr: AddrCell,
14    receiver_channel: Arc<Mutex<UnboundedReceiver<Box<[u8]>>>>,
15    receive_buffer: Vec<u8>,
16}
17
18impl PacketReceiverImpl {
19    /// Create a new PacketReceiver, if supplied with the Server's address & a
20    /// reference back to the parent Socket
21    pub fn new(server_addr: AddrCell, receiver_channel: UnboundedReceiver<Box<[u8]>>) -> Self {
22        PacketReceiverImpl {
23            server_addr,
24            receiver_channel: Arc::new(Mutex::new(receiver_channel)),
25            receive_buffer: vec![0; 1472],
26        }
27    }
28}
29
30impl PacketReceiver for PacketReceiverImpl {
31    fn receive(&mut self) -> Result<Option<&[u8]>, NaiaClientSocketError> {
32        if let Ok(mut receiver) = self.receiver_channel.lock() {
33            if let Ok(bytes) = receiver.try_recv() {
34                let length = bytes.len();
35                self.receive_buffer[..length].clone_from_slice(&bytes);
36                return Ok(Some(&self.receive_buffer[..length]));
37            }
38        }
39        return Ok(None);
40    }
41
42    /// Get the Server's Socket address
43    fn server_addr(&self) -> ServerAddr {
44        match self.server_addr.get() {
45            RTCServerAddr::Finding => ServerAddr::Finding,
46            RTCServerAddr::Found(addr) => ServerAddr::Found(addr),
47        }
48    }
49}