UNPKG

axios

Version:

Promise based HTTP client for the browser and node.js

58 lines (45 loc) 1.39 kB
import CanceledError from '../cancel/CanceledError.js'; import AxiosError from '../core/AxiosError.js'; import utils from '../utils.js'; const composeSignals = (signals, timeout) => { signals = signals ? signals.filter(Boolean) : []; if (!timeout && !signals.length) { return; } const controller = new AbortController(); let aborted = false; 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 of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT)); }, timeout); const unsubscribe = () => { if (!signals) { return; } 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;