UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

59 lines 1.98 kB
/** * @module BackoffPolicy */ import {} from "../../backoff-policies/_shared.js"; import { TO_MILLISECONDS, } from "../../time-span/contracts/_module.js"; import { TimeSpan } from "../../time-span/implementations/_module.js"; import { callInvokable, isInvokable, withJitter } from "../../utilities/_module.js"; /** * @internal */ export function resolvePolynomialBackoffSettings(settings) { const { maxDelay = TimeSpan.fromMilliseconds(6000), minDelay = TimeSpan.fromMilliseconds(1_000), degree = 2, jitter = 0.5, _mathRandom = Math.random, } = settings; return { maxDelay, minDelay, degree, jitter, _mathRandom, }; } /** * Polynomial backoff policy with jitter * * IMPORT_PATH: `"@daiso-tech/core/backoff-policies"` */ export function polynomialBackoff(settings = {}) { return (attempt, error) => { if (isInvokable(settings)) { const dynamicSettings = callInvokable(settings, error); if (dynamicSettings === undefined) { settings = {}; } else { settings = dynamicSettings; } } const { maxDelay, minDelay, degree, jitter, _mathRandom } = resolvePolynomialBackoffSettings(settings); const polynomial = Math.min(maxDelay[TO_MILLISECONDS](), minDelay[TO_MILLISECONDS]() * Math.pow(attempt, degree)); return TimeSpan.fromMilliseconds(withJitter({ jitter, value: polynomial, randomValue: _mathRandom(), })); }; } /** * @internal */ export function serializePolynomialBackoffSettings(settings) { const { maxDelay, minDelay, degree, jitter, _mathRandom } = resolvePolynomialBackoffSettings(settings); return { maxDelay: maxDelay[TO_MILLISECONDS](), minDelay: minDelay[TO_MILLISECONDS](), degree, jitter, _mathRandom: _mathRandom(), }; } //# sourceMappingURL=polynomial-backoff.js.map