{"version":3,"sources":["src/common/Promise.ts"],"names":[],"mappings":"AAKA,oBAAY,YAAY;IACpB,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,QAAQ,IAAA;CACX;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7B,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAEjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;CACvC;AAED,qBAAa,aAAa,CAAC,CAAC;IACxB,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC;IACnC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC;IAC/B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;gBAEL,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAgBxE,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED,IAAW,MAAM,IAAI,CAAC,CAErB;IAEM,YAAY,QAAO,IAAI,CAI5B;CACL;AAED,qBAAa,wBAAwB,CAAC,CAAC;IAEnC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,cAAc,CAA0B;IAEzC,SAAS,WAAY,CAAC,KAAG,IAAI,CAElC;IAEK,QAAQ,UAAW,MAAM,KAAG,IAAI,CAErC;IAEK,EAAE,yBAA0B,CAAC,KAAK,IAAI,sBAAsB,MAAM,KAAK,IAAI,KAAG,IAAI,CAGvF;CACL;AAED,qBAAa,QAAQ,CAAC,CAAC,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,UAAU,CAAyB;;IAU3C,IAAW,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAE/B;IAEM,OAAO,WAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAG,SAAS,CAAC,CAAC,CAGpD;IAEK,MAAM,UAAW,MAAM,KAAG,SAAS,CAAC,CAAC,CAG1C;CACL;AAED,qBAAa,IAAI,CAAC,CAAC;IACf,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,uBAAuB,CAAqC;IAEpE,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,iBAAiB,CAA+B;;IAOxD,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,IAAW,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,CAEpC;IAEM,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IAexB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAe3B,EAAE,CACL,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,EACpC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAqBjD,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,cAAc;CAIzB;AAGD,wBAAgB,yBAAyB,CAAC,CAAC,EACvC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EACvB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAgCvC","file":"Promise.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/* eslint-disable max-classes-per-file, @typescript-eslint/typedef */\n\nexport enum PromiseState {\n    None,\n    Resolved,\n    Rejected,\n}\n\nexport interface IDeferred<T> {\n    readonly promise: Promise<T>;\n\n    resolve(result: T): IDeferred<T>;\n\n    reject(error: string): IDeferred<T>;\n}\n\nexport class PromiseResult<T> {\n    protected privIsCompleted: boolean;\n    protected privIsError: boolean;\n    protected privError: string;\n    protected privResult: T;\n\n    public constructor(promiseResultEventSource: PromiseResultEventSource<T>) {\n        promiseResultEventSource.on((result: T): void => {\n            if (!this.privIsCompleted) {\n                this.privIsCompleted = true;\n                this.privIsError = false;\n                this.privResult = result;\n            }\n        }, (error: string): void => {\n            if (!this.privIsCompleted) {\n                this.privIsCompleted = true;\n                this.privIsError = true;\n                this.privError = error;\n            }\n        });\n    }\n\n    public get isCompleted(): boolean {\n        return this.privIsCompleted;\n    }\n\n    public get isError(): boolean {\n        return this.privIsError;\n    }\n\n    public get error(): string {\n        return this.privError;\n    }\n\n    public get result(): T {\n        return this.privResult;\n    }\n\n    public throwIfError = (): void => {\n        if (this.isError) {\n            throw this.error;\n        }\n    };\n}\n\nexport class PromiseResultEventSource<T>  {\n\n    private privOnSetResult: (result: T) => void;\n    private privOnSetError: (error: string) => void;\n\n    public setResult = (result: T): void => {\n        this.privOnSetResult(result);\n    };\n\n    public setError = (error: string): void => {\n        this.privOnSetError(error);\n    };\n\n    public on = (onSetResult: (result: T) => void, onSetError: (error: string) => void): void => {\n        this.privOnSetResult = onSetResult;\n        this.privOnSetError = onSetError;\n    };\n}\n\nexport class Deferred<T> implements IDeferred<T> {\n    private privPromise: Promise<T>;\n    private privResolve: (value?: T | PromiseLike<T>) => void;\n    private privReject: (reason?: any) => void;\n\n    public constructor() {\n        // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n        this.privPromise = new Promise<T>((resolve: (value: T) => void, reject: (reason: any) => void) => {\n            this.privResolve = resolve;\n            this.privReject = reject;\n        });\n    }\n\n    public get promise(): Promise<T> {\n        return this.privPromise;\n    }\n\n    public resolve = (result: T | Promise<T>): Deferred<T> => {\n        this.privResolve(result);\n        return this;\n    };\n\n    public reject = (error: string): Deferred<T> => {\n        this.privReject(error);\n        return this;\n    };\n}\n\nexport class Sink<T> {\n    private privState: PromiseState = PromiseState.None;\n    private privPromiseResult: PromiseResult<T> = null;\n    private privPromiseResultEvents: PromiseResultEventSource<T> = null;\n\n    private privSuccessHandlers: ((result: T) => void)[] = [];\n    private privErrorHandlers: ((e: string) => void)[] = [];\n\n    public constructor() {\n        this.privPromiseResultEvents = new PromiseResultEventSource();\n        this.privPromiseResult = new PromiseResult(this.privPromiseResultEvents);\n    }\n\n    public get state(): PromiseState {\n        return this.privState;\n    }\n\n    public get result(): PromiseResult<T> {\n        return this.privPromiseResult;\n    }\n\n    public resolve(result: T): void {\n        if (this.privState !== PromiseState.None) {\n            throw new Error(\"'Cannot resolve a completed promise'\");\n        }\n\n        this.privState = PromiseState.Resolved;\n        this.privPromiseResultEvents.setResult(result);\n\n        for (let i = 0; i < this.privSuccessHandlers.length; i++) {\n            this.executeSuccessCallback(result, this.privSuccessHandlers[i], this.privErrorHandlers[i]);\n        }\n\n        this.detachHandlers();\n    }\n\n    public reject(error: string): void {\n        if (this.privState !== PromiseState.None) {\n            throw new Error(\"'Cannot reject a completed promise'\");\n        }\n\n        this.privState = PromiseState.Rejected;\n        this.privPromiseResultEvents.setError(error);\n\n        for (const errorHandler of this.privErrorHandlers) {\n            this.executeErrorCallback(error, errorHandler);\n        }\n\n        this.detachHandlers();\n    }\n\n    public on(\n        successCallback: (result: T) => void,\n        errorCallback: (error: string) => void): void {\n\n        if (successCallback == null) {\n            // eslint-disable-next-line @typescript-eslint/no-empty-function\n            successCallback = (): void => { };\n        }\n\n        if (this.privState === PromiseState.None) {\n            this.privSuccessHandlers.push(successCallback);\n            this.privErrorHandlers.push(errorCallback);\n        } else {\n            if (this.privState === PromiseState.Resolved) {\n                this.executeSuccessCallback(this.privPromiseResult.result, successCallback, errorCallback);\n            } else if (this.privState === PromiseState.Rejected) {\n                this.executeErrorCallback(this.privPromiseResult.error, errorCallback);\n            }\n\n            this.detachHandlers();\n        }\n    }\n\n    private executeSuccessCallback(result: T, successCallback: (result: T) => void, errorCallback: (error: string) => void): void {\n        try {\n            successCallback(result);\n        } catch (e) {\n            this.executeErrorCallback(`'Unhandled callback error: ${e as string}'`, errorCallback);\n        }\n    }\n\n    private executeErrorCallback(error: string, errorCallback: (error: string) => void): void {\n        if (errorCallback) {\n            try {\n                errorCallback(error);\n            } catch (e) {\n                throw new Error(`'Unhandled callback error: ${e as string}. InnerError: ${error}'`);\n            }\n        } else {\n            throw new Error(`'Unhandled error: ${error}'`);\n        }\n    }\n\n    private detachHandlers(): void {\n        this.privErrorHandlers = [];\n        this.privSuccessHandlers = [];\n    }\n}\n\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\nexport function marshalPromiseToCallbacks<T>(\n    promise: Promise<T>,\n    cb?: (value: T) => void,\n    err?: (error: string) => void): void {\n    promise.then((val: T): void => {\n        try {\n            if (!!cb) {\n                cb(val);\n            }\n        } catch (error) {\n            if (!!err) {\n                try {\n                    if (error instanceof Error) {\n                        const typedError: Error = error ;\n                        err(typedError.name + \": \" + typedError.message);\n                    } else {\n                        err(error as string);\n                    }\n                // eslint-disable-next-line no-empty\n                } catch (error) { }\n            }\n        }\n    }, (error: any): void => {\n        if (!!err) {\n            try {\n                if (error instanceof Error) {\n                    const typedError: Error = error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error as string);\n                }\n            // eslint-disable-next-line no-empty\n            } catch (error) { }\n        }\n    });\n}\n"]}