1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use crossbeam::channel;
use futures_util::SinkExt;
use naia_socket_shared::SocketConfig;
use crate::{executor, impls::Socket as AsyncSocket};
use super::{
async_socket::AsyncSocketTrait,
packet_receiver::{
ConditionedPacketReceiverImpl, PacketReceiver, PacketReceiverImpl, PacketReceiverTrait,
},
packet_sender::PacketSender,
server_addrs::ServerAddrs,
};
pub struct Socket {
config: SocketConfig,
io: Option<Io>,
}
struct Io {
pub packet_sender: PacketSender,
pub packet_receiver: PacketReceiver,
}
impl Socket {
pub fn new(config: SocketConfig) -> Self {
Socket { config, io: None }
}
pub fn listen(&mut self, server_addrs: ServerAddrs) {
if self.io.is_some() {
panic!("Socket already listening!");
}
let (from_client_sender, from_client_receiver) = channel::unbounded();
let (sender_sender, sender_receiver) = channel::bounded(1);
let server_addrs_clone = server_addrs.clone();
let config_clone = self.config.clone();
executor::spawn(async move {
let mut async_socket = AsyncSocket::listen(server_addrs_clone, config_clone).await;
sender_sender.send(async_socket.get_sender()).unwrap();
loop {
let out_message = async_socket.receive().await;
from_client_sender.send(out_message).unwrap();
}
})
.detach();
let (to_client_sender, to_client_receiver) = channel::unbounded();
executor::spawn(async move {
let mut async_sender = sender_receiver.recv().unwrap();
loop {
if let Ok(msg) = to_client_receiver.recv() {
async_sender.send(msg).await.unwrap();
}
}
})
.detach();
let conditioner_config = self.config.link_condition_config.clone();
let receiver: Box<dyn PacketReceiverTrait> = match &conditioner_config {
Some(config) => Box::new(ConditionedPacketReceiverImpl::new(
from_client_receiver.clone(),
config,
)),
None => Box::new(PacketReceiverImpl::new(from_client_receiver.clone())),
};
let sender = PacketSender::new(to_client_sender.clone());
self.io = Some(Io {
packet_sender: sender,
packet_receiver: PacketReceiver::new(receiver),
});
}
pub fn get_packet_sender(&self) -> PacketSender {
return self
.io
.as_ref()
.expect("Socket is not listening yet! Call Socket.listen() before this.")
.packet_sender
.clone();
}
pub fn get_packet_receiver(&self) -> PacketReceiver {
return self
.io
.as_ref()
.expect("Socket is not listening yet! Call Socket.listen() before this.")
.packet_receiver
.clone();
}
}