134 lines
2.7 KiB
JavaScript
134 lines
2.7 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.CancellationError = exports.CancellationToken = void 0;
|
||
|
|
||
|
function _events() {
|
||
|
const data = require("events");
|
||
|
|
||
|
_events = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
class CancellationToken extends _events().EventEmitter {
|
||
|
// babel cannot compile ... correctly for super calls
|
||
|
constructor(parent) {
|
||
|
super();
|
||
|
this.parentCancelHandler = null;
|
||
|
this._parent = null;
|
||
|
this._cancelled = false;
|
||
|
|
||
|
if (parent != null) {
|
||
|
this.parent = parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get cancelled() {
|
||
|
return this._cancelled || this._parent != null && this._parent.cancelled;
|
||
|
}
|
||
|
|
||
|
set parent(value) {
|
||
|
this.removeParentCancelHandler();
|
||
|
this._parent = value;
|
||
|
|
||
|
this.parentCancelHandler = () => this.cancel();
|
||
|
|
||
|
this._parent.onCancel(this.parentCancelHandler);
|
||
|
}
|
||
|
|
||
|
cancel() {
|
||
|
this._cancelled = true;
|
||
|
this.emit("cancel");
|
||
|
}
|
||
|
|
||
|
onCancel(handler) {
|
||
|
if (this.cancelled) {
|
||
|
handler();
|
||
|
} else {
|
||
|
this.once("cancel", handler);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
createPromise(callback) {
|
||
|
if (this.cancelled) {
|
||
|
return Promise.reject(new CancellationError());
|
||
|
}
|
||
|
|
||
|
const finallyHandler = () => {
|
||
|
if (cancelHandler != null) {
|
||
|
try {
|
||
|
this.removeListener("cancel", cancelHandler);
|
||
|
cancelHandler = null;
|
||
|
} catch (ignore) {// ignore
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
let cancelHandler = null;
|
||
|
return new Promise((resolve, reject) => {
|
||
|
let addedCancelHandler = null;
|
||
|
|
||
|
cancelHandler = () => {
|
||
|
try {
|
||
|
if (addedCancelHandler != null) {
|
||
|
addedCancelHandler();
|
||
|
addedCancelHandler = null;
|
||
|
}
|
||
|
} finally {
|
||
|
reject(new CancellationError());
|
||
|
}
|
||
|
};
|
||
|
|
||
|
if (this.cancelled) {
|
||
|
cancelHandler();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.onCancel(cancelHandler);
|
||
|
callback(resolve, reject, callback => {
|
||
|
addedCancelHandler = callback;
|
||
|
});
|
||
|
}).then(it => {
|
||
|
finallyHandler();
|
||
|
return it;
|
||
|
}).catch(e => {
|
||
|
finallyHandler();
|
||
|
throw e;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
removeParentCancelHandler() {
|
||
|
const parent = this._parent;
|
||
|
|
||
|
if (parent != null && this.parentCancelHandler != null) {
|
||
|
parent.removeListener("cancel", this.parentCancelHandler);
|
||
|
this.parentCancelHandler = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dispose() {
|
||
|
try {
|
||
|
this.removeParentCancelHandler();
|
||
|
} finally {
|
||
|
this.removeAllListeners();
|
||
|
this._parent = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
exports.CancellationToken = CancellationToken;
|
||
|
|
||
|
class CancellationError extends Error {
|
||
|
constructor() {
|
||
|
super("Cancelled");
|
||
|
}
|
||
|
|
||
|
} exports.CancellationError = CancellationError;
|
||
|
// __ts-babel@6.0.4
|
||
|
//# sourceMappingURL=CancellationToken.js.map
|