pub mod channels;
pub mod client_messages;
pub mod connected_client;
pub mod server_messages;
use bevy::prelude::*;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)]
pub enum ClientState {
#[default]
Disconnected,
Connecting,
Connected,
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)]
pub enum ServerState {
#[default]
Stopped,
Running,
}
#[derive(Message, Clone, Copy, Debug)]
pub struct DisconnectRequest {
pub client: Entity,
}
#[derive(Resource, Default, Reflect, Debug, Clone, Copy)]
pub struct ClientStats {
pub rtt: f64,
pub packet_loss: f64,
pub sent_bps: f64,
pub received_bps: f64,
}
#[derive(Component, Deref, DerefMut, Default, Reflect, Debug, Clone, Copy)]
pub struct ConnectedClientStats(pub ClientStats);
#[cfg(test)]
mod tests {
use test_log::test;
use super::*;
use crate::{
prelude::*,
shared::backend::channels::{ClientChannel, ServerChannel},
};
#[test]
fn client_to_server() {
let channels = RepliconChannels::default();
let mut client_messages = ClientMessages::default();
client_messages.setup_server_channels(channels.server_channels().len());
const MESSAGES: &[&[u8]] = &[&[0], &[1]];
for &message in MESSAGES {
client_messages.send(ClientChannel::MutationAcks, message);
}
let mut server_messages = ServerMessages::default();
server_messages.setup_client_channels(channels.client_channels().len());
for (channel_id, message) in client_messages.drain_sent() {
server_messages.insert_received(Entity::PLACEHOLDER, channel_id, message);
}
let messages: Vec<_> = server_messages
.receive(ClientChannel::MutationAcks)
.map(|(_, message)| message)
.collect();
assert_eq!(messages, MESSAGES);
}
#[test]
fn server_to_client() {
let channels = RepliconChannels::default();
let mut server_messages = ServerMessages::default();
server_messages.setup_client_channels(channels.client_channels().len());
const MESSAGES: &[&[u8]] = &[&[0], &[1]];
for &message in MESSAGES {
server_messages.send(Entity::PLACEHOLDER, ServerChannel::Mutations, message);
}
let mut client_messages = ClientMessages::default();
client_messages.setup_server_channels(channels.server_channels().len());
for (_, channel_id, message) in server_messages.drain_sent() {
client_messages.insert_received(channel_id, message);
}
let messages: Vec<_> = client_messages.receive(ServerChannel::Mutations).collect();
assert_eq!(messages, MESSAGES);
}
}