@deliverr/serverless-offline-step-functions
Version:
Serverless Offline Plugin to Support Step Functions for Local Development
59 lines (58 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Retriers = void 0;
const Logger_1 = require("../utils/Logger");
const Retrier_1 = require("./Retrier");
const StatesErrors_1 = require("./StatesErrors");
class Retriers {
constructor(_retriers) {
this._retriers = _retriers;
this.logger = Logger_1.Logger.getInstance();
}
static create(taskRetryRules) {
const retriers = taskRetryRules.map((taskRetryRule) => {
return Retrier_1.Retrier.create(taskRetryRule);
});
return new Retriers(retriers);
}
getStatesErrorFrom(error) {
return StatesErrors_1.StatesErrors.TaskFailed;
}
getRetrierBasedOn(error) {
const errorType = this.getStatesErrorFrom(error);
const retrier = this._retriers.find((retrier) => {
return retrier.ErrorEquals.includes(errorType) || retrier.ErrorEquals.includes(StatesErrors_1.StatesErrors.All);
});
if (!retrier) {
return;
}
return retrier;
}
async retry(fn, context) {
try {
const output = await fn();
return output;
}
catch (error) {
const retrier = this.getRetrierBasedOn(error);
if (retrier && retrier.shouldRetry()) {
this.logger.log(`Retrying ${context.StateMachine.Name}-${context.State.Name}, retry #${retrier.currentNumberOfRetries}`);
const interval = retrier.currentIntervalSeconds;
return await new Promise((resolve, reject) => {
setTimeout(async () => {
try {
retrier.retried();
const output = await this.retry(fn, context);
return resolve(output);
}
catch (error) {
return reject(error);
}
}, interval * 1000);
});
}
throw error;
}
}
}
exports.Retriers = Retriers;