use std::net::{IpAddr, Ipv6Addr, SocketAddr};
use renetcode2::NETCODE_MAX_PACKET_BYTES;
use crossbeam::channel::{Receiver, Sender};
mod client;
mod server;
pub use client::*;
pub use server::*;
struct InMemoryPacket {
bytes: [u8; NETCODE_MAX_PACKET_BYTES],
len: usize,
}
impl Default for InMemoryPacket {
fn default() -> Self {
Self {
bytes: [0u8; NETCODE_MAX_PACKET_BYTES],
len: 0,
}
}
}
const IN_MEMORY_SERVER_ID: u16 = u16::MAX;
pub fn in_memory_server_addr() -> SocketAddr {
SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), IN_MEMORY_SERVER_ID)
}
pub fn in_memory_client_addr(client_id: u16) -> SocketAddr {
SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), client_id)
}
#[derive(Debug, Clone)]
pub struct MemorySocketChannels {
pub(self) sender: Sender<InMemoryPacket>,
pub(self) receiver: Receiver<InMemoryPacket>,
}
impl MemorySocketChannels {
pub fn channel_pair() -> (MemorySocketChannels, MemorySocketChannels) {
let (sender_a, receiver_a) = crossbeam::channel::unbounded();
let (sender_b, receiver_b) = crossbeam::channel::unbounded();
(
MemorySocketChannels {
sender: sender_a,
receiver: receiver_b,
},
MemorySocketChannels {
sender: sender_b,
receiver: receiver_a,
},
)
}
}
pub fn new_memory_sockets(mut client_ids: Vec<u16>, encrypted: bool, reliable: bool) -> (MemorySocketServer, Vec<MemorySocketClient>) {
client_ids.sort_unstable();
client_ids.dedup();
let mut server_channels = Vec::default();
let mut client_sockets = Vec::default();
server_channels.reserve(client_ids.len());
client_sockets.reserve(client_ids.len());
for client_id in client_ids {
let (server_chans, client_chans) = MemorySocketChannels::channel_pair();
server_channels.push((client_id, server_chans));
client_sockets.push(MemorySocketClient::new_with(client_id, client_chans, encrypted, reliable));
}
let server_socket = MemorySocketServer::new_with(server_channels, encrypted, reliable);
(server_socket, client_sockets)
}