use async_trait::async_trait;
pub use crate::error::{EncodeError, TransportError, WorldError};
use crate::events::{ComponentUpdate, NetworkEvent, ReplicationEvent};
pub use crate::types::{ClientId, LocalId, NetworkId, NetworkIdAllocator};
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait GameTransport: Sync + GameTransportBounds {
async fn send_unreliable(&self, client_id: ClientId, data: &[u8])
-> Result<(), TransportError>;
async fn send_reliable(&self, client_id: ClientId, data: &[u8]) -> Result<(), TransportError>;
async fn broadcast_unreliable(&self, data: &[u8]) -> Result<(), TransportError>;
async fn poll_events(&mut self) -> Vec<NetworkEvent>;
async fn connected_client_count(&self) -> usize;
}
#[cfg(target_arch = "wasm32")]
pub trait GameTransportBounds {}
#[cfg(target_arch = "wasm32")]
impl<T: ?Sized> GameTransportBounds for T {}
#[cfg(not(target_arch = "wasm32"))]
pub trait GameTransportBounds: Send {}
#[cfg(not(target_arch = "wasm32"))]
impl<T: ?Sized + Send> GameTransportBounds for T {}
pub trait WorldState: Send {
fn get_local_id(&self, network_id: NetworkId) -> Option<LocalId>;
fn get_network_id(&self, local_id: LocalId) -> Option<NetworkId>;
fn extract_deltas(&mut self) -> Vec<ReplicationEvent>;
fn apply_updates(&mut self, updates: &[(ClientId, ComponentUpdate)]);
fn advance_tick(&mut self) {}
fn simulate(&mut self) {}
fn spawn_networked(&mut self) -> NetworkId;
fn spawn_networked_for(&mut self, _client_id: ClientId) -> NetworkId {
self.spawn_networked()
}
fn despawn_networked(&mut self, network_id: NetworkId) -> Result<(), WorldError>;
fn stress_test(&mut self, _count: u16, _rotate: bool) {}
fn spawn_kind(&mut self, _kind: u16, _x: f32, _y: f32, _rot: f32) -> NetworkId {
self.spawn_networked() }
fn clear_world(&mut self) {}
}
pub trait Encoder: Send + Sync {
fn encode(&self, event: &ReplicationEvent, buffer: &mut [u8]) -> Result<usize, EncodeError>;
fn decode(&self, buffer: &[u8]) -> Result<ComponentUpdate, EncodeError>;
fn encode_event(&self, event: &NetworkEvent) -> Result<Vec<u8>, EncodeError>;
fn decode_event(&self, data: &[u8]) -> Result<NetworkEvent, EncodeError>;
fn max_encoded_size(&self) -> usize;
}