From 6d24f036488865d752394bff128d21ac6a675474 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Sun, 5 Nov 2023 17:00:17 -0500 Subject: [PATCH] Switch to object oriented message format --- Cargo.lock | 5 +++-- Cargo.toml | 1 + client/src/components/Chat.vue | 15 ++++++++------- src/main.rs | 25 +++++++++++++++++++++---- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b740ffa..2cd661b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -508,6 +508,7 @@ dependencies = [ "poem", "poem-openapi", "serde", + "serde_json", "sqlx", "thiserror", "tokio", @@ -1620,9 +1621,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", diff --git a/Cargo.toml b/Cargo.toml index c0d7d85..08c1dff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,4 +14,5 @@ poem-openapi = { version = "3.0.5", features = ["websocket"] } serde = "1.0.190" thiserror = "1.0.50" anyhow = "1.0.75" +serde_json = "1.0.108" diff --git a/client/src/components/Chat.vue b/client/src/components/Chat.vue index 2533609..01aa263 100644 --- a/client/src/components/Chat.vue +++ b/client/src/components/Chat.vue @@ -5,7 +5,7 @@ const props = defineProps(['modelValue']) const emit = defineEmits(['update:modelValue']) const input = ref('') -const msgs = ref(['Server: Welcome to chat app', 'Server: This is an example message']) +const msgs = ref([{ username: 'Server', message: 'Welcome to Chat App' }, { username: 'Server', message: 'This is an example message' }]) let ws; async function sendMsg(ev) { @@ -29,9 +29,10 @@ onMounted(async () => { window.location.hash = "/login" }; - ws.onmessage = function (event) { - console.log(event) - msgs.value.push(event.data) + ws.onmessage = async function (event) { + console.log("event data: " + event.data) + msgs.value.push(JSON.parse(event.data)) + console.log("msgs:" + msgs.value) }; console.log(ws) @@ -42,12 +43,12 @@ onMounted(async () => {
-
{{ msg }}
+
{{ msg.username }}: {{ msg.message }}
diff --git a/src/main.rs b/src/main.rs index 607fd4f..f5f4af0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ use poem_openapi::{ ApiResponse, Object, OpenApi, OpenApiService, Tags, }; use serde::{Deserialize, Serialize}; +use serde_json; use sqlx::{Pool, Sqlite}; use tokio::sync::broadcast::Sender; @@ -124,7 +125,13 @@ impl Api { tokio::spawn(async move { while let Some(Ok(msg)) = stream.next().await { if let Message::Text(text) = msg { - if sender.send(format!("{name}: {text}")).is_err() { + if sender + .send(ChatMsg { + username: name.clone(), + message: text, + }) + .is_err() + { break; } } @@ -133,7 +140,11 @@ impl Api { tokio::spawn(async move { while let Ok(msg) = receiver.recv().await { - if sink.send(Message::Text(msg)).await.is_err() { + if sink + .send(Message::Text(serde_json::to_string(&msg).unwrap())) + .await + .is_err() + { break; } } @@ -240,9 +251,15 @@ impl Api { } } +#[derive(Serialize, Deserialize, Clone)] +struct ChatMsg { + username: String, + message: String, +} + struct Api { db: Pool, - channel: Sender, + channel: Sender, signup_open: bool, //TODO Should be in the db so it can change without restart } @@ -255,7 +272,7 @@ async fn main() -> anyhow::Result<()> { let session = ServerSession::new(CookieConfig::default(), MemoryStorage::new()); - let channel = tokio::sync::broadcast::channel::(128).0; + let channel = tokio::sync::broadcast::channel::(128).0; let dbpool = Pool::::connect("sqlite:chat.db").await?; let api = OpenApiService::new(