cyb/src/utils/request-with-retry.ts

/* eslint-disable no-promise-executor-return */
/* eslint-disable no-await-in-loop */
/* eslint-disable import/prefer-default-export */
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';

export const requestWithRetry = async (
  config: AxiosRequestConfig,
  interval = 1500,
  timeout = 10000
): Promise<AxiosResponse> => {
  const startTime = Date.now();

  while (Date.now() - startTime < timeout) {
    try {
      const response = await axios(config);
      return response;
    } catch (error) {
      const axiosError = error as AxiosError;

      if (
        axiosError.response?.status !== 404 ||
        Date.now() - startTime >= timeout
      ) {
        throw axiosError;
      }

      await new Promise((resolve) => setTimeout(resolve, interval));
    }
  }

  throw new Error(`Request failed after ${timeout} ms`);
};

Neighbours