@5minds/processcube_engine
Version:
The ProcessCube Engine. Stores and executes BPMNs.
53 lines • 1.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbortablePromise = void 0;
/**
* Loosely based on https://gist.github.com/andrewcourtice/ef1b8f14935b409cfe94901558ba5594
*/
class AbortablePromise extends Promise {
constructor(executor, options) {
const abortSignal = options?.signal;
if (abortSignal) {
abortSignal.throwIfAborted();
}
super((_resolve, _reject) => {
if (abortSignal) {
const { saveResolve, saveReject, onAbort } = AbortablePromise.registerHandler(_resolve, _reject, abortSignal);
executor(saveResolve, saveReject, onAbort);
}
else {
executor(_resolve, _reject);
}
});
}
static registerHandler(resolve, reject, abortSignal) {
let abortCallback = (reason) => { };
let abortHandler = (reason) => { };
const onAbort = (_abortCallback) => {
abortCallback = _abortCallback;
};
const cleanup = () => {
abortSignal.removeEventListener('abort', abortHandler);
};
const saveResolve = AbortablePromise.wrapWithFinal(resolve, cleanup);
const saveReject = AbortablePromise.wrapWithFinal(reject, cleanup);
abortHandler = (reason) => {
abortCallback(reason);
saveReject(reason);
};
abortSignal.addEventListener('abort', abortHandler, { once: true });
return { saveResolve: saveResolve, saveReject: saveReject, onAbort: onAbort };
}
static wrapWithFinal(callee, final) {
return (...args) => {
try {
return callee(...args);
}
finally {
final();
}
};
}
}
exports.AbortablePromise = AbortablePromise;
//# sourceMappingURL=AbortablePromise.js.map