cfg_if! {
if #[cfg(feature = "transport_webrtc")] {
#[doc(hidden)]
pub mod webrtc;
} else {}
}
cfg_if! {
if #[cfg(feature = "transport_udp")] {
#[doc(hidden)]
pub mod udp;
} else {}
}
cfg_if! {
if #[cfg(feature = "transport_local")] {
#[doc(hidden)]
pub mod local;
} else {}
}
mod conditioner;
pub use conditioner::ConditionedPacketReceiver;
mod channel;
pub use channel::PacketChannel;
pub use inner::{
AuthReceiver, AuthSender, ListenResult, PacketReceiver, PacketSender, RecvError, SendError,
Socket,
};
mod inner {
use std::net::SocketAddr;
use naia_shared::IdentityToken;
pub type ListenResult = (
Box<dyn AuthSender>,
Box<dyn AuthReceiver>,
Box<dyn PacketSender>,
Box<dyn PacketReceiver>,
);
#[derive(Debug)]
pub struct SendError;
#[derive(Debug)]
pub struct RecvError;
pub trait Socket {
fn listen(self: Box<Self>) -> ListenResult;
}
pub trait PacketSender: PacketSenderClone + Send + Sync {
fn send(&self, address: &SocketAddr, payload: &[u8]) -> Result<(), SendError>;
}
pub trait PacketSenderClone {
fn clone_box(&self) -> Box<dyn PacketSender>;
}
impl<T: 'static + PacketSender + Clone> PacketSenderClone for T {
fn clone_box(&self) -> Box<dyn PacketSender> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn PacketSender> {
fn clone(&self) -> Box<dyn PacketSender> {
PacketSenderClone::clone_box(self.as_ref())
}
}
pub trait PacketReceiver: PacketReceiverClone + Send + Sync {
fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, RecvError>;
}
pub trait PacketReceiverClone {
fn clone_box(&self) -> Box<dyn PacketReceiver>;
}
impl<T: 'static + PacketReceiver + Clone> PacketReceiverClone for T {
fn clone_box(&self) -> Box<dyn PacketReceiver> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn PacketReceiver> {
fn clone(&self) -> Box<dyn PacketReceiver> {
PacketReceiverClone::clone_box(self.as_ref())
}
}
pub trait AuthSender: Send + Sync {
fn accept(
&self,
address: &SocketAddr,
identity_token: &IdentityToken,
) -> Result<(), SendError>;
fn reject(&self, address: &SocketAddr) -> Result<(), SendError>;
}
pub trait AuthReceiver: AuthReceiverClone + Send + Sync {
fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, RecvError>;
}
pub trait AuthReceiverClone {
fn clone_box(&self) -> Box<dyn AuthReceiver>;
}
impl<T: 'static + AuthReceiver + Clone> AuthReceiverClone for T {
fn clone_box(&self) -> Box<dyn AuthReceiver> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn AuthReceiver> {
fn clone(&self) -> Box<dyn AuthReceiver> {
AuthReceiverClone::clone_box(self.as_ref())
}
}
}