naia_client/transport/
mod.rs

1cfg_if! {
2    if #[cfg(feature = "transport_webrtc")] {
3        pub mod webrtc;
4    } else {}
5}
6cfg_if! {
7    if #[cfg(feature = "transport_udp")] {
8        pub mod udp;
9    } else {}
10}
11
12mod server_addr;
13
14pub use server_addr::ServerAddr;
15
16pub use inner::{
17    IdentityReceiver, IdentityReceiverResult, PacketReceiver, PacketSender, RecvError, SendError,
18    Socket,
19};
20
21mod inner {
22
23    use naia_shared::IdentityToken;
24    pub enum IdentityReceiverResult {
25        Waiting,
26        Success(IdentityToken),
27        ErrorResponseCode(u16),
28    }
29
30    use super::ServerAddr;
31
32    pub struct SendError;
33
34    pub struct RecvError;
35
36    pub trait Socket {
37        fn connect(
38            self: Box<Self>,
39        ) -> (
40            Box<dyn IdentityReceiver>,
41            Box<dyn PacketSender>,
42            Box<dyn PacketReceiver>,
43        );
44        fn connect_with_auth(
45            self: Box<Self>,
46            auth_bytes: Vec<u8>,
47        ) -> (
48            Box<dyn IdentityReceiver>,
49            Box<dyn PacketSender>,
50            Box<dyn PacketReceiver>,
51        );
52        fn connect_with_auth_headers(
53            self: Box<Self>,
54            auth_headers: Vec<(String, String)>,
55        ) -> (
56            Box<dyn IdentityReceiver>,
57            Box<dyn PacketSender>,
58            Box<dyn PacketReceiver>,
59        );
60        fn connect_with_auth_and_headers(
61            self: Box<Self>,
62            auth_bytes: Vec<u8>,
63            auth_headers: Vec<(String, String)>,
64        ) -> (
65            Box<dyn IdentityReceiver>,
66            Box<dyn PacketSender>,
67            Box<dyn PacketReceiver>,
68        );
69    }
70
71    pub trait PacketSender: Send + Sync {
72        /// Sends a packet from the Client Socket
73        fn send(&self, payload: &[u8]) -> Result<(), SendError>;
74        /// Get the Server's Socket address
75        fn server_addr(&self) -> ServerAddr;
76    }
77
78    pub trait PacketReceiver: PacketReceiverClone + Send + Sync {
79        /// Receives a packet from the Client Socket
80        fn receive(&mut self) -> Result<Option<&[u8]>, RecvError>;
81        /// Get the Server's Socket address
82        fn server_addr(&self) -> ServerAddr;
83    }
84
85    /// Used to clone Box<dyn PacketReceiver>
86    pub trait PacketReceiverClone {
87        /// Clone the boxed PacketReceiver
88        fn clone_box(&self) -> Box<dyn PacketReceiver>;
89    }
90
91    impl<T: 'static + PacketReceiver + Clone> PacketReceiverClone for T {
92        fn clone_box(&self) -> Box<dyn PacketReceiver> {
93            Box::new(self.clone())
94        }
95    }
96
97    impl Clone for Box<dyn PacketReceiver> {
98        fn clone(&self) -> Box<dyn PacketReceiver> {
99            PacketReceiverClone::clone_box(self.as_ref())
100        }
101    }
102
103    // Identity
104
105    pub trait IdentityReceiver: IdentityReceiverClone + Send + Sync {
106        ///
107        fn receive(&mut self) -> IdentityReceiverResult;
108    }
109
110    /// Used to clone Box<dyn IdentityReceiver>
111    pub trait IdentityReceiverClone {
112        /// Clone the boxed IdentityReceiver
113        fn clone_box(&self) -> Box<dyn IdentityReceiver>;
114    }
115
116    impl<T: 'static + IdentityReceiver + Clone> IdentityReceiverClone for T {
117        fn clone_box(&self) -> Box<dyn IdentityReceiver> {
118            Box::new(self.clone())
119        }
120    }
121
122    impl Clone for Box<dyn IdentityReceiver> {
123        fn clone(&self) -> Box<dyn IdentityReceiver> {
124            IdentityReceiverClone::clone_box(self.as_ref())
125        }
126    }
127}