diff options
author | curly <curlybryce@protonmail.com> | 2023-02-28 10:32:16 -0700 |
---|---|---|
committer | curly <curlybryce@protonmail.com> | 2023-02-28 10:32:16 -0700 |
commit | 531c6d1bf701af8548bc764cd977942f65bcf76f (patch) | |
tree | acb7eb100f8267d6533df6df080969e16dfa87b1 /src/main.rs | |
parent | a3b54a4b23866ae08c7f906d93f512c19db78d9d (diff) | |
download | rocket_test-531c6d1bf701af8548bc764cd977942f65bcf76f.tar.gz rocket_test-531c6d1bf701af8548bc764cd977942f65bcf76f.tar.bz2 rocket_test-531c6d1bf701af8548bc764cd977942f65bcf76f.zip |
terrible ws implementation
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 80 |
1 files changed, 76 insertions, 4 deletions
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<database::Database> + sdb: Arc<Mutex<database::Database>> } #[derive(serde::Serialize)] @@ -64,7 +65,7 @@ fn get_message_list(id_start: u64, id_end: u64, db: &State<SharedDB>) -> Json<Re } #[get("/get_message_id_newest")] fn get_message_id_newest(db: &State<SharedDB>) -> Json<Response<UID, &'static str>> { - 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<SharedDB>) -> Json<Info> { } + #[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 |