diff --git a/Cargo.lock b/Cargo.lock index 7c605b6..4a84d2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -375,6 +375,33 @@ dependencies = [ "serde", ] +[[package]] +name = "bitcode" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a278afe77ea4781c806c23d1fa50b5f3c38282247ac78c3f85caa11c325bee1" +dependencies = [ + "bitcode_derive", + "bitintr", + "bytemuck", + "from_bytes_or_zeroed", + "residua-zigzag", + "serde", + "simdutf8", +] + +[[package]] +name = "bitcode_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c25ffc293cbf807499083d016ce3bc0459aaa7fd624c1cc563718a2440cb38a" +dependencies = [ + "packagemerge", + "proc-macro2", + "quote", + "syn 2.0.28", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -387,6 +414,12 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +[[package]] +name = "bitintr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba5a5c4df8ac8673f22698f443ef1ce3853d7f22d5a15ebf66b9a7553b173dd" + [[package]] name = "block-buffer" version = "0.10.4" @@ -429,6 +462,12 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + [[package]] name = "bytes" version = "1.4.0" @@ -464,6 +503,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "client" version = "0.1.0" dependencies = [ + "bitcode", "console_error_panic_hook", "core", "futures-util", @@ -669,6 +709,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "from_bytes_or_zeroed" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d25934a78435889223e575c7b0fc36a290c5a312e7a7ae901f10587792e142a" + [[package]] name = "futures" version = "0.3.28" @@ -1276,6 +1322,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "itertools" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a9b56eb56058f43dc66e58f40a214b2ccbc9f3df51861b63d51dec7b65bc3f" + [[package]] name = "itoa" version = "1.0.9" @@ -1436,6 +1488,15 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "packagemerge" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efcf6ee55f8f7a24333bc8d1dd0e541a6cedf903dbc07ae6479d7f8ff32ed08" +dependencies = [ + "itertools", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1673,6 +1734,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +[[package]] +name = "residua-zigzag" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b37805477eee599a61753230f511ae94d737f69b536e468e294723ad5f1b75f" + [[package]] name = "route-recognizer" version = "0.3.1" @@ -1799,6 +1866,7 @@ dependencies = [ "actix-files", "actix-web", "actix-web-actors", + "bitcode", "core", "env_logger", "futures-channel", @@ -1831,6 +1899,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "slab" version = "0.4.8" diff --git a/client/Cargo.toml b/client/Cargo.toml index d80e373..5b3dad4 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -31,6 +31,7 @@ serde_json = "1.0.96" serde = "1.0.171" yew-websocket = "1.0.1" futures-util = { version = "0.3.28", features = ["sink"] } +bitcode = { version = "0.5.0", features = ["serde"] } [dev-dependencies] wasm-bindgen-test = "0.3.13" diff --git a/client/src/utils/socket.rs b/client/src/utils/socket.rs index 3974b1d..f52a27a 100644 --- a/client/src/utils/socket.rs +++ b/client/src/utils/socket.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use gloo::{events::EventListener, utils::window}; use serde::{de::DeserializeOwned, Serialize}; use wasm_bindgen::JsCast; -use web_sys::{Event, MessageEvent, WebSocket}; +use web_sys::{BinaryType, Event, MessageEvent, WebSocket}; use yew::Callback; pub struct Socket { @@ -19,11 +19,18 @@ impl Socket { url.set_protocol(url.protocol().replace("http", "ws").as_str()); url.set_pathname(pathname); let socket = WebSocket::new(url.href().as_str()).unwrap(); + socket.set_binary_type(BinaryType::Arraybuffer); let listener = EventListener::new(&socket, "message", move |event: &Event| { let event = event.dyn_ref::().unwrap(); + #[cfg(debug_assertions)] callback.emit( serde_json::from_str::(event.data().as_string().unwrap().as_str()).unwrap(), - ) + ); + #[cfg(not(debug_assertions))] + callback.emit( + bitcode::deserialize::(Uint8Array::new(&event.data()).to_vec().as_ref()) + .unwrap(), + ); }); Self { @@ -34,8 +41,13 @@ impl Socket { } } pub fn send(&mut self, payload: In) { + #[cfg(debug_assertions)] self.socket .send_with_str(serde_json::to_string(&payload).unwrap().as_str()) .unwrap(); + #[cfg(not(debug_assertions))] + self.socket + .send_with_u8_array(bitcode::serialize(&payload).unwrap().as_ref()) + .unwrap(); } } diff --git a/server/Cargo.toml b/server/Cargo.toml index e222b8a..4b61d0b 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -22,3 +22,4 @@ actix = "0.13.0" core = { path = "../core", features=["server"] } model = { path = "../model" } nanoid = "0.4.0" +bitcode = { version = "0.5.0", features = ["serde"] } diff --git a/server/src/lobby.rs b/server/src/lobby.rs index 714e2b0..c6c697f 100644 --- a/server/src/lobby.rs +++ b/server/src/lobby.rs @@ -28,7 +28,11 @@ impl Actor for WsActor { impl Handler for WsActor { type Result = (); fn handle(&mut self, item: GenericServerMessageWrapper, ctx: &mut Self::Context) { + #[cfg(debug_assertions)] ctx.text(serde_json::to_string(&item.0).unwrap()); + + #[cfg(not(debug_assertions))] + ctx.binary(bitcode::serialize(&item.0).unwrap()); } } @@ -36,12 +40,20 @@ impl StreamHandler> for WsActor { fn handle(&mut self, msg: Result, _: &mut Self::Context) { // let Ok(msg) = msg else { return }; match msg.unwrap() { - ws::Message::Text(text) => self - .lobby - .lock() - .unwrap() - .handle_message(serde_json::from_str(text.to_string().as_str()).unwrap()), - ws::Message::Binary(_) => todo!(), + ws::Message::Text(text) => { + #[cfg(debug_assertions)] + self.lobby + .lock() + .unwrap() + .handle_message(serde_json::from_str(text.to_string().as_str()).unwrap()); + } + ws::Message::Binary(binary) => { + #[cfg(not(debug_assertions))] + self.lobby + .lock() + .unwrap() + .handle_message(bitcode::deserialize(binary.as_ref()).unwrap()); + } ws::Message::Continuation(_) => todo!(), ws::Message::Ping(_) => todo!(), ws::Message::Pong(_) => todo!(),