refactor(queue): tighten reconnect reconciliation

This commit is contained in:
Ibrahim Khan
2026-09-09 07:42:42 +00:00
parent 8e7c26be23
commit ca1a866bd2
5 changed files with 14 additions and 38 deletions
@@ -123,7 +123,7 @@ describe("server-owned message queue", () => {
expect(useMessageQueueStore.getState().sendingIds[key]).toEqual(["q1"])
})
test("hydrate keeps a queue a newer broadcast added even when the snapshot predates it", async () => {
test("hydrate keeps a queue newer than its snapshot", async () => {
applyMessageQueueUpdatedEvent(updated(10, session([serverItem("q1", "queued after the read started")])), "runtime-a")
respond = () => json({ revision: 9, sessions: [] })
await useMessageQueueStore.getState().hydrate()
@@ -131,24 +131,19 @@ describe("server-owned message queue", () => {
expect(useMessageQueueStore.getState().queuedMessages[key]?.map((m) => m.id)).toEqual(["q1"])
})
test("resync re-reads the server once a hydration established ownership, and drops what it no longer lists", async () => {
// Before a hydration the store cannot tell the server's copies from an
// older build's local queue, so there is nothing to re-read yet.
test("resync waits for initial hydration", async () => {
activeRuntimeKey = "runtime-never-hydrated"
await useMessageQueueStore.getState().resync()
expect(calls).toHaveLength(0)
})
activeRuntimeKey = "runtime-a"
test("resync drops a queue the server no longer lists", async () => {
respond = () => json({ revision: 3, sessions: [session([serverItem("q1", "queued")], "q1")] })
await useMessageQueueStore.getState().hydrate()
expect(useMessageQueueStore.getState().queuedMessages[key]).toHaveLength(1)
// The server delivered q1 while this client's stream was down.
respond = () => json({ revision: 4, sessions: [] })
await useMessageQueueStore.getState().resync()
expect(calls.map((call) => `${call.method} ${call.path}`)).toEqual(["GET /api/message-queue", "GET /api/message-queue"])
expect(useMessageQueueStore.getState().queuedMessages[key]).toBe(undefined)
expect(useMessageQueueStore.getState().sendingIds[key]).toBe(undefined)
})
test("addToQueue shows the message at once and settles on the server's copy", async () => {
@@ -305,10 +300,6 @@ describe("server-owned message queue", () => {
: json({ revision: 12, sessions: [] }))
await expect(useMessageQueueStore.getState().takeForSend(target, "q1")).rejects.toThrow()
expect(calls.map((call) => `${call.method} ${call.path}`)).toEqual([
"POST /api/message-queue/sessions/session-1/items/q1/take",
"GET /api/message-queue",
])
expect(useMessageQueueStore.getState().queuedMessages[key]).toBe(undefined)
})