naia_server_socket/
auth_receiver.rs

1use std::net::SocketAddr;
2
3use smol::channel::Receiver;
4
5use super::error::NaiaServerSocketError;
6
7/// Used to receive Auth messages from the Server Socket
8pub trait AuthReceiver: AuthReceiverClone + Send + Sync {
9    /// Receives an Auth message from the Server Socket
10    fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, NaiaServerSocketError>;
11}
12
13/// Used to receive Auth messages from the Server Socket
14#[derive(Clone)]
15pub struct AuthReceiverImpl {
16    #[allow(clippy::type_complexity)]
17    channel_receiver: Receiver<Result<(SocketAddr, Box<[u8]>), NaiaServerSocketError>>,
18    last_payload: Option<Box<[u8]>>,
19}
20
21impl AuthReceiverImpl {
22    /// Creates a new AuthReceiver
23    #[allow(clippy::type_complexity)]
24    pub fn new(
25        channel_receiver: Receiver<Result<(SocketAddr, Box<[u8]>), NaiaServerSocketError>>,
26    ) -> Self {
27        Self {
28            channel_receiver,
29            last_payload: None,
30        }
31    }
32}
33
34impl AuthReceiver for AuthReceiverImpl {
35    fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, NaiaServerSocketError> {
36        match self.channel_receiver.try_recv() {
37            Ok(result) => match result {
38                Ok((address, payload)) => {
39                    self.last_payload = Some(payload);
40                    return Ok(Some((address, self.last_payload.as_ref().unwrap())));
41                }
42                Err(_) => Ok(None),
43            },
44            Err(_) => Ok(None),
45        }
46    }
47}
48
49/// Used to clone Box<dyn AuthReceiver>
50pub trait AuthReceiverClone {
51    /// Clone the boxed AuthReceiver
52    fn clone_box(&self) -> Box<dyn AuthReceiver>;
53}
54
55impl<T: 'static + AuthReceiver + Clone> AuthReceiverClone for T {
56    fn clone_box(&self) -> Box<dyn AuthReceiver> {
57        Box::new(self.clone())
58    }
59}
60
61impl Clone for Box<dyn AuthReceiver> {
62    fn clone(&self) -> Box<dyn AuthReceiver> {
63        AuthReceiverClone::clone_box(self.as_ref())
64    }
65}