From f6a0abd20d5e50da698b0153482e941abfde984f Mon Sep 17 00:00:00 2001 From: Will Date: Wed, 26 Apr 2023 15:39:36 -0700 Subject: [PATCH] Retry more network errors (#126) --- package-lock.json | 1 + package.json | 1 + src/axios.ts | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7106022..cd58e80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "commander": "^9.3.0", "fs-extra": "^9.1.0", "graphql": "^16.3.0", + "is-retry-allowed": "^2.2.0", "json-to-graphql-query": "^2.2.4", "lodash": "^4.17.21", "luxon": "^3.1.1", diff --git a/package.json b/package.json index ad2cef0..50c9648 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "commander": "^9.3.0", "fs-extra": "^9.1.0", "graphql": "^16.3.0", + "is-retry-allowed": "^2.2.0", "json-to-graphql-query": "^2.2.4", "lodash": "^4.17.21", "luxon": "^3.1.1", diff --git a/src/axios.ts b/src/axios.ts index cfa4c54..73ca050 100644 --- a/src/axios.ts +++ b/src/axios.ts @@ -1,5 +1,6 @@ -import axios, {AxiosInstance, AxiosRequestConfig} from 'axios'; +import axios, {AxiosError, AxiosInstance, AxiosRequestConfig} from 'axios'; import axiosRetry, {IAxiosRetryConfig, isRetryableError} from 'axios-retry'; +import isRetryAllowed from 'is-retry-allowed'; import {Logger} from 'pino'; import {wrapApiError} from './errors'; @@ -31,11 +32,19 @@ export function makeAxiosInstanceWithRetry( retries = DEFAULT_RETRIES, delay = DEFAULT_RETRY_DELAY ): AxiosInstance { + const isNetworkError = (error: AxiosError): boolean => { + return ( + !error.response && + Boolean(error.code) && // Prevents retrying cancelled requests + isRetryAllowed(error) // Prevents retrying unsafe errors + ); + }; + return makeAxiosInstance(config, { retries, retryCondition: (error) => { // Timeouts should be retryable - return error.code === 'ECONNABORTED' || isRetryableError(error); + return isNetworkError(error) || isRetryableError(error); }, retryDelay: (retryNumber, error) => { if (logger) { @@ -45,6 +54,6 @@ export function makeAxiosInstanceWithRetry( } return retryNumber * delay; }, - shouldResetTimeout: true + shouldResetTimeout: true, }); }