export class AsyncMutex { #locked = false; readonly #queue: Array<() => void> = []; get count() { return this.#queue.length; } async run(fn: () => Promise): Promise { if (this.#locked) { await new Promise((resolve) => this.#queue.push(resolve)); } this.#locked = true; try { return await fn(); } finally { this.#locked = false; const next = this.#queue.shift(); if (next) { next(); } } } clear() { this.#queue.length = 0; } }