naia_server_socket/
auth_sender.rs1use std::net::SocketAddr;
2
3use smol::channel::{Sender, TrySendError};
4
5use naia_socket_shared::IdentityToken;
6
7use crate::NaiaServerSocketError;
8
9pub trait AuthSender: AuthSenderClone + Send + Sync {
11 fn accept(
13 &self,
14 address: &SocketAddr,
15 identity_token: &IdentityToken,
16 ) -> Result<(), NaiaServerSocketError>;
17 fn reject(&self, address: &SocketAddr) -> Result<(), NaiaServerSocketError>;
19}
20
21#[derive(Clone)]
24pub struct AuthSenderImpl {
25 channel_sender: Sender<(SocketAddr, Option<IdentityToken>)>,
26}
27
28impl AuthSenderImpl {
29 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 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 fn reject(&self, address: &SocketAddr) -> Result<(), NaiaServerSocketError> {
60 self.send(address, None)
61 }
62}
63
64pub trait AuthSenderClone {
66 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}