diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} diff --git a/README.md b/README.md index 73d366f..f7bb276 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,11 @@ ## Roadmap - [x] send messages from one client to another -- [ ] save messages to database +- [ ] rooms +- [ ] permission model +- [ ] save connection info to local storage db - [ ] get rid of unwraps -- [ ] handle disconnect correctly +- [x] handle disconnect correctly - [ ] user accounts - [ ] retrieve history - [ ] notifications diff --git a/backend/src/main.rs b/backend/src/main.rs index c94e9e6..7cadcd6 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -1,6 +1,7 @@ #[macro_use] extern crate serde; +#[allow(unused_imports, dead_code)] mod prisma; use std::sync::Arc; @@ -20,7 +21,10 @@ use common::{ClientMessage, Message}; use dashmap::DashMap; use prisma::PrismaClient; use serde_json::{json, Value}; -use tokio::sync::broadcast::{self, Sender}; +use tokio::{ + select, + sync::broadcast::{self, Sender}, +}; lazy_static::lazy_static! { static ref AUTH_CHALLENGES: DashMap = DashMap::new(); @@ -35,7 +39,7 @@ struct AppState { #[tokio::main] async fn main() -> Result<()> { let client = PrismaClient::_builder().build().await?; - let (room_tx, room_rx) = broadcast::channel::(10_000); + let (room_tx, _room_rx) = broadcast::channel::(10_000); let state = AppState { client: Arc::new(client), @@ -96,13 +100,27 @@ async fn event_stream( let mut room_rx = room_tx.subscribe(); loop { - let result = room_rx.recv().await.unwrap(); - println!("Received message: {result:?}"); - let payload = serde_json::to_string(&result).unwrap(); - match socket.send(WsMessage::Text(payload)).await { - Ok(_) => {} - Err(err) => { - eprintln!("Error: {err}") + select! { + result = room_rx.recv() => { + let whatever = result.unwrap(); + println!("Received message: {whatever:?}"); + let payload = serde_json::to_string(&whatever).unwrap(); + match socket.send(WsMessage::Text(payload)).await { + Ok(_) => {} + Err(err) => { + eprintln!("Error: {err}") + } + } + } + socket_read = socket.recv() => { + match socket_read { + Some(_) => {} + None => { + // The client disconnected, handle gracefully + // TODO: Is there any cleanup to do here + break; + } + } } } }