🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@sebspark/retry

Package Overview
Dependencies
Maintainers
3
Versions
21
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sebspark/retry - npm Package Compare versions

Comparing version
1.0.11
to
1.0.12
+4
-1
dist/index.cjs

@@ -7,3 +7,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });

if (!s.length) return void 0;
return Object.assign(defaultSettings, ...s);
return Object.assign({}, defaultSettings, ...s);
};

@@ -80,4 +80,7 @@ const wait = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));

if (typeof code === "number") return code;
/* istanbul ignore else */
if (code === "client") return clientErrorCodes;
/* istanbul ignore next */
if (code === "server") return serverErrorCodes;
/* istanbul ignore next */
return 500;

@@ -84,0 +87,0 @@ }).filter((code) => !!code);

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.cjs","names":[],"sources":["../src/retry.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\nexport type RetryConditionFunction = (error: any) => boolean\n\nexport interface RetrySettings {\n maxRetries: number\n interval: (retryCount: number) => number\n retryCondition?: RetryConditionFunction\n maxDelay?: number\n}\n\nconst defaultSettings: Partial<RetrySettings> = {\n retryCondition: () => true,\n}\nconst mergeSettings = (\n ...settings: Array<RetrySettings | undefined>\n): RetrySettings | undefined => {\n // remove undefineds, return if no settings passed\n const s = settings.filter((s) => s) as RetrySettings[]\n if (!s.length) return undefined\n\n // merge settings with priority to the latest\n const merged: RetrySettings = Object.assign(defaultSettings, ...s)\n\n return merged\n}\n\nconst wait = (ms: number) =>\n new Promise<void>((resolve) => setTimeout(() => resolve(), ms))\n\nexport const retry = async <T>(\n func: () => Promise<T>,\n ...settings: Array<RetrySettings | undefined>\n): Promise<T> => {\n const mergedSettings = mergeSettings(...settings)\n\n const makeCall = async <T>(retries = 0): Promise<T> => {\n try {\n const response = await func()\n return response as T\n } catch (error) {\n if (\n mergedSettings &&\n // biome-ignore lint/style/noNonNullAssertion: Will be set by defaultSettings\n mergedSettings.retryCondition!(error) &&\n retries < mergedSettings.maxRetries\n ) {\n await wait(mergedSettings.interval(retries + 1))\n return makeCall(retries + 1)\n }\n\n throw error\n }\n }\n return makeCall(0)\n}\n\nexport const interval = {\n fixed: (delay: number) => (_retries: number) => delay,\n linear: (delay: number) => (retries: number) => retries * delay,\n exponential:\n (delay: number, base = 2) =>\n (retries: number) =>\n base ** (retries - 1) * delay,\n}\n\nconst clientErrorCodes = [\n 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414,\n 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431, 451,\n] as const\ntype ClientErrorCode = (typeof clientErrorCodes)[number]\n\nconst serverErrorCodes = [\n 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,\n] as const\ntype ServerErrorCode = (typeof serverErrorCodes)[number]\n\ntype ErrorType = 'server' | 'client' | ServerErrorCode | ClientErrorCode\n\ntype HttpError = {\n status?: number\n statusCode?: number\n response?: {\n status?: number\n statusCode?: number\n }\n}\n\nexport const retryCondition = {\n always: (_error: unknown) => true,\n httpErrors:\n (...codes: ErrorType[]) =>\n (error: HttpError) => {\n const captureCodes = codes\n .flatMap((code) => {\n if (typeof code === 'number') return code\n if (code === 'client') return clientErrorCodes\n if (code === 'server') return serverErrorCodes\n return 500\n })\n .filter((code) => !!code) as number[]\n const status =\n error.status ||\n error.statusCode ||\n error.response?.status ||\n error.response?.statusCode ||\n 0\n return captureCodes.includes(status)\n },\n serverErrors: (error: HttpError) =>\n retryCondition.httpErrors('server')(error),\n // biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\n custom: (func: (error: any) => boolean) => func,\n}\n"],"mappings":";;AAUA,MAAM,kBAA0C,EAC9C,sBAAsB,MACvB;AACD,MAAM,iBACJ,GAAG,aAC2B;CAE9B,MAAM,IAAI,SAAS,QAAQ,MAAM,EAAE;AACnC,KAAI,CAAC,EAAE,OAAQ,QAAO,KAAA;AAKtB,QAF8B,OAAO,OAAO,iBAAiB,GAAG,EAEnD;;AAGf,MAAM,QAAQ,OACZ,IAAI,SAAe,YAAY,iBAAiB,SAAS,EAAE,GAAG,CAAC;AAEjE,MAAa,QAAQ,OACnB,MACA,GAAG,aACY;CACf,MAAM,iBAAiB,cAAc,GAAG,SAAS;CAEjD,MAAM,WAAW,OAAU,UAAU,MAAkB;AACrD,MAAI;AAEF,UAAO,MADgB,MAAM;WAEtB,OAAO;AACd,OACE,kBAEA,eAAe,eAAgB,MAAM,IACrC,UAAU,eAAe,YACzB;AACA,UAAM,KAAK,eAAe,SAAS,UAAU,EAAE,CAAC;AAChD,WAAO,SAAS,UAAU,EAAE;;AAG9B,SAAM;;;AAGV,QAAO,SAAS,EAAE;;AAGpB,MAAa,WAAW;CACtB,QAAQ,WAAmB,aAAqB;CAChD,SAAS,WAAmB,YAAoB,UAAU;CAC1D,cACG,OAAe,OAAO,OACtB,YACC,SAAS,UAAU,KAAK;CAC7B;AAED,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAClE;AAGD,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACnD;AAcD,MAAa,iBAAiB;CAC5B,SAAS,WAAoB;CAC7B,aACG,GAAG,WACH,UAAqB;EACpB,MAAM,eAAe,MAClB,SAAS,SAAS;AACjB,OAAI,OAAO,SAAS,SAAU,QAAO;AACrC,OAAI,SAAS,SAAU,QAAO;AAC9B,OAAI,SAAS,SAAU,QAAO;AAC9B,UAAO;IACP,CACD,QAAQ,SAAS,CAAC,CAAC,KAAK;EAC3B,MAAM,SACJ,MAAM,UACN,MAAM,cACN,MAAM,UAAU,UAChB,MAAM,UAAU,cAChB;AACF,SAAO,aAAa,SAAS,OAAO;;CAExC,eAAe,UACb,eAAe,WAAW,SAAS,CAAC,MAAM;CAE5C,SAAS,SAAkC;CAC5C"}
{"version":3,"file":"index.cjs","names":[],"sources":["../src/retry.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\nexport type RetryConditionFunction = (error: any) => boolean\n\nexport interface RetrySettings {\n maxRetries: number\n interval: (retryCount: number) => number\n retryCondition?: RetryConditionFunction\n maxDelay?: number\n}\n\nconst defaultSettings: Partial<RetrySettings> = {\n retryCondition: () => true,\n}\nconst mergeSettings = (\n ...settings: Array<RetrySettings | undefined>\n): RetrySettings | undefined => {\n // remove undefineds, return if no settings passed\n const s = settings.filter((s) => s) as RetrySettings[]\n if (!s.length) return undefined\n\n // merge settings with priority to the latest\n const merged: RetrySettings = Object.assign({}, defaultSettings, ...s)\n\n return merged\n}\n\nconst wait = (ms: number) =>\n new Promise<void>((resolve) => setTimeout(() => resolve(), ms))\n\nexport const retry = async <T>(\n func: () => Promise<T>,\n ...settings: Array<RetrySettings | undefined>\n): Promise<T> => {\n const mergedSettings = mergeSettings(...settings)\n\n const makeCall = async <T>(retries = 0): Promise<T> => {\n try {\n const response = await func()\n return response as T\n } catch (error) {\n if (\n mergedSettings &&\n // biome-ignore lint/style/noNonNullAssertion: Will be set by defaultSettings\n mergedSettings.retryCondition!(error) &&\n retries < mergedSettings.maxRetries\n ) {\n await wait(mergedSettings.interval(retries + 1))\n return makeCall(retries + 1)\n }\n\n throw error\n }\n }\n return makeCall(0)\n}\n\nexport const interval = {\n fixed: (delay: number) => (_retries: number) => delay,\n linear: (delay: number) => (retries: number) => retries * delay,\n exponential:\n (delay: number, base = 2) =>\n (retries: number) =>\n base ** (retries - 1) * delay,\n}\n\nconst clientErrorCodes = [\n 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414,\n 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431, 451,\n] as const\ntype ClientErrorCode = (typeof clientErrorCodes)[number]\n\nconst serverErrorCodes = [\n 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,\n] as const\ntype ServerErrorCode = (typeof serverErrorCodes)[number]\n\ntype ErrorType = 'server' | 'client' | ServerErrorCode | ClientErrorCode\n\ntype HttpError = {\n status?: number\n statusCode?: number\n response?: {\n status?: number\n statusCode?: number\n }\n}\n\nexport const retryCondition = {\n always: (_error: unknown) => true,\n httpErrors:\n (...codes: ErrorType[]) =>\n (error: HttpError) => {\n const captureCodes = codes\n .flatMap((code) => {\n if (typeof code === 'number') return code\n /* istanbul ignore else */\n if (code === 'client') return clientErrorCodes\n /* istanbul ignore next */\n if (code === 'server') return serverErrorCodes\n /* istanbul ignore next */\n return 500\n })\n .filter((code) => !!code) as number[]\n const status =\n error.status ||\n error.statusCode ||\n error.response?.status ||\n error.response?.statusCode ||\n 0\n return captureCodes.includes(status)\n },\n serverErrors: (error: HttpError) =>\n retryCondition.httpErrors('server')(error),\n // biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\n custom: (func: (error: any) => boolean) => func,\n}\n"],"mappings":";;AAUA,MAAM,kBAA0C,EAC9C,sBAAsB,MACvB;AACD,MAAM,iBACJ,GAAG,aAC2B;CAE9B,MAAM,IAAI,SAAS,QAAQ,MAAM,EAAE;AACnC,KAAI,CAAC,EAAE,OAAQ,QAAO,KAAA;AAKtB,QAF8B,OAAO,OAAO,EAAE,EAAE,iBAAiB,GAAG,EAEvD;;AAGf,MAAM,QAAQ,OACZ,IAAI,SAAe,YAAY,iBAAiB,SAAS,EAAE,GAAG,CAAC;AAEjE,MAAa,QAAQ,OACnB,MACA,GAAG,aACY;CACf,MAAM,iBAAiB,cAAc,GAAG,SAAS;CAEjD,MAAM,WAAW,OAAU,UAAU,MAAkB;AACrD,MAAI;AAEF,UAAO,MADgB,MAAM;WAEtB,OAAO;AACd,OACE,kBAEA,eAAe,eAAgB,MAAM,IACrC,UAAU,eAAe,YACzB;AACA,UAAM,KAAK,eAAe,SAAS,UAAU,EAAE,CAAC;AAChD,WAAO,SAAS,UAAU,EAAE;;AAG9B,SAAM;;;AAGV,QAAO,SAAS,EAAE;;AAGpB,MAAa,WAAW;CACtB,QAAQ,WAAmB,aAAqB;CAChD,SAAS,WAAmB,YAAoB,UAAU;CAC1D,cACG,OAAe,OAAO,OACtB,YACC,SAAS,UAAU,KAAK;CAC7B;AAED,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAClE;AAGD,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACnD;AAcD,MAAa,iBAAiB;CAC5B,SAAS,WAAoB;CAC7B,aACG,GAAG,WACH,UAAqB;EACpB,MAAM,eAAe,MAClB,SAAS,SAAS;AACjB,OAAI,OAAO,SAAS,SAAU,QAAO;;AAErC,OAAI,SAAS,SAAU,QAAO;;AAE9B,OAAI,SAAS,SAAU,QAAO;;AAE9B,UAAO;IACP,CACD,QAAQ,SAAS,CAAC,CAAC,KAAK;EAC3B,MAAM,SACJ,MAAM,UACN,MAAM,cACN,MAAM,UAAU,UAChB,MAAM,UAAU,cAChB;AACF,SAAO,aAAa,SAAS,OAAO;;CAExC,eAAe,UACb,eAAe,WAAW,SAAS,CAAC,MAAM;CAE5C,SAAS,SAAkC;CAC5C"}

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.cts","names":[],"sources":["../src/retry.ts"],"mappings":";KACY,sBAAA,IAA0B,KAAA;AAAA,UAErB,aAAA;EACf,UAAA;EACA,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,sBAAA;EACjB,QAAA;AAAA;AAAA,cAsBW,KAAA,MACX,IAAA,QAAY,OAAA,CAAQ,CAAA,MACjB,QAAA,EAAU,KAAA,CAAM,aAAA,kBAClB,OAAA,CAAQ,CAAA;AAAA,cAwBE,QAAA;6BACgB,QAAA;8BACC,OAAA;+BAEZ,IAAA,eACb,OAAA;AAAA;AAAA,cAIC,gBAAA;AAAA,KAID,eAAA,WAA0B,gBAAA;AAAA,cAEzB,gBAAA;AAAA,KAGD,eAAA,WAA0B,gBAAA;AAAA,KAE1B,SAAA,yBAAkC,eAAA,GAAkB,eAAA;AAAA,KAEpD,SAAA;EACH,MAAA;EACA,UAAA;EACA,QAAA;IACE,MAAA;IACA,UAAA;EAAA;AAAA;AAAA,cAIS,cAAA;;yBAGE,SAAA,QACV,KAAA,EAAO,SAAA;wBAiBY,SAAA;kBAGN,KAAA,uBAAsB,KAAA;AAAA"}
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/retry.ts"],"mappings":";KACY,sBAAA,IAA0B,KAAA;AAAA,UAErB,aAAA;EACf,UAAA;EACA,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,sBAAA;EACjB,QAAA;AAAA;AAAA,cAsBW,KAAA,MACX,IAAA,QAAY,OAAA,CAAQ,CAAA,MACjB,QAAA,EAAU,KAAA,CAAM,aAAA,kBAClB,OAAA,CAAQ,CAAA;AAAA,cAwBE,QAAA;6BACgB,QAAA;8BACC,OAAA;+BAEZ,IAAA,eACb,OAAA;AAAA;AAAA,cAIC,gBAAA;AAAA,KAID,eAAA,WAA0B,gBAAA;AAAA,cAEzB,gBAAA;AAAA,KAGD,eAAA,WAA0B,gBAAA;AAAA,KAE1B,SAAA,yBAAkC,eAAA,GAAkB,eAAA;AAAA,KAEpD,SAAA;EACH,MAAA;EACA,UAAA;EACA,QAAA;IACE,MAAA;IACA,UAAA;EAAA;AAAA;AAAA,cAIS,cAAA;;yBAGE,SAAA,QACV,KAAA,EAAO,SAAA;wBAoBY,SAAA;kBAGN,KAAA,uBAAsB,KAAA;AAAA"}

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.mts","names":[],"sources":["../src/retry.ts"],"mappings":";KACY,sBAAA,IAA0B,KAAA;AAAA,UAErB,aAAA;EACf,UAAA;EACA,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,sBAAA;EACjB,QAAA;AAAA;AAAA,cAsBW,KAAA,MACX,IAAA,QAAY,OAAA,CAAQ,CAAA,MACjB,QAAA,EAAU,KAAA,CAAM,aAAA,kBAClB,OAAA,CAAQ,CAAA;AAAA,cAwBE,QAAA;6BACgB,QAAA;8BACC,OAAA;+BAEZ,IAAA,eACb,OAAA;AAAA;AAAA,cAIC,gBAAA;AAAA,KAID,eAAA,WAA0B,gBAAA;AAAA,cAEzB,gBAAA;AAAA,KAGD,eAAA,WAA0B,gBAAA;AAAA,KAE1B,SAAA,yBAAkC,eAAA,GAAkB,eAAA;AAAA,KAEpD,SAAA;EACH,MAAA;EACA,UAAA;EACA,QAAA;IACE,MAAA;IACA,UAAA;EAAA;AAAA;AAAA,cAIS,cAAA;;yBAGE,SAAA,QACV,KAAA,EAAO,SAAA;wBAiBY,SAAA;kBAGN,KAAA,uBAAsB,KAAA;AAAA"}
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/retry.ts"],"mappings":";KACY,sBAAA,IAA0B,KAAA;AAAA,UAErB,aAAA;EACf,UAAA;EACA,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,sBAAA;EACjB,QAAA;AAAA;AAAA,cAsBW,KAAA,MACX,IAAA,QAAY,OAAA,CAAQ,CAAA,MACjB,QAAA,EAAU,KAAA,CAAM,aAAA,kBAClB,OAAA,CAAQ,CAAA;AAAA,cAwBE,QAAA;6BACgB,QAAA;8BACC,OAAA;+BAEZ,IAAA,eACb,OAAA;AAAA;AAAA,cAIC,gBAAA;AAAA,KAID,eAAA,WAA0B,gBAAA;AAAA,cAEzB,gBAAA;AAAA,KAGD,eAAA,WAA0B,gBAAA;AAAA,KAE1B,SAAA,yBAAkC,eAAA,GAAkB,eAAA;AAAA,KAEpD,SAAA;EACH,MAAA;EACA,UAAA;EACA,QAAA;IACE,MAAA;IACA,UAAA;EAAA;AAAA;AAAA,cAIS,cAAA;;yBAGE,SAAA,QACV,KAAA,EAAO,SAAA;wBAoBY,SAAA;kBAGN,KAAA,uBAAsB,KAAA;AAAA"}

@@ -6,3 +6,3 @@ //#region src/retry.ts

if (!s.length) return void 0;
return Object.assign(defaultSettings, ...s);
return Object.assign({}, defaultSettings, ...s);
};

