naia_server_socket/
auth_receiver.rs1use std::net::SocketAddr;
2
3use smol::channel::Receiver;
4
5use super::error::NaiaServerSocketError;
6
7pub trait AuthReceiver: AuthReceiverClone + Send + Sync {
9 fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, NaiaServerSocketError>;
11}
12
13#[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 #[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
49pub trait AuthReceiverClone {
51 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}