naia_server_socket/
auth_sender.rs

1use std::net::SocketAddr;
2
3use smol::channel::{Sender, TrySendError};
4
5use naia_socket_shared::IdentityToken;
6
7use crate::NaiaServerSocketError;
8
9// Trait
10pub trait AuthSender: AuthSenderClone + Send + Sync {
11    /// Accepts an incoming connection on the Server Socket
12    fn accept(
13        &self,
14        address: &SocketAddr,
15        identity_token: &IdentityToken,
16    ) -> Result<(), NaiaServerSocketError>;
17    /// Rejects an incoming connection from the Server Socket
18    fn reject(&self, address: &SocketAddr) -> Result<(), NaiaServerSocketError>;
19}
20
21// Impl
22/// Used to send Auth messages to the Server Socket
23#[derive(Clone)]
24pub struct AuthSenderImpl {
25    channel_sender: Sender<(SocketAddr, Option<IdentityToken>)>,
26}
27
28impl AuthSenderImpl {
29    /// Creates a new AuthSender
30    pub fn new(channel_sender: Sender<(SocketAddr, Option<IdentityToken>)>) -> Self {
31        Self { channel_sender }
32    }
33
34    fn send(
35        &self,
36        address: &SocketAddr,
37        accept: Option<IdentityToken>,
38    ) -> Result<(), NaiaServerSocketError> {
39        self.channel_sender
40            .try_send((*address, accept))
41            .map_err(|err| match err {
42                TrySendError::Full(_) => unreachable!("the channel is expected to be unbound"),
43                TrySendError::Closed(_) => NaiaServerSocketError::SendError(*address),
44            })
45    }
46}
47
48impl AuthSender for AuthSenderImpl {
49    /// Accepts an incoming connection on the Server Socket
50    fn accept(
51        &self,
52        address: &SocketAddr,
53        identity_token: &IdentityToken,
54    ) -> Result<(), NaiaServerSocketError> {
55        self.send(address, Some(identity_token.clone()))
56    }
57
58    /// Rejects an incoming connection from the Server Socket
59    fn reject(&self, address: &SocketAddr) -> Result<(), NaiaServerSocketError> {
60        self.send(address, None)
61    }
62}
63
64/// Used to clone Box<dyn AuthSender>
65pub trait AuthSenderClone {
66    /// Clone the boxed AuthSender
67    fn clone_box(&self) -> Box<dyn AuthSender>;
68}
69
70impl<T: 'static + AuthSender + Clone> AuthSenderClone for T {
71    fn clone_box(&self) -> Box<dyn AuthSender> {
72        Box::new(self.clone())
73    }
74}
75
76impl Clone for Box<dyn AuthSender> {
77    fn clone(&self) -> Box<dyn AuthSender> {
78        AuthSenderClone::clone_box(self.as_ref())
79    }
80}