UNPKG

11.5 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../es/index.js"],"names":["isNetworkError","isRetryableError","isSafeRequestError","isIdempotentRequestError","isNetworkOrIdempotentRequestError","exponentialDelay","axiosRetry","namespace","error","response","Boolean","code","SAFE_HTTP_METHODS","IDEMPOTENT_HTTP_METHODS","concat","status","config","indexOf","method","noDelay","retryNumber","delay","Math","pow","randomSum","random","getCurrentState","currentState","retryCount","getRequestOptions","defaultOptions","Object","assign","fixConfig","axios","defaults","agent","httpAgent","httpsAgent","interceptors","request","use","lastRequestTime","Date","now","Promise","reject","retries","retryCondition","retryDelay","shouldResetTimeout","shouldRetry","timeout","lastRequestDuration","max","transformRequest","data","setTimeout","resolve"],"mappings":"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","file":"index.js","sourcesContent":["import isRetryAllowed from 'is-retry-allowed';\n\nconst namespace = 'axios-retry';\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isNetworkError(error) {\n return (\n !error.response &&\n Boolean(error.code) && // Prevents retrying cancelled requests\n error.code !== 'ECONNABORTED' && // Prevents retrying timed out requests\n isRetryAllowed(error)\n ); // Prevents retrying unsafe errors\n}\n\nconst SAFE_HTTP_METHODS = ['get', 'head', 'options'];\nconst IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isRetryableError(error) {\n return (\n error.code !== 'ECONNABORTED' &&\n (!error.response || (error.response.status >= 500 && error.response.status <= 599))\n );\n}\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isSafeRequestError(error) {\n if (!error.config) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isIdempotentRequestError(error) {\n if (!error.config) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isNetworkOrIdempotentRequestError(error) {\n return isNetworkError(error) || isIdempotentRequestError(error);\n}\n\n/**\n * @return {number} - delay in milliseconds, always 0\n */\nfunction noDelay() {\n return 0;\n}\n\n/**\n * @param {number} [retryNumber=0]\n * @return {number} - delay in milliseconds\n */\nexport function exponentialDelay(retryNumber = 0) {\n const delay = Math.pow(2, retryNumber) * 100;\n const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay\n return delay + randomSum;\n}\n\n/**\n * Initializes and returns the retry state for the given request/config\n * @param {AxiosRequestConfig} config\n * @return {Object}\n */\nfunction getCurrentState(config) {\n const currentState = config[namespace] || {};\n currentState.retryCount = currentState.retryCount || 0;\n config[namespace] = currentState;\n return currentState;\n}\n\n/**\n * Returns the axios-retry options for the current request\n * @param {AxiosRequestConfig} config\n * @param {AxiosRetryConfig} defaultOptions\n * @return {AxiosRetryConfig}\n */\nfunction getRequestOptions(config, defaultOptions) {\n return Object.assign({}, defaultOptions, config[namespace]);\n}\n\n/**\n * @param {Axios} axios\n * @param {AxiosRequestConfig} config\n */\nfunction fixConfig(axios, config) {\n if (axios.defaults.agent === config.agent) {\n delete config.agent;\n }\n if (axios.defaults.httpAgent === config.httpAgent) {\n delete config.httpAgent;\n }\n if (axios.defaults.httpsAgent === config.httpsAgent) {\n delete config.httpsAgent;\n }\n}\n\n/**\n * Adds response interceptors to an axios instance to retry requests failed due to network issues\n *\n * @example\n *\n * import axios from 'axios';\n *\n * axiosRetry(axios, { retries: 3 });\n *\n * axios.get('http://example.com/test') // The first request fails and the second returns 'ok'\n * .then(result => {\n * result.data; // 'ok'\n * });\n *\n * // Exponential back-off retry delay between requests\n * axiosRetry(axios, { retryDelay : axiosRetry.exponentialDelay});\n *\n * // Custom retry delay\n * axiosRetry(axios, { retryDelay : (retryCount) => {\n * return retryCount * 1000;\n * }});\n *\n * // Also works with custom axios instances\n * const client = axios.create({ baseURL: 'http://example.com' });\n * axiosRetry(client, { retries: 3 });\n *\n * client.get('/test') // The first request fails and the second returns 'ok'\n * .then(result => {\n * result.data; // 'ok'\n * });\n *\n * // Allows request-specific configuration\n * client\n * .get('/test', {\n * 'axios-retry': {\n * retries: 0\n * }\n * })\n * .catch(error => { // The first request fails\n * error !== undefined\n * });\n *\n * @param {Axios} axios An axios instance (the axios object or one created from axios.create)\n * @param {Object} [defaultOptions]\n * @param {number} [defaultOptions.retries=3] Number of retries\n * @param {boolean} [defaultOptions.shouldResetTimeout=false]\n * Defines if the timeout should be reset between retries\n * @param {Function} [defaultOptions.retryCondition=isNetworkOrIdempotentRequestError]\n * A function to determine if the error can be retried\n * @param {Function} [defaultOptions.retryDelay=noDelay]\n * A function to determine the delay between retry requests\n */\nexport default function axiosRetry(axios, defaultOptions) {\n axios.interceptors.request.use(config => {\n const currentState = getCurrentState(config);\n currentState.lastRequestTime = Date.now();\n return config;\n });\n\n axios.interceptors.response.use(null, error => {\n const config = error.config;\n\n // If we have no information to retry the request\n if (!config) {\n return Promise.reject(error);\n }\n\n const {\n retries = 3,\n retryCondition = isNetworkOrIdempotentRequestError,\n retryDelay = noDelay,\n shouldResetTimeout = false\n } = getRequestOptions(config, defaultOptions);\n\n const currentState = getCurrentState(config);\n\n const shouldRetry = retryCondition(error) && currentState.retryCount < retries;\n\n if (shouldRetry) {\n currentState.retryCount += 1;\n const delay = retryDelay(currentState.retryCount, error);\n\n // Axios fails merging this configuration to the default configuration because it has an issue\n // with circular structures: https://github.com/mzabriskie/axios/issues/370\n fixConfig(axios, config);\n\n if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {\n const lastRequestDuration = Date.now() - currentState.lastRequestTime;\n // Minimum 1ms timeout (passing 0 or less to XHR means no timeout)\n config.timeout = Math.max(config.timeout - lastRequestDuration - delay, 1);\n }\n\n config.transformRequest = [data => data];\n\n return new Promise(resolve => setTimeout(() => resolve(axios(config)), delay));\n }\n\n return Promise.reject(error);\n });\n}\n\n// Compatibility with CommonJS\naxiosRetry.isNetworkError = isNetworkError;\naxiosRetry.isSafeRequestError = isSafeRequestError;\naxiosRetry.isIdempotentRequestError = isIdempotentRequestError;\naxiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;\naxiosRetry.exponentialDelay = exponentialDelay;\naxiosRetry.isRetryableError = isRetryableError;\n"]}
\No newline at end of file