feat(messages): stream history one-message-per-WS-frame instead of 50-row batch

- backend: add streamMany generator (paginated, yields one record at a time)
  + messagesService.streamMessages + WS 'stream_messages' handler emitting
  'message_snapshot' per message, 'message_snapshot_end' with nextCursor
- frontend: useMessagesStream hook accumulates snapshots into SWR list,
  SSR getMessages seeds first paint, WsHook gains sendText
- add stream-many.test.ts locking the one-at-a-time + cursor contract
This commit is contained in:
asepharyana
2026-08-18 10:21:08 +07:00
parent 95f2903067
commit 0cb0b82fb1
11 changed files with 392 additions and 3 deletions
+23
View File
@@ -99,3 +99,26 @@ export async function getRecordings(limit = 50): Promise<PaginatedRecordings> {
limit,
}) as unknown as Promise<PaginatedRecordings>;
}
// ---- Messages (SSR seed for the streaming view) ----
// Used to seed the first paint so the feed isn't blank before the WS stream
// arrives. The client then takes over and streams the rest one frame at a time.
export async function getMessages(
guildId: string,
channelId?: string,
limit = 50,
cursor?: string,
): Promise<{
data: import("@/lib/types").MessageRecord[];
nextCursor: string | null;
}> {
return serverOrpc().messages.list({
guildId,
channelId,
limit,
cursor,
}) as unknown as Promise<{
data: import("@/lib/types").MessageRecord[];
nextCursor: string | null;
}>;
}