From 543b6973bbdfd0a2222ebbed8c7efd07b76aacbc Mon Sep 17 00:00:00 2001 From: Tipragot Date: Sun, 11 Feb 2024 15:20:41 +0100 Subject: [PATCH] Save --- Cargo.lock | 151 +++++++++++++++++++++++++++++++++ crates/relay-client/Cargo.toml | 16 ++++ crates/relay-client/src/lib.rs | 47 ++++++++++ 3 files changed, 214 insertions(+) create mode 100644 crates/relay-client/Cargo.toml create mode 100644 crates/relay-client/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 9e70aac..f60505e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1826,6 +1826,16 @@ dependencies = [ "serde", ] +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "error-code" version = "2.3.1" @@ -2800,6 +2810,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "local-ip-address" version = "0.5.7" @@ -2966,6 +2982,24 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.7.0" @@ -3285,6 +3319,50 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +dependencies = [ + "bitflags 2.4.2", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "orbclient" version = "0.3.47" @@ -3605,6 +3683,14 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "relay-client" +version = "0.2.0" +dependencies = [ + "log", + "tungstenite", +] + [[package]] name = "relay-server" version = "0.2.0" @@ -3657,6 +3743,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -3689,12 +3788,44 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.196" @@ -3914,6 +4045,19 @@ dependencies = [ "slotmap", ] +[[package]] +name = "tempfile" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +dependencies = [ + "cfg-if", + "fastrand 2.0.1", + "redox_syscall 0.4.1", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -4211,6 +4355,7 @@ dependencies = [ "http 1.0.0", "httparse", "log", + "native-tls", "rand", "sha1", "thiserror", @@ -4310,6 +4455,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" diff --git a/crates/relay-client/Cargo.toml b/crates/relay-client/Cargo.toml new file mode 100644 index 0000000..ae07ac4 --- /dev/null +++ b/crates/relay-client/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "relay-client" +version = "0.2.0" +edition = "2021" +license = "GPL-3.0-or-later" +description = "A client to use a relay server." +authors = ["Tipragot "] +keywords = ["bevy", "network", "game"] +categories = ["network-programming", "game-development"] + +[lints] +workspace = true + +[dependencies] +log = "0.4.20" +tungstenite = { version = "0.21.0", features = ["native-tls"] } diff --git a/crates/relay-client/src/lib.rs b/crates/relay-client/src/lib.rs new file mode 100644 index 0000000..c475d3c --- /dev/null +++ b/crates/relay-client/src/lib.rs @@ -0,0 +1,47 @@ +//! A client to use a relay server. + +use std::borrow::Cow; +use std::collections::LinkedList; +use std::net::TcpStream; +use std::sync::mpsc::{Receiver, Sender}; + +use log::warn; +use tungstenite::{Message, WebSocket}; + +pub struct RelayConnection { + send_receiver: Receiver, + send_sender: Sender, + send_buffer: LinkedList, + receive_receiver: Receiver<(u32, Vec)>, + receive_sender: Sender<(u32, Vec)>, + stream: WebSocket, +} + +impl RelayConnection { + /// Send a message to the target client. + pub fn send(&self, target_id: u32, message: Cow<[u8]>) { + let mut data = message.into_owned(); + data.extend_from_slice(&target_id.to_be_bytes()); + self.send_sender.send(Message::Binary(data)).ok(); + } + + /// Receive a message from the target client. + pub fn read(&self) -> Option<(u32, Vec)> { + self.receive_receiver.try_recv().ok() + } + + /// Update the [RelayConnection] by sending and receiving messages. + pub fn update(&mut self) { + while let Ok(message) = self.send_receiver.try_recv() { + match self.stream.send(message) { + Ok(()) => (), + Err(tungstenite::Error::WriteBufferFull(frame)) => { + self.send_buffer.push_back(frame) + } + Err(e) => { + warn!("Relay connection closed with error: {}", e); + } + } + } + } +}