@terminus/ngx-tools
Version:
[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github
34 lines • 4.41 kB
JavaScript
const DEFAULT_JITTER_FACTOR = .3;
const DEFAULT_BACK_OFF_TIME = 2;
const DEFAULT_BASE_WAIT_TIME = 100;
/**
* Calculate retry timing
*
* `jitter`: "Slight irregular movement, variation, or unsteadiness,
* especially in an electrical signal or electronic device"
*
* @param options - The options object
* - `jitter`: If the duration should be affected by a jitter effect
* - `jitterFactor`: How widely the jitter effect should vary
* - `backOffFactor`: How quickly the duration should back off
* - `baseWaitTime`: The base time when determining sleep duration
* @returns The duration to sleep
*
* @example
* const calcOpts: DelayCalculator = {
* jitter: true,
* jitterFactor: .3,
* backOffFactor: 2,
* baseWaitTime: 100,
* }
* // Create a retrier with a custom backoff
* retryWithBackoff({retries: 3, delayCalculator: exponentialBackoffDelayCalculator(calcOpts)})
*/
export const exponentialBackoffDelayCalculator = ({ jitter = true, jitterFactor = DEFAULT_JITTER_FACTOR, backOffFactor = DEFAULT_BACK_OFF_TIME, baseWaitTime = DEFAULT_BASE_WAIT_TIME, }) => function (attempt) {
let sleepDuration = baseWaitTime * Math.pow(backOffFactor, attempt);
if (jitter) {
sleepDuration *= (1 - (jitterFactor * Math.random()));
}
return sleepDuration;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsYXktY2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0ZXJtaW51cy9uZ3gtdG9vbHMvdXRpbGl0aWVzLyIsInNvdXJjZXMiOlsicmV0cnktd2l0aC1iYWNrb2ZmL2RlbGF5LWNhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFHbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEVBQ2hELE1BQU0sR0FBRyxJQUFJLEVBQ2IsWUFBWSxHQUFHLHFCQUFxQixFQUNwQyxhQUFhLEdBQUcscUJBQXFCLEVBQ3JDLFlBQVksR0FBRyxzQkFBc0IsR0FDWixFQUFFLEVBQUUsQ0FBQyxVQUFTLE9BQWU7SUFDdEQsSUFBSSxhQUFhLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXBFLElBQUksTUFBTSxFQUFFO1FBQ1YsYUFBYSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDdkQ7SUFFRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBhbGxvd2VkIG9wdGlvbnMgb2JqZWN0IGZvciBgZXhwb25lbnRpYWxCYWNrb2ZmRGVsYXlDYWxjdWxhdG9yYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbGF5Q2FsY3VsYXRvciB7XG4gIGppdHRlcjogYm9vbGVhbjtcbiAgaml0dGVyRmFjdG9yOiBudW1iZXI7XG4gIGJhY2tPZmZGYWN0b3I6IG51bWJlcjtcbiAgYmFzZVdhaXRUaW1lOiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRfSklUVEVSX0ZBQ1RPUiA9IC4zO1xuY29uc3QgREVGQVVMVF9CQUNLX09GRl9USU1FID0gMjtcbmNvbnN0IERFRkFVTFRfQkFTRV9XQUlUX1RJTUUgPSAxMDA7XG5cblxuLyoqXG4gKiBDYWxjdWxhdGUgcmV0cnkgdGltaW5nXG4gKlxuICogYGppdHRlcmA6IFwiU2xpZ2h0IGlycmVndWxhciBtb3ZlbWVudCwgdmFyaWF0aW9uLCBvciB1bnN0ZWFkaW5lc3MsXG4gKiBlc3BlY2lhbGx5IGluIGFuIGVsZWN0cmljYWwgc2lnbmFsIG9yIGVsZWN0cm9uaWMgZGV2aWNlXCJcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdFxuICogICAtIGBqaXR0ZXJgOiBJZiB0aGUgZHVyYXRpb24gc2hvdWxkIGJlIGFmZmVjdGVkIGJ5IGEgaml0dGVyIGVmZmVjdFxuICogICAtIGBqaXR0ZXJGYWN0b3JgOiBIb3cgd2lkZWx5IHRoZSBqaXR0ZXIgZWZmZWN0IHNob3VsZCB2YXJ5XG4gKiAgIC0gYGJhY2tPZmZGYWN0b3JgOiBIb3cgcXVpY2tseSB0aGUgZHVyYXRpb24gc2hvdWxkIGJhY2sgb2ZmXG4gKiAgIC0gYGJhc2VXYWl0VGltZWA6IFRoZSBiYXNlIHRpbWUgd2hlbiBkZXRlcm1pbmluZyBzbGVlcCBkdXJhdGlvblxuICogQHJldHVybnMgVGhlIGR1cmF0aW9uIHRvIHNsZWVwXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNhbGNPcHRzOiBEZWxheUNhbGN1bGF0b3IgPSB7XG4gKiAgIGppdHRlcjogdHJ1ZSxcbiAqICAgaml0dGVyRmFjdG9yOiAuMyxcbiAqICAgYmFja09mZkZhY3RvcjogMixcbiAqICAgYmFzZVdhaXRUaW1lOiAxMDAsXG4gKiB9XG4gKiAvLyBDcmVhdGUgYSByZXRyaWVyIHdpdGggYSBjdXN0b20gYmFja29mZlxuICogcmV0cnlXaXRoQmFja29mZih7cmV0cmllczogMywgZGVsYXlDYWxjdWxhdG9yOiBleHBvbmVudGlhbEJhY2tvZmZEZWxheUNhbGN1bGF0b3IoY2FsY09wdHMpfSlcbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9uZW50aWFsQmFja29mZkRlbGF5Q2FsY3VsYXRvciA9ICh7XG4gIGppdHRlciA9IHRydWUsXG4gIGppdHRlckZhY3RvciA9IERFRkFVTFRfSklUVEVSX0ZBQ1RPUixcbiAgYmFja09mZkZhY3RvciA9IERFRkFVTFRfQkFDS19PRkZfVElNRSxcbiAgYmFzZVdhaXRUaW1lID0gREVGQVVMVF9CQVNFX1dBSVRfVElNRSxcbn06IFBhcnRpYWw8RGVsYXlDYWxjdWxhdG9yPikgPT4gZnVuY3Rpb24oYXR0ZW1wdDogbnVtYmVyKSB7XG4gIGxldCBzbGVlcER1cmF0aW9uID0gYmFzZVdhaXRUaW1lICogTWF0aC5wb3coYmFja09mZkZhY3RvciwgYXR0ZW1wdCk7XG5cbiAgaWYgKGppdHRlcikge1xuICAgIHNsZWVwRHVyYXRpb24gKj0gKDEgLSAoaml0dGVyRmFjdG9yICogTWF0aC5yYW5kb20oKSkpO1xuICB9XG5cbiAgcmV0dXJuIHNsZWVwRHVyYXRpb247XG59O1xuIl19