UNPKG

@5minds/processcube_engine

Version:

The ProcessCube Engine. Stores and executes BPMNs.

259 lines • 14.4 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventMiddlewareHandler = void 0; const inversify_1 = require("inversify"); const processcube_engine_sdk_1 = require("@5minds/processcube_engine_sdk"); const Contracts_1 = require("../Contracts"); const index_1 = require("../Contracts/InternalDataModels/index"); const index_2 = require("../Contracts/InternalMessages/index"); const Core_1 = require("../Core"); const EventAggregator_1 = __importDefault(require("./EventAggregator")); let EventMiddlewareHandler = class EventMiddlewareHandler { container; logger; processTokenService; constructor(container, processTokenService) { this.container = container; this.logger = new processcube_engine_sdk_1.Logger('event_middleware_handler'); this.processTokenService = processTokenService; } async triggerEvent(engineEvent, runtimeExpressionParameters) { const logMessageWithLevel = this.getLogMessageForEvent(engineEvent); let finalMessageToLog = logMessageWithLevel.message; if (engineEvent.eventId) { finalMessageToLog = `EventID: ${engineEvent.eventId}: ${finalMessageToLog}`; } this.logger.logForLevel(finalMessageToLog, logMessageWithLevel.level, { eventId: engineEvent.eventId, eventType: engineEvent.eventType, processModelId: engineEvent.processModelId, embeddedProcessModelId: engineEvent.embeddedProcessModelId, processModelName: engineEvent.processModelName, flowNodeId: engineEvent.flowNodeId, flowNodeName: engineEvent.flowNodeName, flowNodeLane: engineEvent.flowNodeLane, flowNodeInstanceId: engineEvent.flowNodeInstanceId, flowNodeType: engineEvent.flowNodeType, processInstanceId: engineEvent.processInstanceId, parentProcessInstanceId: engineEvent.parentProcessInstanceId, correlationId: engineEvent.correlationId, }); const context = this.getContextForEventType(engineEvent, runtimeExpressionParameters); await this.postEventToMiddlewares(engineEvent, context); } async postEventToMiddlewares(engineEvent, context) { const middlewares = this.getEventMiddlewares(); this.logger.debug(`Posting "${engineEvent.eventType}" from "${engineEvent.flowNodeId ?? engineEvent.processModelId}" to ${middlewares.length} registered event middlewares`); for (const middleware of middlewares) { const middlewareResult = await middleware(engineEvent, context); if (!middlewareResult) { continue; } const actions = Array.isArray(middlewareResult) ? middlewareResult : [middlewareResult]; if (actions.length === 0) { continue; } for (const action of actions) { if (action?.id === 'ModifyTokenPayload') { await this.handleModifyTokenPayloadAction(engineEvent, action); } } } this.logger.debug(`Finished Posting "${engineEvent.eventType}" from "${engineEvent.flowNodeId ?? engineEvent.processModelId}" to ${middlewares.length} registered event middlewares`); } handleModifyTokenPayloadAction(engineEvent, engineAction) { const isFlowNodeRelatedEvent = engineEvent.eventType.startsWith('OnFlowNode'); if (!isFlowNodeRelatedEvent) { this.logger.error('Failure in extension: The ModifyTokenPayload action is only available for FlowNode related events.'); } engineEvent.tokenPayload = engineAction.tokenPayload; const tokenPayloadChangeMessagePath = index_2.eventAggregatorSettings.messagePaths.tokenPayloadChange.replace(index_2.eventAggregatorSettings.messageParams.flowNodeInstanceId, engineEvent.flowNodeInstanceId); const tokenPayloadChangeFinishedMessagePath = index_2.eventAggregatorSettings.messagePaths.tokenPayloadChangeFinished.replace(index_2.eventAggregatorSettings.messageParams.flowNodeInstanceId, engineEvent.flowNodeInstanceId); return new Promise((resolve) => { EventAggregator_1.default.subscribeOnce(tokenPayloadChangeFinishedMessagePath, resolve); EventAggregator_1.default.publish(tokenPayloadChangeMessagePath, { flowNodeInstanceId: engineEvent.flowNodeInstanceId, eventType: engineEvent.eventType, tokenPayload: engineAction.tokenPayload, }); }); } getEventMiddlewares() { try { return this.container.getAll(index_1.middlewareEventTag); } catch { return []; } } getContextForEventType(event, runtimeExpressionParameters) { if (this.isFlowNodeContextEvent(event)) { return { executeRuntimeExpression: this.getExecuteRuntimeExpressionFunction(runtimeExpressionParameters), getParametersForRuntimeExpression: this.getGetParametersForRuntimeExpressionFunction(runtimeExpressionParameters), }; } return undefined; } getExecuteRuntimeExpressionFunction(defaultParameters) { return (expression, runtimeExpressionParameters) => { const mergedParameters = this.processTokenService.mergeRuntimeExpressionParameters(runtimeExpressionParameters, defaultParameters); return this.processTokenService.executeRuntimeExpression(expression, mergedParameters); }; } getGetParametersForRuntimeExpressionFunction(defaultParameters) { return (expression, runtimeExpressionParameters) => { const mergedParameters = this.processTokenService.mergeRuntimeExpressionParameters(runtimeExpressionParameters, defaultParameters); return this.processTokenService.getParametersForRuntimeExpression(expression, mergedParameters); }; } isFlowNodeContextEvent(event) { return [ processcube_engine_sdk_1.EngineEventType.OnFlowNodeEntered, processcube_engine_sdk_1.EngineEventType.OnFlowNodeExited, processcube_engine_sdk_1.EngineEventType.OnFlowNodeError, processcube_engine_sdk_1.EngineEventType.OnFlowNodeCanceled, processcube_engine_sdk_1.EngineEventType.OnFlowNodeResumed, processcube_engine_sdk_1.EngineEventType.OnFlowNodeSuspended, processcube_engine_sdk_1.EngineEventType.OnFlowNodeTerminated, ].includes(event.eventType); } getLogMessageForEvent(event) { switch (event.eventType) { case processcube_engine_sdk_1.EngineEventType.OnEventProcessed: return { message: `Processed event \`${event.eventId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeCallActivityResponseReceived: return { message: `Received response for call activity \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeSubProcessResponseReceived: return { message: `Received response for embedded sub process \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeEntered: return { message: `Entered flow node \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeError: return { message: `Encountered error in flow node \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeExited: return { message: `Exited flow node \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeResumed: return { message: `Resumed flow node \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeSuspended: return { message: `Suspended flow node \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeTerminated: return { message: `Terminated flow node \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeTimerRemoved: return { message: `Removed timer \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnFlowNodeTimerStarted: return { message: `Started timer \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessDeployed: return { message: `Deployed process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessFinished: return { message: `Finished process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessResumed: return { message: `Resumed process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessStarted: return { message: `Started process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessStarting: return { message: `Starting process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessTerminated: return { message: `Terminated process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnProcessUndeployed: return { message: `Undeployed process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.onProcessError: return { message: `Encountered error in process \`${event.processModelId}\`.`, level: processcube_engine_sdk_1.LogLevel.trace, }; case processcube_engine_sdk_1.EngineEventType.OnMessageTriggered: return { message: `Posting Message to event middleware for Process Model \`${event.processModelId}\` in Process Instance ${event.processInstanceId} via Event ID \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.debug, }; case processcube_engine_sdk_1.EngineEventType.OnSignalTriggered: return { message: `Posting Signal to event middleware for Process Model \`${event.processModelId}\` in Process Instance ${event.processInstanceId} via Event ID \`${event.flowNodeId}\`.`, level: processcube_engine_sdk_1.LogLevel.debug, }; default: return { message: `Triggered event.`, level: processcube_engine_sdk_1.LogLevel.trace, }; } } }; exports.EventMiddlewareHandler = EventMiddlewareHandler; exports.EventMiddlewareHandler = EventMiddlewareHandler = __decorate([ (0, inversify_1.injectable)(), __param(0, (0, inversify_1.inject)(Contracts_1.IocRegistrationKeys.internal.Container)), __param(1, (0, inversify_1.inject)(Contracts_1.IocRegistrationKeys.core.services.ProcessTokenService)), __metadata("design:paramtypes", [inversify_1.Container, Core_1.ProcessTokenService]) ], EventMiddlewareHandler); //# sourceMappingURL=EventMiddlewareHandler.js.map