interface QueueElement { resolve: (value?: unknown) => void; reject: () => any; } class Mutex { queue: QueueElement[] = []; locked = false; async acquire() { if (!this.locked) { this.locked = true; } else { return new Promise((resolve, reject) => this.queue.push({ resolve, reject })); } } release() { if (this.queue.length) { const first = this.queue.shift(); first!.resolve(); } else { this.locked = false; } } } export default Mutex;