import assert from "node:assert/strict"; import test from "node:test"; import { RefreshQueue } from "../src/refresh"; test("refreshes coalesce bursts and rerun after in-flight invalidation", async (t) => { const reads: (() => void)[] = []; const queue = new RefreshQueue( () => new Promise((resolve) => { reads.push(resolve); }), (error) => { throw error; }, ); t.after(() => queue.dispose()); for (let i = 0; i < 100; i++) queue.invalidate(); await waitFor(() => reads.length === 1); for (let i = 0; i < 100; i++) queue.invalidate(); assert.equal(reads.length, 1); reads[0]?.(); await waitFor(() => reads.length === 2); reads[1]?.(); await new Promise((resolve) => setTimeout(resolve, 60)); assert.equal(reads.length, 2); }); test("disposed sessions never run queued refreshes and errors are reported", async () => { let calls = 0; const errors: unknown[] = []; const queue = new RefreshQueue( async () => { calls++; throw new Error("refresh failed"); }, (error) => errors.push(error), ); queue.invalidate(); await waitFor(() => errors.length === 1); assert.equal(calls, 1); queue.invalidate(); queue.dispose(); await new Promise((resolve) => setTimeout(resolve, 60)); assert.equal(calls, 1); }); async function waitFor(condition: () => boolean): Promise { const deadline = Date.now() + 2000; while (!condition()) { if (Date.now() > deadline) throw new Error("Refresh queue did not make progress"); await new Promise((resolve) => setTimeout(resolve, 5)); } }