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) } } }