From 531c6d1bf701af8548bc764cd977942f65bcf76f Mon Sep 17 00:00:00 2001 From: curly Date: Tue, 28 Feb 2023 10:32:16 -0700 Subject: terrible ws implementation --- src/main.rs | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 4 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index af0234a..fd76ec7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,12 +4,13 @@ mod database; use rocket::serde::json::Json; use rocket::State; -use std::sync::Mutex; +use std::sync::{Mutex, Arc}; use database::types::*; +use tungstenite::accept; struct SharedDB { - sdb: Mutex + sdb: Arc> } #[derive(serde::Serialize)] @@ -64,7 +65,7 @@ fn get_message_list(id_start: u64, id_end: u64, db: &State) -> Json) -> Json> { - let lock = db.sdb.lock().unwrap(); + let mut lock = db.sdb.lock().unwrap(); match lock.get_message_newest_id() { Some(n) => Json(Response(Ok(n))), None => Json(Response(Err("No messages"))) @@ -145,6 +146,7 @@ fn api_index(db: &State) -> Json { } + #[derive(serde::Serialize)] struct HitCount { c: usize @@ -152,6 +154,75 @@ struct HitCount { #[launch] fn rocket() -> _ { + let database = std::sync::Arc::new(Mutex::new(database::Database::new())); + + let websocketdb = Arc::clone(&database); + let rocketdb = Arc::clone(&database); + + std::thread::spawn(move || { + let listen = std::net::TcpListener::bind("127.0.0.1:8001").unwrap(); + + loop { + for connection in listen.incoming() { + + let wsconnectiondb = Arc::clone(&websocketdb); + std::thread::spawn(move || { + let mut websocket = accept(connection.unwrap()).unwrap(); + let mut newest = 0; + + loop { + // TX + let mut db = wsconnectiondb.lock().unwrap(); + let local_newest = match db.get_message_newest_id() { + Some(n) => n.into(), + None => 0 + }; + drop(db); + + if local_newest > newest { + let m = serde_json::to_string(&WebSocketMessage::NewMessage).unwrap(); + websocket.write_message(tungstenite::Message::text(m)).unwrap(); + newest = local_newest; + } + + std::thread::sleep(std::time::Duration::from_millis(100)); + + // RX + // let _ = match websocket.read_message() { + // Ok(n) => n, + // Err(_) => {println!("closed"); break} + // }; + + // if msg.is_binary() { + // if msg.len() > 0 { + // match msg.into_data()[0..=1].into() { + // BinaryMessage::GetMessageNewestId => { + // let db = wsconnectiondb.lock().unwrap(); + // let m = db.get_message_newest_id(); + // drop(db); + + // let m = serde_json::to_string(&m).unwrap(); + // websocket.write_message(tungstenite::Message::text(m)).unwrap(); + // }, + // // Return error of unsupported data + // _ => (), + // } + // } else { + // // Return error of empty data + // websocket.write_message(msg).unwrap(); + // } + + // } else if msg.is_text() { + // println!("{}", msg.into_text().unwrap()); + // } + + } + + }); + } + } + }); + rocket::build() .mount("/api", routes![ get_message, @@ -167,7 +238,8 @@ fn rocket() -> _ { get_message_list, set_user_data, set_user_status, + ]) .mount("/", routes![api_index]) - .manage(SharedDB{sdb: Mutex::new(database::Database::new())}) + .manage(SharedDB{sdb: rocketdb}) } \ No newline at end of file -- cgit v1.2.3