From 55a4f1fc869e41aca748c63d3018f0448b1606e0 Mon Sep 17 00:00:00 2001 From: pack Date: Sun, 9 Aug 2026 10:37:07 +0000 Subject: first commit --- node_modules/exponential-backoff/src/backoff.ts | 60 +++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 node_modules/exponential-backoff/src/backoff.ts (limited to 'node_modules/exponential-backoff/src/backoff.ts') diff --git a/node_modules/exponential-backoff/src/backoff.ts b/node_modules/exponential-backoff/src/backoff.ts new file mode 100644 index 0000000..549770b --- /dev/null +++ b/node_modules/exponential-backoff/src/backoff.ts @@ -0,0 +1,60 @@ +import { + IBackOffOptions, + getSanitizedOptions, + BackoffOptions +} from "./options"; +import { DelayFactory } from "./delay/delay.factory"; + +export { BackoffOptions, IBackOffOptions }; + +/** + * Executes a function with exponential backoff. + * @param request the function to be executed + * @param options options to customize the backoff behavior + * @returns Promise that resolves to the result of the `request` function + */ +export async function backOff( + request: () => Promise, + options: BackoffOptions = {} +): Promise { + const sanitizedOptions = getSanitizedOptions(options); + const backOff = new BackOff(request, sanitizedOptions); + + return await backOff.execute(); +} + +class BackOff { + private attemptNumber = 0; + + constructor( + private request: () => Promise, + private options: IBackOffOptions + ) {} + + public async execute(): Promise { + while (!this.attemptLimitReached) { + try { + await this.applyDelay(); + return await this.request(); + } catch (e) { + this.attemptNumber++; + const shouldRetry = await this.options.retry(e, this.attemptNumber); + + if (!shouldRetry || this.attemptLimitReached) { + throw e; + } + } + } + + throw new Error("Something went wrong."); + } + + private get attemptLimitReached() { + return this.attemptNumber >= this.options.numOfAttempts; + } + + private async applyDelay() { + const delay = DelayFactory(this.options, this.attemptNumber); + await delay.apply(); + } +} -- cgit v1.2.3