File size: 2,184 Bytes
e18726e | 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import { afterEach, describe, expect, it, vi } from "vitest";
import { MeetingNodeAudioPullWaiters } from "./node-audio-pull-waiters.js";
describe("MeetingNodeAudioPullWaiters", () => {
afterEach(() => {
vi.useRealTimers();
});
it("removes a pull waiter when its timeout wins", async () => {
vi.useFakeTimers();
const waiters = new MeetingNodeAudioPullWaiters();
const waiting = waiters.wait(250);
expect(waiters.size).toBe(1);
await vi.advanceTimersByTimeAsync(250);
await waiting;
expect(waiters.size).toBe(0);
expect(vi.getTimerCount()).toBe(0);
});
it("cancels a pull timeout when audio wakes the waiter early", async () => {
vi.useFakeTimers();
const waiters = new MeetingNodeAudioPullWaiters();
const waiting = waiters.wait(2_000);
expect(waiters.size).toBe(1);
expect(vi.getTimerCount()).toBe(1);
waiters.wake();
await waiting;
expect(waiters.size).toBe(0);
expect(vi.getTimerCount()).toBe(0);
});
// Bun does not expose Timeout entries through process.getActiveResourcesInfo().
it.skipIf(Boolean(process.versions.bun))(
"releases its real timeout resource when audio wakes the waiter early",
async () => {
const activeTimeouts = () =>
process.getActiveResourcesInfo().filter((resource) => resource === "Timeout").length;
const baselineTimeouts = activeTimeouts();
const waiters = new MeetingNodeAudioPullWaiters();
const waiting = waiters.wait(2_000);
expect(waiters.size).toBe(1);
expect(activeTimeouts()).toBe(baselineTimeouts + 1);
waiters.wake();
await waiting;
expect(waiters.size).toBe(0);
expect(activeTimeouts()).toBe(baselineTimeouts);
},
);
it("cancels every pull timeout when a wake releases concurrent waiters", async () => {
vi.useFakeTimers();
const waiters = new MeetingNodeAudioPullWaiters();
const waiting = [waiters.wait(2_000), waiters.wait(2_000)];
expect(waiters.size).toBe(2);
expect(vi.getTimerCount()).toBe(2);
waiters.wake();
await Promise.all(waiting);
expect(waiters.size).toBe(0);
expect(vi.getTimerCount()).toBe(0);
});
});
|