@lifaon/rx-js-light
Version:
Blazing fast Observables
47 lines (46 loc) • 1.82 kB
JavaScript
import {createEventListener} from "../../event-listener/__old/create-event-listener.mjs";
import {toTypedEventTarget} from "../../event-listener/__old/to-typed-event-target.mjs";
import {createAbortError} from "../../errors/abort-error/create-abort-error.mjs";
import {DEFAULT_ABORTED_PROMISE_FACTORY} from "../default-aborted-promise-factory.constant.mjs";
export function awaitPromiseFactoryWithAbortSignal(promiseFactory, signal, onFulfilled, onRejected, onAborted) {
if (signal.aborted) {
onAborted();
} else {
let running = true;
const end = () => {
running = false;
removeAbortEventListener();
};
const removeAbortEventListener = createEventListener(toTypedEventTarget(signal), 'abort', () => {
end();
onAborted();
});
promiseFactory(signal).then(value => {
if (running) {
end();
onFulfilled(value);
}
}, error => {
if (running) {
end();
onRejected(error);
}
});
}
}
export function awaitPromiseWithAbortSignal(promise, signal, onFulfilled, onRejected, onAborted) {
return awaitPromiseFactoryWithAbortSignal(() => promise, signal, onFulfilled, onRejected, onAborted);
}
export function abortSignalPromiseBranching(signal, promiseFactoryNotAborted, promiseFactoryAborted = DEFAULT_ABORTED_PROMISE_FACTORY) {
return signal.aborted ? promiseFactoryAborted(signal) : promiseFactoryNotAborted(signal);
}
export function wrapPromiseFactoryWithAbortSignal(promiseFactory, signal) {
return new Promise((resolve, reject) => {
awaitPromiseFactoryWithAbortSignal(promiseFactory, signal, resolve, reject, () => reject(createAbortError({
signal
})));
});
}
export function wrapPromiseWithAbortSignal(promise, signal) {
return wrapPromiseFactoryWithAbortSignal(() => promise, signal);
}