naia-server 0.25.0

A server that uses either UDP or WebRTC communication to send/receive messages to/from connected clients, and syncs registered Entities/Components to clients to whom they are in-scope.
use std::net::SocketAddr;

use naia_shared::{IdentityToken, SocketConfig};

use naia_server_socket::{
    AuthReceiver, AuthSender, PacketReceiver, PacketSender, Socket as ServerSocket,
};

pub use naia_server_socket::ServerAddrs;

use super::{
    AuthReceiver as TransportAuthReceiver, AuthSender as TransportAuthSender, ListenResult,
    PacketReceiver as TransportReceiver, PacketSender as TransportSender, RecvError, SendError,
    Socket as TransportSocket,
};

#[doc(hidden)]
pub struct Socket {
    server_addrs: ServerAddrs,
    config: SocketConfig,
}

impl Socket {
    #[doc(hidden)]
    pub fn new(server_addrs: &ServerAddrs, config: &SocketConfig) -> Self {
        Self {
            server_addrs: server_addrs.clone(),
            config: config.clone(),
        }
    }
}

impl TransportSender for Box<dyn PacketSender> {
    /// Sends a packet from the Server Socket
    fn send(&self, address: &SocketAddr, payload: &[u8]) -> Result<(), SendError> {
        self.as_ref().send(address, payload).map_err(|_| SendError)
    }
}

impl TransportReceiver for Box<dyn PacketReceiver> {
    /// Receives a packet from the Server Socket
    fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, RecvError> {
        self.as_mut().receive().map_err(|_| RecvError)
    }
}

impl TransportAuthSender for Box<dyn AuthSender> {
    fn accept(
        &self,
        address: &SocketAddr,
        identity_token: &IdentityToken,
    ) -> Result<(), SendError> {
        self.as_ref()
            .accept(address, identity_token)
            .map_err(|_| SendError)
    }
    fn reject(&self, address: &SocketAddr) -> Result<(), SendError> {
        self.as_ref().reject(address).map_err(|_| SendError)
    }
}

impl TransportAuthReceiver for Box<dyn AuthReceiver> {
    fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, RecvError> {
        match self.as_mut().receive() {
            Ok(auth_opt) => match auth_opt {
                Some((addr, payload)) => {
                    Ok(Some((addr, payload)))
                }
                None => {
                    Ok(None)
                }
            },
            Err(_err) => {
                Err(RecvError)
            }
        }
    }
}

impl From<Socket> for Box<dyn TransportSocket> {
    fn from(val: Socket) -> Self {
        Box::new(val)
    }
}

impl TransportSocket for Socket {
    fn listen(self: Box<Self>) -> ListenResult {
        let (inner_auth_sender, inner_auth_receiver, inner_packet_sender, inner_packet_receiver) =
            ServerSocket::listen_with_auth(&self.server_addrs, &self.config);
        (
            Box::new(inner_auth_sender),
            Box::new(inner_auth_receiver),
            Box::new(inner_packet_sender),
            Box::new(inner_packet_receiver),
        )
    }
}