@@ -79,4 +79,7 @@ const wait = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));

if (typeof code === "number") return code;
/* istanbul ignore else */
if (code === "client") return clientErrorCodes;
/* istanbul ignore next */
if (code === "server") return serverErrorCodes;
/* istanbul ignore next */
return 500;

@@ -83,0 +86,0 @@ }).filter((code) => !!code);

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","names":[],"sources":["../src/retry.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\nexport type RetryConditionFunction = (error: any) => boolean\n\nexport interface RetrySettings {\n maxRetries: number\n interval: (retryCount: number) => number\n retryCondition?: RetryConditionFunction\n maxDelay?: number\n}\n\nconst defaultSettings: Partial<RetrySettings> = {\n retryCondition: () => true,\n}\nconst mergeSettings = (\n ...settings: Array<RetrySettings | undefined>\n): RetrySettings | undefined => {\n // remove undefineds, return if no settings passed\n const s = settings.filter((s) => s) as RetrySettings[]\n if (!s.length) return undefined\n\n // merge settings with priority to the latest\n const merged: RetrySettings = Object.assign(defaultSettings, ...s)\n\n return merged\n}\n\nconst wait = (ms: number) =>\n new Promise<void>((resolve) => setTimeout(() => resolve(), ms))\n\nexport const retry = async <T>(\n func: () => Promise<T>,\n ...settings: Array<RetrySettings | undefined>\n): Promise<T> => {\n const mergedSettings = mergeSettings(...settings)\n\n const makeCall = async <T>(retries = 0): Promise<T> => {\n try {\n const response = await func()\n return response as T\n } catch (error) {\n if (\n mergedSettings &&\n // biome-ignore lint/style/noNonNullAssertion: Will be set by defaultSettings\n mergedSettings.retryCondition!(error) &&\n retries < mergedSettings.maxRetries\n ) {\n await wait(mergedSettings.interval(retries + 1))\n return makeCall(retries + 1)\n }\n\n throw error\n }\n }\n return makeCall(0)\n}\n\nexport const interval = {\n fixed: (delay: number) => (_retries: number) => delay,\n linear: (delay: number) => (retries: number) => retries * delay,\n exponential:\n (delay: number, base = 2) =>\n (retries: number) =>\n base ** (retries - 1) * delay,\n}\n\nconst clientErrorCodes = [\n 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414,\n 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431, 451,\n] as const\ntype ClientErrorCode = (typeof clientErrorCodes)[number]\n\nconst serverErrorCodes = [\n 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,\n] as const\ntype ServerErrorCode = (typeof serverErrorCodes)[number]\n\ntype ErrorType = 'server' | 'client' | ServerErrorCode | ClientErrorCode\n\ntype HttpError = {\n status?: number\n statusCode?: number\n response?: {\n status?: number\n statusCode?: number\n }\n}\n\nexport const retryCondition = {\n always: (_error: unknown) => true,\n httpErrors:\n (...codes: ErrorType[]) =>\n (error: HttpError) => {\n const captureCodes = codes\n .flatMap((code) => {\n if (typeof code === 'number') return code\n if (code === 'client') return clientErrorCodes\n if (code === 'server') return serverErrorCodes\n return 500\n })\n .filter((code) => !!code) as number[]\n const status =\n error.status ||\n error.statusCode ||\n error.response?.status ||\n error.response?.statusCode ||\n 0\n return captureCodes.includes(status)\n },\n serverErrors: (error: HttpError) =>\n retryCondition.httpErrors('server')(error),\n // biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\n custom: (func: (error: any) => boolean) => func,\n}\n"],"mappings":";AAUA,MAAM,kBAA0C,EAC9C,sBAAsB,MACvB;AACD,MAAM,iBACJ,GAAG,aAC2B;CAE9B,MAAM,IAAI,SAAS,QAAQ,MAAM,EAAE;AACnC,KAAI,CAAC,EAAE,OAAQ,QAAO,KAAA;AAKtB,QAF8B,OAAO,OAAO,iBAAiB,GAAG,EAEnD;;AAGf,MAAM,QAAQ,OACZ,IAAI,SAAe,YAAY,iBAAiB,SAAS,EAAE,GAAG,CAAC;AAEjE,MAAa,QAAQ,OACnB,MACA,GAAG,aACY;CACf,MAAM,iBAAiB,cAAc,GAAG,SAAS;CAEjD,MAAM,WAAW,OAAU,UAAU,MAAkB;AACrD,MAAI;AAEF,UAAO,MADgB,MAAM;WAEtB,OAAO;AACd,OACE,kBAEA,eAAe,eAAgB,MAAM,IACrC,UAAU,eAAe,YACzB;AACA,UAAM,KAAK,eAAe,SAAS,UAAU,EAAE,CAAC;AAChD,WAAO,SAAS,UAAU,EAAE;;AAG9B,SAAM;;;AAGV,QAAO,SAAS,EAAE;;AAGpB,MAAa,WAAW;CACtB,QAAQ,WAAmB,aAAqB;CAChD,SAAS,WAAmB,YAAoB,UAAU;CAC1D,cACG,OAAe,OAAO,OACtB,YACC,SAAS,UAAU,KAAK;CAC7B;AAED,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAClE;AAGD,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACnD;AAcD,MAAa,iBAAiB;CAC5B,SAAS,WAAoB;CAC7B,aACG,GAAG,WACH,UAAqB;EACpB,MAAM,eAAe,MAClB,SAAS,SAAS;AACjB,OAAI,OAAO,SAAS,SAAU,QAAO;AACrC,OAAI,SAAS,SAAU,QAAO;AAC9B,OAAI,SAAS,SAAU,QAAO;AAC9B,UAAO;IACP,CACD,QAAQ,SAAS,CAAC,CAAC,KAAK;EAC3B,MAAM,SACJ,MAAM,UACN,MAAM,cACN,MAAM,UAAU,UAChB,MAAM,UAAU,cAChB;AACF,SAAO,aAAa,SAAS,OAAO;;CAExC,eAAe,UACb,eAAe,WAAW,SAAS,CAAC,MAAM;CAE5C,SAAS,SAAkC;CAC5C"}
{"version":3,"file":"index.mjs","names":[],"sources":["../src/retry.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\nexport type RetryConditionFunction = (error: any) => boolean\n\nexport interface RetrySettings {\n maxRetries: number\n interval: (retryCount: number) => number\n retryCondition?: RetryConditionFunction\n maxDelay?: number\n}\n\nconst defaultSettings: Partial<RetrySettings> = {\n retryCondition: () => true,\n}\nconst mergeSettings = (\n ...settings: Array<RetrySettings | undefined>\n): RetrySettings | undefined => {\n // remove undefineds, return if no settings passed\n const s = settings.filter((s) => s) as RetrySettings[]\n if (!s.length) return undefined\n\n // merge settings with priority to the latest\n const merged: RetrySettings = Object.assign({}, defaultSettings, ...s)\n\n return merged\n}\n\nconst wait = (ms: number) =>\n new Promise<void>((resolve) => setTimeout(() => resolve(), ms))\n\nexport const retry = async <T>(\n func: () => Promise<T>,\n ...settings: Array<RetrySettings | undefined>\n): Promise<T> => {\n const mergedSettings = mergeSettings(...settings)\n\n const makeCall = async <T>(retries = 0): Promise<T> => {\n try {\n const response = await func()\n return response as T\n } catch (error) {\n if (\n mergedSettings &&\n // biome-ignore lint/style/noNonNullAssertion: Will be set by defaultSettings\n mergedSettings.retryCondition!(error) &&\n retries < mergedSettings.maxRetries\n ) {\n await wait(mergedSettings.interval(retries + 1))\n return makeCall(retries + 1)\n }\n\n throw error\n }\n }\n return makeCall(0)\n}\n\nexport const interval = {\n fixed: (delay: number) => (_retries: number) => delay,\n linear: (delay: number) => (retries: number) => retries * delay,\n exponential:\n (delay: number, base = 2) =>\n (retries: number) =>\n base ** (retries - 1) * delay,\n}\n\nconst clientErrorCodes = [\n 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414,\n 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431, 451,\n] as const\ntype ClientErrorCode = (typeof clientErrorCodes)[number]\n\nconst serverErrorCodes = [\n 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,\n] as const\ntype ServerErrorCode = (typeof serverErrorCodes)[number]\n\ntype ErrorType = 'server' | 'client' | ServerErrorCode | ClientErrorCode\n\ntype HttpError = {\n status?: number\n statusCode?: number\n response?: {\n status?: number\n statusCode?: number\n }\n}\n\nexport const retryCondition = {\n always: (_error: unknown) => true,\n httpErrors:\n (...codes: ErrorType[]) =>\n (error: HttpError) => {\n const captureCodes = codes\n .flatMap((code) => {\n if (typeof code === 'number') return code\n /* istanbul ignore else */\n if (code === 'client') return clientErrorCodes\n /* istanbul ignore next */\n if (code === 'server') return serverErrorCodes\n /* istanbul ignore next */\n return 500\n })\n .filter((code) => !!code) as number[]\n const status =\n error.status ||\n error.statusCode ||\n error.response?.status ||\n error.response?.statusCode ||\n 0\n return captureCodes.includes(status)\n },\n serverErrors: (error: HttpError) =>\n retryCondition.httpErrors('server')(error),\n // biome-ignore lint/suspicious/noExplicitAny: Errors can be anything\n custom: (func: (error: any) => boolean) => func,\n}\n"],"mappings":";AAUA,MAAM,kBAA0C,EAC9C,sBAAsB,MACvB;AACD,MAAM,iBACJ,GAAG,aAC2B;CAE9B,MAAM,IAAI,SAAS,QAAQ,MAAM,EAAE;AACnC,KAAI,CAAC,EAAE,OAAQ,QAAO,KAAA;AAKtB,QAF8B,OAAO,OAAO,EAAE,EAAE,iBAAiB,GAAG,EAEvD;;AAGf,MAAM,QAAQ,OACZ,IAAI,SAAe,YAAY,iBAAiB,SAAS,EAAE,GAAG,CAAC;AAEjE,MAAa,QAAQ,OACnB,MACA,GAAG,aACY;CACf,MAAM,iBAAiB,cAAc,GAAG,SAAS;CAEjD,MAAM,WAAW,OAAU,UAAU,MAAkB;AACrD,MAAI;AAEF,UAAO,MADgB,MAAM;WAEtB,OAAO;AACd,OACE,kBAEA,eAAe,eAAgB,MAAM,IACrC,UAAU,eAAe,YACzB;AACA,UAAM,KAAK,eAAe,SAAS,UAAU,EAAE,CAAC;AAChD,WAAO,SAAS,UAAU,EAAE;;AAG9B,SAAM;;;AAGV,QAAO,SAAS,EAAE;;AAGpB,MAAa,WAAW;CACtB,QAAQ,WAAmB,aAAqB;CAChD,SAAS,WAAmB,YAAoB,UAAU;CAC1D,cACG,OAAe,OAAO,OACtB,YACC,SAAS,UAAU,KAAK;CAC7B;AAED,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAClE;AAGD,MAAM,mBAAmB;CACvB;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACnD;AAcD,MAAa,iBAAiB;CAC5B,SAAS,WAAoB;CAC7B,aACG,GAAG,WACH,UAAqB;EACpB,MAAM,eAAe,MAClB,SAAS,SAAS;AACjB,OAAI,OAAO,SAAS,SAAU,QAAO;;AAErC,OAAI,SAAS,SAAU,QAAO;;AAE9B,OAAI,SAAS,SAAU,QAAO;;AAE9B,UAAO;IACP,CACD,QAAQ,SAAS,CAAC,CAAC,KAAK;EAC3B,MAAM,SACJ,MAAM,UACN,MAAM,cACN,MAAM,UAAU,UAChB,MAAM,UAAU,cAChB;AACF,SAAO,aAAa,SAAS,OAAO;;CAExC,eAAe,UACb,eAAe,WAAW,SAAS,CAAC,MAAM;CAE5C,SAAS,SAAkC;CAC5C"}
{
"name": "@sebspark/retry",
"version": "1.0.11",
"version": "1.0.12",
"license": "Apache-2.0",

@@ -31,3 +31,3 @@ "main": "dist/index.cjs",

"devDependencies": {
"axios": "1.15.2"
"axios": "1.16.0"
},

@@ -34,0 +34,0 @@ "repository": {