summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-28 16:10:55 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-28 16:10:55 +0100
commitd7968d986b50332f671efaa118fd84c21ba02576 (patch)
tree9a05ed985202c03c25a0bcb01a181033ea19d63d
parent16ed59d53024784f5eeeff31591562e4cc9f2d29 (diff)
downloadweareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar
weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar.bz2
weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar.zst
respack ws
-rw-r--r--Cargo.lock130
-rw-r--r--Cargo.toml10
-rw-r--r--server/respack_http/src/main.rs1
-rw-r--r--server/respack_ws/Cargo.toml13
-rw-r--r--server/respack_ws/src/main.rs78
-rw-r--r--shared/src/graphics.rs3
6 files changed, 234 insertions, 1 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0c55365..fd7c19e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 0840b4c..f1b3796 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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 {