From 98e5e1af39eaac5ba5a0143ac2bbfbebcbbcaf51 Mon Sep 17 00:00:00 2001 From: Chalenge Masekera Date: Mon, 24 Jun 2024 09:28:54 -0400 Subject: [PATCH] Support passing function for axios client delay (#270) --- package-lock.json | 14 +++++++------- src/axios.ts | 10 ++++++++-- test/axios.test.ts | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7492691..b6d7812 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1923,12 +1923,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2766,9 +2766,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" diff --git a/src/axios.ts b/src/axios.ts index 460ed67..c07e590 100644 --- a/src/axios.ts +++ b/src/axios.ts @@ -5,6 +5,8 @@ import {Logger} from 'pino'; import {wrapApiError} from './errors'; +type DelayFunction = (error: AxiosError) => number; + export const DEFAULT_RETRIES = 3; export const DEFAULT_RETRY_DELAY = 1000; @@ -30,7 +32,7 @@ export function makeAxiosInstanceWithRetry( config?: AxiosRequestConfig, logger?: Logger, retries = DEFAULT_RETRIES, - delay = DEFAULT_RETRY_DELAY + delay: number | DelayFunction = DEFAULT_RETRY_DELAY ): AxiosInstance { const isNetworkError = (error: AxiosError): boolean => { return ( @@ -60,7 +62,11 @@ export function makeAxiosInstanceWithRetry( wrapApiError(error, `Retry attempt ${retryNumber} of ${retries}`) ); } - return retryNumber * delay; + if (typeof delay === 'number') { + return retryNumber * delay; + } + return delay(error); + }, shouldResetTimeout: true, }); diff --git a/test/axios.test.ts b/test/axios.test.ts index d846f2d..987a452 100644 --- a/test/axios.test.ts +++ b/test/axios.test.ts @@ -114,4 +114,20 @@ describe('axios', () => { ); mock.done(); }); + + test('delay using function', async () => { + const mock = mockPostCode('/hi', 502); + const client = sut.makeAxiosInstanceWithRetry( + {baseURL: apiUrl}, + undefined, + 3, + () => { + return 50; + } + ); + const res = await client.post('/hi'); + expect(res.status).toBe(200); + expect(res.data).toStrictEqual({tenantId: '1'}); + mock.done(); + }); });