| 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; | |