@5minds/processcube_engine
Version:
The ProcessCube Engine. Stores and executes BPMNs.
259 lines • 14.4 kB
JavaScript
;
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