@node-ts/bus-workflow
Version:
A workflow engine for orchestrating logic flows in distributed applications.
65 lines • 3.35 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WorkflowHandlerProxy = void 0;
const workflow_data_1 = require("../workflow-data");
const handler_with_id_1 = require("./handler-with-id");
class WorkflowHandlerProxy {
constructor(handler, workflowDataConstructor, persistence, logger) {
this.handler = handler;
this.workflowDataConstructor = workflowDataConstructor;
this.persistence = persistence;
this.logger = logger;
this[handler_with_id_1.handlerIdProperty] =
`${new workflowDataConstructor().$name}.${normalizeHandlerName(handler.name)}`;
}
async handle(message, messageOptions) {
this.logger.debug('Getting workflow data for message', { message, messageOptions });
/*
Ensure that the workflow data fields are immutable by consumers to ensure modifications are done
via return values
*/
const workflowDataItems = await this.getWorkflowData(message, messageOptions);
this.logger.debug('Workflow data retrieved', { workflowData: workflowDataItems, message });
if (!workflowDataItems.length) {
this.logger.debug('No existing workflow data found for message. Ignoring.', { message });
return;
}
const handlerPromises = workflowDataItems.map(async (workflowData) => {
const immutableWorkflowData = Object.freeze(Object.assign({}, workflowData));
const workflowDataOutput = await this.handler(message, immutableWorkflowData, messageOptions);
if (workflowDataOutput && workflowDataOutput.$status === workflow_data_1.WorkflowStatus.Discard) {
this.logger.debug('Workflow step is discarding state changes. State changes will not be persisted', { workflowId: immutableWorkflowData.$workflowId, workflowName: this.workflowDataConstructor.name });
}
else if (workflowDataOutput) {
this.logger.debug('Changes detected in workflow data and will be persisted.', { workflowId: immutableWorkflowData.$workflowId, workflowName: this.workflowDataConstructor.name });
const updatedWorkflowData = Object.assign(new this.workflowDataConstructor(), workflowData, workflowDataOutput);
try {
await this.persist(updatedWorkflowData);
}
catch (error) {
this.logger.warn('Error persisting workflow data', { err: error, workflow: this.workflowDataConstructor.name });
throw error;
}
}
else {
this.logger.trace('No changes detected in workflow data.', { workflowId: immutableWorkflowData.$workflowId });
}
});
await Promise.all(handlerPromises);
}
async persist(data) {
try {
await this.persistence.saveWorkflowData(data);
this.logger.trace('Saving workflow data', { data });
}
catch (err) {
this.logger.error('Error persisting workflow data', { err });
throw err;
}
}
}
exports.WorkflowHandlerProxy = WorkflowHandlerProxy;
function normalizeHandlerName(handlerName) {
return handlerName.replace(/bound\s/g, '');
}
//# sourceMappingURL=workflow-handler-proxy.js.map