diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-28 16:10:55 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-28 16:10:55 +0100 |
commit | d7968d986b50332f671efaa118fd84c21ba02576 (patch) | |
tree | 9a05ed985202c03c25a0bcb01a181033ea19d63d | |
parent | 16ed59d53024784f5eeeff31591562e4cc9f2d29 (diff) | |
download | weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar.bz2 weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar.zst |
respack ws
-rw-r--r-- | Cargo.lock | 130 | ||||
-rw-r--r-- | Cargo.toml | 10 | ||||
-rw-r--r-- | server/respack_http/src/main.rs | 1 | ||||
-rw-r--r-- | server/respack_ws/Cargo.toml | 13 | ||||
-rw-r--r-- | server/respack_ws/src/main.rs | 78 | ||||
-rw-r--r-- | shared/src/graphics.rs | 3 |
6 files changed, 234 insertions, 1 deletions
@@ -405,6 +405,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] name = "block2" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -744,6 +753,15 @@ dependencies = [ ] [[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] name = "crc32fast" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -784,6 +802,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] name = "cursor-icon" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -909,6 +937,22 @@ dependencies = [ ] [[package]] +name = "data-encoding" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] name = "dispatch" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1105,6 +1149,12 @@ dependencies = [ ] [[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] name = "foldhash" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1138,6 +1188,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] name = "gethostname" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1389,6 +1449,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" [[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] name = "humansize" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2700,6 +2777,19 @@ dependencies = [ ] [[package]] +name = "respack_ws" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap 4.5.32", + "env_logger", + "hex", + "log", + "tungstenite", + "weareshared", +] + +[[package]] name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2833,6 +2923,17 @@ dependencies = [ ] [[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3170,6 +3271,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.0", + "sha1", + "thiserror 2.0.12", + "utf-8", +] + +[[package]] name = "type-map" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3179,6 +3297,12 @@ dependencies = [ ] [[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3215,6 +3339,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1,3 +1,11 @@ [workspace] -members = ["shared", "server", "server/respack_http", "client", "import", "cli"] +members = [ + "shared", + "server", + "server/respack_http", + "server/respack_ws", + "client", + "import", + "cli", +] resolver = "3" diff --git a/server/respack_http/src/main.rs b/server/respack_http/src/main.rs index 967c3c4..6ffe631 100644 --- a/server/respack_http/src/main.rs +++ b/server/respack_http/src/main.rs @@ -66,6 +66,7 @@ fn handle_conn(conn: TcpStream, store: Arc<ResourceStore>) -> Result<()> { write!(conn_write, "HTTP/1.1 {code} OK\r\n")?; write!(conn_write, "content-type: {ty}\r\n")?; write!(conn_write, "server: write! macros\r\n")?; + write!(conn_write, "cache-control: public, max-age=604800, immutable\r\n")?; write!(conn_write, "content-length: {}\r\n", data.len())?; write!(conn_write, "\r\n")?; conn_write.write_all(&data)?; diff --git a/server/respack_ws/Cargo.toml b/server/respack_ws/Cargo.toml new file mode 100644 index 0000000..389b2fa --- /dev/null +++ b/server/respack_ws/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "respack_ws" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = "1.0.97" +clap = { version = "4.5.32", features = ["derive"] } +env_logger = "0.11.7" +log = "0.4.26" +weareshared = { path = "../../shared" } +hex = "0.4.3" +tungstenite = "0.26.2"
\ No newline at end of file diff --git a/server/respack_ws/src/main.rs b/server/respack_ws/src/main.rs new file mode 100644 index 0000000..d263b9c --- /dev/null +++ b/server/respack_ws/src/main.rs @@ -0,0 +1,78 @@ +#![feature(slice_as_array)] +use anyhow::Result; +use clap::Parser; +use log::{error, warn}; +use std::{ + marker::PhantomData, + net::{IpAddr, SocketAddr, TcpListener}, + path::PathBuf, + sync::Arc, + thread::spawn, +}; +use tungstenite::{Message, accept}; +use weareshared::{packets::Resource, store::ResourceStore}; + +#[derive(Parser, Debug)] +struct Args { + #[arg(short, long, default_value = "::")] + bind_addr: IpAddr, + #[arg(short, long, default_value = "28557")] + port: u16, + + pack: PathBuf, +} + +fn main() -> Result<()> { + env_logger::init_from_env("LOG"); + let args = Args::parse(); + let listener = TcpListener::bind(SocketAddr::new(args.bind_addr, args.port)).unwrap(); + let store = Arc::new(ResourceStore::new_respack_file(&args.pack)?); + + loop { + let (stream, _) = listener.accept()?; + let store = store.clone(); + spawn(move || { + let mut websocket = accept(stream).unwrap(); + loop { + let Ok(msg) = websocket.read() else { break }; + match msg { + Message::Text(a) => { + let a = a.to_string(); + let r = if a == "entry" { + if let ResourceStore::Respack(pack) = &*store { + let pack = pack.lock().unwrap(); + if let Some(entry) = pack.entry() { + websocket.send(Message::Binary(entry.0.to_vec().into())) + } else { + websocket.send(Message::Text("no_entry".into())) + } + } else { + unreachable!() + } + } else { + websocket.send(Message::Text("unknown_packet".into())) + }; + if let Err(e) = r { + warn!("{e}"); + } + } + Message::Binary(bytes) if bytes.len() == 32 => { + let res = Resource(*bytes.as_array().unwrap(), PhantomData); + let r = match store.get_raw(res) { + Ok(Some(data)) => websocket.send(Message::Binary(data.into())), + Ok(None) => websocket.send(Message::Text("not_found".into())), + Err(e) => { + error!("{e}"); + websocket.send(Message::Text("error".into())) + } + }; + if let Err(e) = r { + warn!("{e}"); + } + } + _ => (), + } + } + }); + } +} diff --git a/shared/src/graphics.rs b/shared/src/graphics.rs index 5ba0d99..215dda4 100644 --- a/shared/src/graphics.rs +++ b/shared/src/graphics.rs @@ -108,6 +108,9 @@ impl GraphicsPart { GraphicsCommand::Unknown => self.0.extend([0, 255]), } } + pub fn size(&self) -> usize { + self.0.len() + } } fn get_vec3(data: &[u8]) -> Vec3 { |