UNPKG

@lifaon/rx-js-light

Version:

Blazing fast Observables

71 lines (70 loc) 2.5 kB
import {isAbortSignal} from "../../../../../../misc/abortable/is/is-abort-signal.mjs"; import {createEventListener} from "../../../../../../misc/event-listener/functions/create-event-listener.mjs"; import {toTypedEventTarget} from "../../../../../../misc/event-listener/functions/to-typed-event-target.mjs"; import {noop} from "../../../../../../misc/helpers/noop.mjs"; import {STATIC_COMPLETE_NOTIFICATION} from "../../../../../../misc/notifications/built-in/complete/complete-notification.constant.mjs"; import {createErrorNotification} from "../../../../../../misc/notifications/built-in/error/create-error-notification.mjs"; import {createAbortErrorNotification} from "../../../../../../misc/notifications/built-in/error/derived/create-abort-error-notification.mjs"; import {createNextNotification} from "../../../../../../misc/notifications/built-in/next/create-next-notification.mjs"; export function fromPromiseFactory(createPromise, options) { const signal = options !== void 0 && isAbortSignal(options.signal) ? options.signal : null; return emit => { if (signal !== null && signal.aborted) { emit(createAbortErrorNotification({ signal })); return noop; } else { let running = true; const abortController = new AbortController(); const end = () => { running = false; if (removeAbortEventListener !== void 0) { removeAbortEventListener(); } }; const next = value => { if (running) { emit(createNextNotification(value)); } }; const complete = () => { if (running) { end(); emit(STATIC_COMPLETE_NOTIFICATION); } }; const error = error => { if (running) { end(); emit(createErrorNotification(error)); } }; const abort = () => { if (running) { end(); emit(createAbortErrorNotification({ signal: signal })); } }; let removeAbortEventListener; if (signal !== null) { removeAbortEventListener = createEventListener(toTypedEventTarget(signal), 'abort', () => { abort(); abortController.abort(); }); } createPromise(abortController.signal).then(value => { next(value); complete(); }, error); return () => { if (running) { end(); abortController.abort(); } }; } }; }