UNPKG

1.32 kBSource Map (JSON)View Raw
1{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../src/mutex.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,MAAa,KAAK;IAAlB;QACU,UAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBpC,CAAC;IApBQ,IAAI;QACT,IAAI,KAAK,GAAiC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,KAAK,GAAG,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEY,QAAQ,CAAI,EAAsC;;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI;gBACF,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;aACpC;oBAAS;gBACR,MAAM,EAAE,CAAC;aACV;QACH,CAAC;KAAA;CACF;AAvBD,sBAuBC","sourcesContent":["// https://spin.atomicobject.com/2018/09/10/javascript-concurrency/\n\nexport class Mutex {\n private mutex = Promise.resolve();\n\n public lock(): PromiseLike<() => void> {\n let begin: (unlock: () => void) => void = () => { };\n\n this.mutex = this.mutex.then(() => {\n return new Promise(begin);\n });\n\n return new Promise((res) => {\n begin = res;\n });\n }\n\n public async dispatch<T>(fn: (() => T) | (() => PromiseLike<T>)): Promise<T> {\n const unlock = await this.lock();\n try {\n return await Promise.resolve(fn());\n } finally {\n unlock();\n }\n }\n}\n"]}
\No newline at end of file