@lifaon/rx-js-light
Version:
Blazing fast Observables
71 lines (70 loc) • 2.5 kB
JavaScript
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();
}
};
}
};
}