export class Mutex { constructor() { this._locked = false; this._waiting = []; } lock() { const unlock = () => { const next = this._waiting.shift(); if (next) { next(unlock); } else { this._locked = false; } }; if (this._locked) { return new Promise(resolve => this._waiting.push(resolve)).then(() => unlock); } else { this._locked = true; return Promise.resolve(unlock); } } }