UNPKG

@node-ts/bus-workflow

Version:

A workflow engine for orchestrating logic flows in distributed applications.

65 lines 3.35 kB
"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