/** * @author Kuitos * @since 2020-02-18 */ import { AxiosAdapter, AxiosResponse } from 'axios'; import shouldLogInfo from './utils/shouldLogInfo'; declare module 'axios' { interface AxiosRequestConfig { retryTimes?: number; } } export type Options = { times?: number; }; export default function retryAdapterEnhancer(adapter: AxiosAdapter, options: Options = {}): AxiosAdapter { const { times = 2 } = options; return async config => { const { retryTimes = times } = config; let timeUp = false; let count = 0; const request = async (): Promise => { try { return await adapter(config); } catch (e) { timeUp = retryTimes === count; if (timeUp) { throw e; } count++; /* istanbul ignore next */ if (shouldLogInfo()) { console.info(`[axios-extensions] request start retrying --> url: ${config.url} , time: ${count}`); } return request(); } }; return request(); }; }