File size: 1,555 Bytes
3e05655 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import { expect, test } from "bun:test"
import { createLatestWorkerQueue } from "./markdown-worker-queue"
test("keeps only the latest queued request for each key", async () => {
const processed: number[] = []
const superseded: number[] = []
let release = () => {}
const blocked = new Promise<void>((resolve) => {
release = resolve
})
const queue = createLatestWorkerQueue<{ id: number; key: string }>({
run: async (request) => {
processed.push(request.id)
if (request.id === 1) await blocked
},
supersede: (request) => superseded.push(request.id),
dispose: () => {},
})
queue.highlight({ id: 1, key: "code" })
await Promise.resolve()
queue.highlight({ id: 2, key: "code" })
queue.highlight({ id: 3, key: "code" })
queue.highlight({ id: 4, key: "code" })
expect(queue.pending()).toBe(1)
expect(superseded).toEqual([2, 3])
release()
await queue.idle()
expect(processed).toEqual([1, 4])
})
test("serializes disposal before a later request for the same key", async () => {
const events: string[] = []
const queue = createLatestWorkerQueue<{ id: number; key: string }>({
run: async (request) => {
events.push(`highlight:${request.id}`)
},
supersede: (request) => events.push(`supersede:${request.id}`),
dispose: (key) => events.push(`dispose:${key}`),
})
queue.highlight({ id: 1, key: "code" })
queue.dispose("code")
queue.highlight({ id: 2, key: "code" })
await queue.idle()
expect(events).toEqual(["supersede:1", "dispose:code", "highlight:2"])
})
|