From ff7fd9e4b27a6a3c1cba0d0f1209aad86a3a3947 Mon Sep 17 00:00:00 2001 From: oxalica Date: Tue, 8 Oct 2024 21:14:13 -0400 Subject: [PATCH] feat(webapi): include `cid` in `ServerEvent::Msg` --- blah-types/src/server.rs | 5 ++--- blahd/src/event.rs | 4 ++-- blahd/src/lib.rs | 4 ++-- blahd/tests/webapi.rs | 10 +++++----- docs/webapi.yaml | 2 +- test-frontend/main.js | 11 ++++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/blah-types/src/server.rs b/blah-types/src/server.rs index 62ff683..3696cb1 100644 --- a/blah-types/src/server.rs +++ b/blah-types/src/server.rs @@ -5,7 +5,7 @@ use std::fmt; use serde::{Deserialize, Serialize}; use url::Url; -use crate::msg::{Id, MemberPermission, RoomAttrs, SignedChatMsg, SignedChatMsgWithId}; +use crate::msg::{Id, MemberPermission, RoomAttrs, SignedChatMsgWithId}; use crate::PubKey; /// The response object returned as body on HTTP error status. @@ -162,8 +162,7 @@ pub struct RoomMember { #[serde(rename_all = "snake_case")] pub enum ServerEvent { /// A message from a joined room. - // FIXME: Include cid. - Msg(SignedChatMsg), + Msg(SignedChatMsgWithId), /// The receiver is too slow to receive and some events and are dropped. // FIXME: Should we indefinitely buffer them or just disconnect the client instead? Lagged, diff --git a/blahd/src/event.rs b/blahd/src/event.rs index 2afd052..3967387 100644 --- a/blahd/src/event.rs +++ b/blahd/src/event.rs @@ -11,7 +11,7 @@ use anyhow::{bail, Context as _, Result}; use axum::extract::ws::{close_code, CloseFrame, Message, WebSocket}; use axum::extract::WebSocketUpgrade; use axum::response::Response; -use blah_types::msg::{AuthPayload, SignedChatMsg}; +use blah_types::msg::{AuthPayload, SignedChatMsgWithId}; use blah_types::server::{ClientEvent, ServerEvent}; use blah_types::Signed; use futures_util::future::Either; @@ -58,7 +58,7 @@ pub struct State { } impl State { - pub fn on_room_msg(&self, msg: SignedChatMsg, room_members: Vec) { + pub fn on_room_msg(&self, msg: SignedChatMsgWithId, room_members: Vec) { let listeners = self.user_listeners.lock(); let mut cnt = 0usize; let msg = Arc::new(ServerEvent::Msg(msg)); diff --git a/blahd/src/lib.rs b/blahd/src/lib.rs index a0979d4..a7daf61 100644 --- a/blahd/src/lib.rs +++ b/blahd/src/lib.rs @@ -13,7 +13,7 @@ use axum_extra::extract::WithRejection as R; use blah_types::msg::{ ChatPayload, CreateGroup, CreatePeerChat, CreateRoomPayload, DeleteRoomPayload, MemberPermission, RoomAdminOp, RoomAdminPayload, RoomAttrs, ServerPermission, - SignedChatMsgWithId, + SignedChatMsgWithId, WithMsgId, }; use blah_types::server::{ ErrorResponseWithChallenge, RoomList, RoomMember, RoomMemberList, RoomMetadata, RoomMsgs, @@ -460,7 +460,7 @@ async fn post_room_msg( })?; // FIXME: Optimize this to not traverses over all members. - st.event.on_room_msg(chat, members); + st.event.on_room_msg(WithMsgId::new(cid, chat), members); Ok(Json(cid)) } diff --git a/blahd/tests/webapi.rs b/blahd/tests/webapi.rs index 149440a..c9d9753 100644 --- a/blahd/tests/webapi.rs +++ b/blahd/tests/webapi.rs @@ -1525,7 +1525,7 @@ async fn event(server: Server) { { let chat = server.post_chat(rid1, &ALICE, "alice1").await.unwrap(); let got = ws.next().await.unwrap().unwrap(); - assert_eq!(got, ServerEvent::Msg(chat.msg)); + assert_eq!(got, ServerEvent::Msg(chat)); } // Should receive msgs from other user. @@ -1536,7 +1536,7 @@ async fn event(server: Server) { .unwrap(); let chat = server.post_chat(rid1, &BOB, "bob1").await.unwrap(); let got = ws.next().await.unwrap().unwrap(); - assert_eq!(got, ServerEvent::Msg(chat.msg)); + assert_eq!(got, ServerEvent::Msg(chat)); } // Should receive msgs from new room. @@ -1547,7 +1547,7 @@ async fn event(server: Server) { { let chat = server.post_chat(rid2, &ALICE, "alice2").await.unwrap(); let got = ws.next().await.unwrap().unwrap(); - assert_eq!(got, ServerEvent::Msg(chat.msg)); + assert_eq!(got, ServerEvent::Msg(chat)); } // Each streams should receive each message once. @@ -1556,9 +1556,9 @@ async fn event(server: Server) { let chat = server.post_chat(rid1, &ALICE, "alice1").await.unwrap(); let got1 = ws.next().await.unwrap().unwrap(); - assert_eq!(got1, ServerEvent::Msg(chat.msg.clone())); + assert_eq!(got1, ServerEvent::Msg(chat.clone())); let got2 = ws2.next().await.unwrap().unwrap(); - assert_eq!(got2, ServerEvent::Msg(chat.msg)); + assert_eq!(got2, ServerEvent::Msg(chat)); } } diff --git a/docs/webapi.yaml b/docs/webapi.yaml index ec49b8a..1a68772 100644 --- a/docs/webapi.yaml +++ b/docs/webapi.yaml @@ -574,7 +574,7 @@ components: - type: object properties: chat: - $ref: '#/components/schemas/Signed-Chat' + $ref: '#/components/schemas/WithMsgId-Signed-Chat' - type: object properties: diff --git a/test-frontend/main.js b/test-frontend/main.js index f8ef60d..d24b527 100644 --- a/test-frontend/main.js +++ b/test-frontend/main.js @@ -331,14 +331,15 @@ async function connectServer(newServerUrl) { }; ws.onmessage = async (e) => { console.log('ws event', e.data); - const msg = JSON.parse(e.data); - if (msg.msg !== undefined) { - if (msg.msg.signee.payload.room === curRoom) { - await showChatMsg(msg.msg); + const evt = JSON.parse(e.data); + if (evt.msg !== undefined) { + if (evt.msg.signee.payload.room === curRoom) { + lastCid = evt.msg.cid; + await showChatMsg(evt.msg); } else { console.log('ignore background room msg'); } - } else if (msg.lagged !== undefined) { + } else if (evt.lagged !== undefined) { log('some events are dropped because of queue overflow') } else { log(`unknown ws msg: ${e.data}`);