UNPKG

@xapp/dynamo-service

Version:

A dynamo help class which will help maintain data integrity.

64 lines (63 loc) 2.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.exponentialTime = exports.linearTime = exports.backOff = exports.backOffFunc = exports.backoffObj = exports.DEFAULT_BACKOFF_COEFFICIENT = exports.DEFAULT_FAILOVER_TIME = exports.DEFAULT_RETRY_ATTEMPTS = void 0; const Sleep_1 = require("./Sleep"); exports.DEFAULT_RETRY_ATTEMPTS = 5; exports.DEFAULT_FAILOVER_TIME = 50; exports.DEFAULT_BACKOFF_COEFFICIENT = 2; function backoffObj(obj) { for (let key in obj) { const item = obj[key]; if (typeof item === "function") { obj[key] = backOffFunc(item); } } } exports.backoffObj = backoffObj; function backOffFunc(func, props) { return (...args) => { return backOff(props, func, ...args); }; } exports.backOffFunc = backOffFunc; function backOff(props = {}, run, ...args) { const realProps = Object.assign({ shouldRetry: alwaysTrue, retryAttempts: exports.DEFAULT_RETRY_ATTEMPTS, failOffStrategy: exponentialTime() }, props); const { retryAttempts, shouldRetry, failOffStrategy } = realProps; const attempt = (attempts = 0) => { let promise; try { promise = Promise.resolve(run(...args, attempts)); } catch (e) { promise = Promise.reject(e); } return promise .catch((e) => { if (attempts < retryAttempts && shouldRetry(e)) { const sleepTime = failOffStrategy(attempts); return (0, Sleep_1.sleep)(sleepTime) .then(() => attempt(++attempts)); } else { return Promise.reject(e); } }); }; return attempt(1); } exports.backOff = backOff; function linearTime(failOverIncrements = exports.DEFAULT_FAILOVER_TIME) { return (attempts) => { return attempts * failOverIncrements; }; } exports.linearTime = linearTime; function exponentialTime(failOverIncrements = exports.DEFAULT_FAILOVER_TIME, backoffCoefficient = exports.DEFAULT_BACKOFF_COEFFICIENT) { return (attempts) => { return failOverIncrements * Math.pow(backoffCoefficient, attempts); }; } exports.exponentialTime = exponentialTime; function alwaysTrue(e) { return true; }