@xapp/dynamo-service
Version:
A dynamo help class which will help maintain data integrity.
64 lines (63 loc) • 2.27 kB
JavaScript
;
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;
}