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 /server | |
parent | 16ed59d53024784f5eeeff31591562e4cc9f2d29 (diff) | |
download | weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar.bz2 weareserver-d7968d986b50332f671efaa118fd84c21ba02576.tar.zst |
respack ws
Diffstat (limited to 'server')
-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 |
3 files changed, 92 insertions, 0 deletions
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}"); + } + } + _ => (), + } + } + }); + } +} |