b5f3067a6a
Initial setup of project dependencies including axios, express, dotenv, and other supporting packages. Added configuration files and documentation for project setup and usage.
49 lines
1.3 KiB
JavaScript
49 lines
1.3 KiB
JavaScript
import CanceledError from "../cancel/CanceledError.js";
|
|
import AxiosError from "../core/AxiosError.js";
|
|
import utils from '../utils.js';
|
|
|
|
const composeSignals = (signals, timeout) => {
|
|
const {length} = (signals = signals ? signals.filter(Boolean) : []);
|
|
|
|
if (timeout || length) {
|
|
let controller = new AbortController();
|
|
|
|
let aborted;
|
|
|
|
const onabort = function (reason) {
|
|
if (!aborted) {
|
|
aborted = true;
|
|
unsubscribe();
|
|
const err = reason instanceof Error ? reason : this.reason;
|
|
controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
|
|
}
|
|
}
|
|
|
|
let timer = timeout && setTimeout(() => {
|
|
timer = null;
|
|
onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))
|
|
}, timeout)
|
|
|
|
const unsubscribe = () => {
|
|
if (signals) {
|
|
timer && clearTimeout(timer);
|
|
timer = null;
|
|
signals.forEach(signal => {
|
|
signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);
|
|
});
|
|
signals = null;
|
|
}
|
|
}
|
|
|
|
signals.forEach((signal) => signal.addEventListener('abort', onabort));
|
|
|
|
const {signal} = controller;
|
|
|
|
signal.unsubscribe = () => utils.asap(unsubscribe);
|
|
|
|
return signal;
|
|
}
|
|
}
|
|
|
|
export default composeSignals;
|