composeSignals.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import CanceledError from "../cancel/CanceledError.js";
  2. import AxiosError from "../core/AxiosError.js";
  3. const composeSignals = (signals, timeout) => {
  4. let controller = new AbortController();
  5. let aborted;
  6. const onabort = function (cancel) {
  7. if (!aborted) {
  8. aborted = true;
  9. unsubscribe();
  10. const err = cancel instanceof Error ? cancel : this.reason;
  11. controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
  12. }
  13. }
  14. let timer = timeout && setTimeout(() => {
  15. onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))
  16. }, timeout)
  17. const unsubscribe = () => {
  18. if (signals) {
  19. timer && clearTimeout(timer);
  20. timer = null;
  21. signals.forEach(signal => {
  22. signal &&
  23. (signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort));
  24. });
  25. signals = null;
  26. }
  27. }
  28. signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort));
  29. const {signal} = controller;
  30. signal.unsubscribe = unsubscribe;
  31. return [signal, () => {
  32. timer && clearTimeout(timer);
  33. timer = null;
  34. }];
  35. }
  36. export default composeSignals;