Files
t8y2--dbx/packages/app-tests/metadataTaskLimiter.test.ts
2026-07-13 13:09:14 +08:00

75 lines
2.1 KiB
TypeScript
Vendored

import assert from "node:assert/strict";
import { test } from "vitest";
import { MetadataTaskLimiter } from "../../apps/desktop/src/lib/metadata/metadataTaskLimiter.ts";
function deferred<T>() {
let resolve!: (value: T) => void;
let reject!: (reason?: unknown) => void;
const promise = new Promise<T>((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
}
test("metadata task limiter caps active tasks per scope and drains queued tasks", async () => {
const events: Array<{ event: string; active: number; queued: number; kind: string }> = [];
const limiter = new MetadataTaskLimiter(2, (event) => events.push(event));
const gates = [deferred<number>(), deferred<number>(), deferred<number>(), deferred<number>()];
let active = 0;
let maxActive = 0;
const tasks = gates.map((gate, index) =>
limiter.run("conn:db", `task-${index}`, async () => {
active++;
maxActive = Math.max(maxActive, active);
const result = await gate.promise;
active--;
return result;
}),
);
assert.equal(maxActive, 2);
assert.deepEqual(
events.filter((event) => event.event === "queued").map((event) => event.queued),
[1, 2],
);
gates[0].resolve(1);
await Promise.resolve();
await Promise.resolve();
assert.equal(maxActive, 2);
gates[1].resolve(2);
gates[2].resolve(3);
gates[3].resolve(4);
assert.deepEqual(await Promise.all(tasks), [1, 2, 3, 4]);
assert.equal(maxActive, 2);
});
test("metadata task limiter isolates independent scopes", async () => {
const limiter = new MetadataTaskLimiter(1);
const first = deferred<string>();
const second = deferred<string>();
let active = 0;
const a = limiter.run("conn:a", "columns", async () => {
active++;
const result = await first.promise;
active--;
return result;
});
const b = limiter.run("conn:b", "columns", async () => {
active++;
const result = await second.promise;
active--;
return result;
});
assert.equal(active, 2);
first.resolve("a");
second.resolve("b");
assert.deepEqual(await Promise.all([a, b]), ["a", "b"]);
});