{"version":3,"sources":["../../../packages/core/async/cancellation.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,qBAAa,uBAAuB;IAChC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAEtD;;;OAGG;gBACS,iBAAiB,CAAC,EAAE,MAAM;IAQtC,uEAAuE;IACvE,IAAW,uBAAuB,IAAI,OAAO,CAE5C;IAED,+EAA+E;IAC/E,IAAW,KAAK,IAAI,iBAAiB,CAEpC;IAED;;;;;OAKG;WACW,uBAAuB,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,GAAG,uBAAuB;IAU9F,+CAA+C;IACxC,MAAM,IAAI,IAAI;IAKrB;;;OAGG;IACI,WAAW,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAKnD,gGAAgG;IACzF,OAAO,IAAI,IAAI;IAStB,OAAO,CAAC,WAAW;CAQtB;AAED,kEAAkE;AAClE,qBAAa,iBAAiB;IASd,OAAO,CAAC,QAAQ,CAAC,MAAM;IARnC,OAAO,CAAC,MAAM,CAAC,IAAI,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IAErD;;;OAGG;gBAC0B,MAAM,EAAE,uBAAuB;IAO5D,gDAAgD;IAChD,WAAkB,IAAI,IAAI,iBAAiB,CAK1C;IAED,sFAAsF;IACtF,IAAW,uBAAuB,IAAI,OAAO,CAE5C;IAED,oEAAoE;IAC7D,4BAA4B,IAAI,IAAI;IAM3C;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAI3C,OAAO,CAAC,MAAM;CAUjB","file":"cancellation.d.ts","sourcesContent":["/** Signals to a CancellationToken that it should be canceled. */\r\nexport class CancellationTokenSource {\r\n    private timerHandle = 0;\r\n    private disposed = false;\r\n    private canceled = false;\r\n    private readonly cancellationToken: CancellationToken;\r\n\r\n    /**\r\n     * Initializes a new instance of the CancellationTokenSource class.\r\n     * @param millisecondsDelay The optional time interval in milliseconds to wait before canceling.\r\n     */\r\n    constructor(millisecondsDelay?: number) {\r\n        this.cancellationToken = new CancellationToken(this);\r\n\r\n        if (millisecondsDelay) {\r\n            this.cancelAfter(millisecondsDelay);\r\n        }\r\n    }\r\n\r\n    /** Gets a value indicating whether cancellation has been requested. */\r\n    public get isCancellationRequested(): boolean {\r\n        return this.canceled;\r\n    }\r\n\r\n    /** Gets the CancellationToken associated with this CancellationTokenSource. */\r\n    public get token(): CancellationToken {\r\n        return this.cancellationToken;\r\n    }\r\n\r\n    /**\r\n     * Creates a CancellationTokenSource that will be in the canceled state when any of the source tokens\r\n     * in the specified array are in the canceled state.\r\n     * @param tokens An array that contains the cancellation token instances to observe.\r\n     * @returns A CancellationTokenSource that is linked to the source tokens.\r\n     */\r\n    public static createLinkedTokenSource(...tokens: CancellationToken[]): CancellationTokenSource {\r\n        const source = new CancellationTokenSource();\r\n\r\n        tokens.forEach((token) => {\r\n            token.register(source.cancel.bind(this));\r\n        });\r\n\r\n        return source;\r\n    }\r\n\r\n    /** Communicates a request for cancellation. */\r\n    public cancel(): void {\r\n        this.canceled = true;\r\n        this.cancelTimer();\r\n    }\r\n\r\n    /**\r\n     * Schedules a cancel operation on this CancellationTokenSource after the specified number of milliseconds.\r\n     * @param millisecondsDelay The time span to wait before canceling this CancellationTokenSource.\r\n     */\r\n    public cancelAfter(millisecondsDelay: number): void {\r\n        this.cancelTimer();\r\n        this.timerHandle = setTimeout(<TimerHandler>this.cancel.bind(this), millisecondsDelay);\r\n    }\r\n\r\n    /** Releases all resources used by the current instance of the CancellationTokenSource class. */\r\n    public dispose(): void {\r\n        if (this.disposed) {\r\n            return;\r\n        }\r\n\r\n        this.disposed = true;\r\n        this.cancelTimer();\r\n    }\r\n\r\n    private cancelTimer(): void {\r\n        if (this.timerHandle === 0) {\r\n            return;\r\n        }\r\n\r\n        clearTimeout(this.timerHandle);\r\n        this.timerHandle = 0;\r\n    }\r\n}\r\n\r\n/** Propagates notification that operations should be canceled. */\r\nexport class CancellationToken {\r\n    private static none: CancellationToken = null;\r\n    private readonly parentCancel: () => void;\r\n    private readonly callbacks = new Array<() => void>();\r\n\r\n    /**\r\n     * Initializes a new instance of the CancellationToken class.\r\n     * @param source The underlying CancellationTokenSource.\r\n     */\r\n    constructor(private readonly source: CancellationTokenSource) {\r\n        // this is a 'bait & switch' because only a CTS is allowed to trigger cancellation\r\n        const originalCancel = source.cancel;\r\n        this.parentCancel = () => originalCancel.call(this.source);\r\n        this.source.cancel = () => this.cancel();\r\n    }\r\n\r\n    /** Returns an empty CancellationToken value. */\r\n    public static get NONE(): CancellationToken {\r\n        if (CancellationToken.none === null) {\r\n            CancellationToken.none = new CancellationTokenSource().token;\r\n        }\r\n        return CancellationToken.none;\r\n    }\r\n\r\n    /** Gets a value indicating whether cancellation has been requested for this token. */\r\n    public get isCancellationRequested(): boolean {\r\n        return this.source.isCancellationRequested;\r\n    }\r\n\r\n    /** Throws an Error if this token has had cancellation requested. */\r\n    public throwIfCancellationRequested(): void {\r\n        if (this.isCancellationRequested) {\r\n            throw new Error('The operation was canceled.');\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Registers a function that will be called when this CancellationToken is canceled.\r\n     * @param callback The function to be executed when the CancellationToken is canceled.\r\n     */\r\n    public register(callback: () => void): void {\r\n        this.callbacks.push(callback);\r\n    }\r\n\r\n    private cancel(): void {\r\n        if (this.isCancellationRequested) {\r\n            return;\r\n        }\r\n\r\n        this.parentCancel();\r\n        this.callbacks.forEach((callback) => {\r\n            callback();\r\n        });\r\n    }\r\n}\r\n"]}