UNPKG

@deliverr/serverless-offline-step-functions

Version:

Serverless Offline Plugin to Support Step Functions for Local Development

59 lines (58 loc) 2.12 kB
"use strict"; 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;