123 lines
4.3 KiB
JavaScript
123 lines
4.3 KiB
JavaScript
|
/*---------------------------------------------------------------------------------------------
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
|
*--------------------------------------------------------------------------------------------*/
|
||
|
import { Emitter, Event } from './event.js';
|
||
|
var shortcutEvent = Object.freeze(function (callback, context) {
|
||
|
var handle = setTimeout(callback.bind(context), 0);
|
||
|
return { dispose: function () { clearTimeout(handle); } };
|
||
|
});
|
||
|
export var CancellationToken;
|
||
|
(function (CancellationToken) {
|
||
|
function isCancellationToken(thing) {
|
||
|
if (thing === CancellationToken.None || thing === CancellationToken.Cancelled) {
|
||
|
return true;
|
||
|
}
|
||
|
if (thing instanceof MutableToken) {
|
||
|
return true;
|
||
|
}
|
||
|
if (!thing || typeof thing !== 'object') {
|
||
|
return false;
|
||
|
}
|
||
|
return typeof thing.isCancellationRequested === 'boolean'
|
||
|
&& typeof thing.onCancellationRequested === 'function';
|
||
|
}
|
||
|
CancellationToken.isCancellationToken = isCancellationToken;
|
||
|
CancellationToken.None = Object.freeze({
|
||
|
isCancellationRequested: false,
|
||
|
onCancellationRequested: Event.None
|
||
|
});
|
||
|
CancellationToken.Cancelled = Object.freeze({
|
||
|
isCancellationRequested: true,
|
||
|
onCancellationRequested: shortcutEvent
|
||
|
});
|
||
|
})(CancellationToken || (CancellationToken = {}));
|
||
|
var MutableToken = /** @class */ (function () {
|
||
|
function MutableToken() {
|
||
|
this._isCancelled = false;
|
||
|
this._emitter = null;
|
||
|
}
|
||
|
MutableToken.prototype.cancel = function () {
|
||
|
if (!this._isCancelled) {
|
||
|
this._isCancelled = true;
|
||
|
if (this._emitter) {
|
||
|
this._emitter.fire(undefined);
|
||
|
this.dispose();
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
Object.defineProperty(MutableToken.prototype, "isCancellationRequested", {
|
||
|
get: function () {
|
||
|
return this._isCancelled;
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true
|
||
|
});
|
||
|
Object.defineProperty(MutableToken.prototype, "onCancellationRequested", {
|
||
|
get: function () {
|
||
|
if (this._isCancelled) {
|
||
|
return shortcutEvent;
|
||
|
}
|
||
|
if (!this._emitter) {
|
||
|
this._emitter = new Emitter();
|
||
|
}
|
||
|
return this._emitter.event;
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true
|
||
|
});
|
||
|
MutableToken.prototype.dispose = function () {
|
||
|
if (this._emitter) {
|
||
|
this._emitter.dispose();
|
||
|
this._emitter = null;
|
||
|
}
|
||
|
};
|
||
|
return MutableToken;
|
||
|
}());
|
||
|
var CancellationTokenSource = /** @class */ (function () {
|
||
|
function CancellationTokenSource(parent) {
|
||
|
this._token = undefined;
|
||
|
this._parentListener = undefined;
|
||
|
this._parentListener = parent && parent.onCancellationRequested(this.cancel, this);
|
||
|
}
|
||
|
Object.defineProperty(CancellationTokenSource.prototype, "token", {
|
||
|
get: function () {
|
||
|
if (!this._token) {
|
||
|
// be lazy and create the token only when
|
||
|
// actually needed
|
||
|
this._token = new MutableToken();
|
||
|
}
|
||
|
return this._token;
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true
|
||
|
});
|
||
|
CancellationTokenSource.prototype.cancel = function () {
|
||
|
if (!this._token) {
|
||
|
// save an object by returning the default
|
||
|
// cancelled token when cancellation happens
|
||
|
// before someone asks for the token
|
||
|
this._token = CancellationToken.Cancelled;
|
||
|
}
|
||
|
else if (this._token instanceof MutableToken) {
|
||
|
// actually cancel
|
||
|
this._token.cancel();
|
||
|
}
|
||
|
};
|
||
|
CancellationTokenSource.prototype.dispose = function () {
|
||
|
if (this._parentListener) {
|
||
|
this._parentListener.dispose();
|
||
|
}
|
||
|
if (!this._token) {
|
||
|
// ensure to initialize with an empty token if we had none
|
||
|
this._token = CancellationToken.None;
|
||
|
}
|
||
|
else if (this._token instanceof MutableToken) {
|
||
|
// actually dispose
|
||
|
this._token.dispose();
|
||
|
}
|
||
|
};
|
||
|
return CancellationTokenSource;
|
||
|
}());
|
||
|
export { CancellationTokenSource };
|