fix(room): add edit rollback, clean stream channels on room shutdown/idle

This commit is contained in:
ZhenYi 2026-04-16 19:28:23 +08:00
parent c89f01b718
commit 677e88980b
2 changed files with 38 additions and 7 deletions

View File

@ -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; let mut txs = self.room_shutdown_txs.write().await;
for room_id in &idle_room_ids { for room_id in &idle_room_ids {
@ -236,6 +243,10 @@ impl RoomConnectionManager {
let mut map = self.room_inner.write().await; let mut map = self.room_inner.write().await;
map.remove(&room_id); 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; let mut txs = self.room_shutdown_txs.write().await;
txs.remove(&room_id); txs.remove(&room_id);

View File

@ -852,16 +852,36 @@ export function RoomProvider({
async (messageId: string, content: string) => { async (messageId: string, content: string) => {
const client = wsClientRef.current; const client = wsClientRef.current;
if (!client) return; if (!client) return;
await client.messageUpdate(messageId, content);
setMessages((prev) => // Capture original content for rollback on server rejection
prev.map((m) => (m.id === messageId ? { ...m, content, display_content: content } : m)), let rollbackContent: string | null = null;
);
// Persist to IndexedDB
setMessages((prev) => { setMessages((prev) => {
const msg = prev.find((m) => m.id === messageId); const msg = prev.find((m) => m.id === messageId);
if (msg) saveMessage({ ...msg, content, display_content: content }).catch(() => {}); rollbackContent = msg?.content ?? null;
return prev; 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);
}
}, },
[], [],
); );