@rudderstack/workflow-engine
Version:
A generic workflow execution engine
61 lines • 2.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.chainExecutor = exports.DefaultWorkflowExecutor = void 0;
const common_1 = require("../common");
const errors_1 = require("../errors");
class DefaultWorkflowExecutor {
constructor(options) {
this.options = options ?? {};
}
static handleError(error, workflowName, stepName) {
throw new errors_1.WorkflowExecutionError(error.message, errors_1.ErrorUtils.getErrorStatus(error), workflowName, {
stepName,
childStepName: error.childStepName,
error: error.error,
});
}
async execute(engine, input, bindings) {
const context = {};
const executionBindings = {
...engine.getBindings(),
...bindings,
outputs: {},
context,
setContext: (key, value) => {
context[key] = value;
},
originalInput: input,
};
let prevStepOutput;
let currStepInput = input;
const stepExecutors = engine.getStepExecutors();
for (const stepExecutor of stepExecutors) {
const step = stepExecutor.getStep();
try {
// eslint-disable-next-line no-await-in-loop
const { skipped, output } = await stepExecutor.execute(currStepInput, executionBindings);
if (!skipped) {
prevStepOutput = output;
executionBindings.outputs[step.name] = output;
if (this.options.chainOutputs) {
currStepInput = prevStepOutput;
}
if (step.onComplete === common_1.StepExitAction.Return) {
break;
}
}
}
catch (error) {
common_1.logger.error(`step: ${step.name} failed with error:`, error);
if (step.onError !== common_1.StepExitAction.Continue) {
DefaultWorkflowExecutor.handleError(error, engine.getName(), step.name);
}
}
}
return { output: prevStepOutput, outputs: executionBindings.outputs };
}
}
exports.DefaultWorkflowExecutor = DefaultWorkflowExecutor;
DefaultWorkflowExecutor.INSTANCE = new DefaultWorkflowExecutor();
exports.chainExecutor = new DefaultWorkflowExecutor({ chainOutputs: true });
//# sourceMappingURL=default_executor.js.map