1use anyhow::Context as _;
2use batbox_time::Timer;
3use futures::prelude::*;
4use serde::{Deserialize, Serialize};
5use std::fmt::Debug;
6use std::pin::Pin;
7use std::sync::Arc;
8
9pub mod client;
10#[cfg(not(target_arch = "wasm32"))]
11pub mod server;
12mod traffic;
13
14#[cfg(not(target_arch = "wasm32"))]
15pub use server::{Server, ServerHandle};
16pub use traffic::*;
17
18pub trait Message: Debug + Serialize + for<'de> Deserialize<'de> + Send + 'static + Unpin {}
19
20impl<T: Debug + Serialize + for<'de> Deserialize<'de> + Send + 'static + Unpin> Message for T {}
21
22pub fn serialize_message<T: Message>(message: T) -> Vec<u8> {
23 let mut buf = Vec::new();
24 let writer = flate2::write::GzEncoder::new(&mut buf, flate2::Compression::best());
25 bincode::serialize_into(writer, &message).unwrap();
26 buf
27}
28
29pub fn deserialize_message<T: Message>(data: &[u8]) -> anyhow::Result<T> {
30 let reader = flate2::read::GzDecoder::new(data);
31 bincode::deserialize_from(reader).context("Failed to deserialize message")
32}
33
34#[cfg(target_arch = "wasm32")]
35pub trait Sender<T> {
36 fn send(&mut self, message: T)
37 where
38 T: Message,
39 {
40 self.send_serialized(Arc::new(serialize_message(message)))
41 }
42 fn send_serialized(&mut self, data: Arc<Vec<u8>>);
43}
44
45#[cfg(not(target_arch = "wasm32"))]
46pub trait Sender<T>: Send {
47 fn send(&mut self, message: T)
48 where
49 T: Message,
50 {
51 self.send_serialized(Arc::new(serialize_message(message)))
52 }
53 fn send_serialized(&mut self, data: Arc<Vec<u8>>);
54}
55
56pub trait Receiver<T> {
57 fn handle(&mut self, message: T);
58}