diff --git a/libs/room/src/connection.rs b/libs/room/src/connection.rs index f7075e6..2a46684 100644 --- a/libs/room/src/connection.rs +++ b/libs/room/src/connection.rs @@ -185,6 +185,13 @@ impl RoomConnectionManager { } } + { + let mut stream_map = self.room_stream_inner.write().await; + for room_id in &idle_room_ids { + stream_map.remove(room_id); + } + } + { let mut txs = self.room_shutdown_txs.write().await; for room_id in &idle_room_ids { @@ -236,6 +243,10 @@ impl RoomConnectionManager { let mut map = self.room_inner.write().await; map.remove(&room_id); } + { + let mut stream_map = self.room_stream_inner.write().await; + stream_map.remove(&room_id); + } { let mut txs = self.room_shutdown_txs.write().await; txs.remove(&room_id); diff --git a/src/contexts/room-context.tsx b/src/contexts/room-context.tsx index d3e68a8..4b7f552 100644 --- a/src/contexts/room-context.tsx +++ b/src/contexts/room-context.tsx @@ -852,16 +852,36 @@ export function RoomProvider({ async (messageId: string, content: string) => { const client = wsClientRef.current; if (!client) return; - await client.messageUpdate(messageId, content); - setMessages((prev) => - prev.map((m) => (m.id === messageId ? { ...m, content, display_content: content } : m)), - ); - // Persist to IndexedDB + + // Capture original content for rollback on server rejection + let rollbackContent: string | null = null; setMessages((prev) => { const msg = prev.find((m) => m.id === messageId); - if (msg) saveMessage({ ...msg, content, display_content: content }).catch(() => {}); - return prev; + rollbackContent = msg?.content ?? null; + return prev.map((m) => + m.id === messageId ? { ...m, content, display_content: content } : m, + ); }); + + try { + await client.messageUpdate(messageId, content); + // Persist updated content to IndexedDB + setMessages((prev) => { + const msg = prev.find((m) => m.id === messageId); + if (msg) saveMessage(msg).catch(() => {}); + return prev; + }); + } catch (err) { + // Rollback optimistic update on server rejection + if (rollbackContent !== null) { + setMessages((prev) => + prev.map((m) => + m.id === messageId ? { ...m, content: rollbackContent!, display_content: rollbackContent! } : m, + ), + ); + } + handleRoomError('Edit message', err); + } }, [], );