UNPKG

@sentry/core

Version:
1 lines 8.47 kB
{"version":3,"file":"syncpromise.js","sources":["../../../src/utils/syncpromise.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n\n/** SyncPromise internal states */\nconst STATE_PENDING = 0;\nconst STATE_RESOLVED = 1;\nconst STATE_REJECTED = 2;\n\ntype State = typeof STATE_PENDING | typeof STATE_RESOLVED | typeof STATE_REJECTED;\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\nexport function resolvedSyncPromise(): PromiseLike<void>;\nexport function resolvedSyncPromise<T>(value: T | PromiseLike<T>): PromiseLike<T>;\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise<T>(value?: T | PromiseLike<T>): PromiseLike<T> {\n return new SyncPromise(resolve => {\n resolve(value);\n });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise<T = never>(reason?: any): PromiseLike<T> {\n return new SyncPromise((_, reject) => {\n reject(reason);\n });\n}\n\ntype Executor<T> = (resolve: (value?: T | PromiseLike<T> | null) => void, reject: (reason?: any) => void) => void;\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nexport class SyncPromise<T> implements PromiseLike<T> {\n private _state: State;\n private _handlers: Array<[boolean, (value: T) => void, (reason: any) => any]>;\n private _value: any;\n\n public constructor(executor: Executor<T>) {\n this._state = STATE_PENDING;\n this._handlers = [];\n\n this._runExecutor(executor);\n }\n\n /** @inheritdoc */\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return new SyncPromise((resolve, reject) => {\n this._handlers.push([\n false,\n result => {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result as any);\n } else {\n try {\n resolve(onfulfilled(result));\n } catch (e) {\n reject(e);\n }\n }\n },\n reason => {\n if (!onrejected) {\n reject(reason);\n } else {\n try {\n resolve(onrejected(reason));\n } catch (e) {\n reject(e);\n }\n }\n },\n ]);\n this._executeHandlers();\n });\n }\n\n /** @inheritdoc */\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n ): PromiseLike<T | TResult> {\n return this.then(val => val, onrejected);\n }\n\n /** @inheritdoc */\n public finally<TResult>(onfinally?: (() => void) | null): PromiseLike<TResult> {\n return new SyncPromise<TResult>((resolve, reject) => {\n let val: TResult | any;\n let isRejected: boolean;\n\n return this.then(\n value => {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n },\n reason => {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n },\n ).then(() => {\n if (isRejected) {\n reject(val);\n return;\n }\n\n resolve(val as unknown as any);\n });\n });\n }\n\n /** Excute the resolve/reject handlers. */\n private _executeHandlers(): void {\n if (this._state === STATE_PENDING) {\n return;\n }\n\n const cachedHandlers = this._handlers.slice();\n this._handlers = [];\n\n cachedHandlers.forEach(handler => {\n if (handler[0]) {\n return;\n }\n\n if (this._state === STATE_RESOLVED) {\n handler[1](this._value as unknown as any);\n }\n\n if (this._state === STATE_REJECTED) {\n handler[2](this._value);\n }\n\n handler[0] = true;\n });\n }\n\n /** Run the executor for the SyncPromise. */\n private _runExecutor(executor: Executor<T>): void {\n const setResult = (state: State, value?: T | PromiseLike<T> | any): void => {\n if (this._state !== STATE_PENDING) {\n return;\n }\n\n if (isThenable(value)) {\n void (value as PromiseLike<T>).then(resolve, reject);\n return;\n }\n\n this._state = state;\n this._value = value;\n\n this._executeHandlers();\n };\n\n const resolve = (value: unknown): void => {\n setResult(STATE_RESOLVED, value);\n };\n\n const reject = (reason: unknown): void => {\n setResult(STATE_REJECTED, reason);\n };\n\n try {\n executor(resolve, reject);\n } catch (e) {\n reject(e);\n }\n }\n}\n"],"names":["isThenable"],"mappings":"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"}