@5minds/processcube_engine
Version:
The ProcessCube Engine. Stores and executes BPMNs.
99 lines • 6.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.initialize = initialize;
exports.registerEventMiddleware = registerEventMiddleware;
exports.registerMessageEventMiddleware = registerMessageEventMiddleware;
exports.registerSignalEventMiddleware = registerSignalEventMiddleware;
exports.removeEventMiddleware = removeEventMiddleware;
const processcube_engine_sdk_1 = require("@5minds/processcube_engine_sdk");
const index_1 = require("../../Contracts/InternalDataModels/index");
let container;
const logger = new processcube_engine_sdk_1.Logger('engine:event_middleware_handler');
function initialize(iocContainer) {
container = iocContainer;
}
function registerEventMiddleware(callback) {
logger.debug(`Registering new Event Middleware Handler`);
container.bind(index_1.middlewareEventTag).toConstantValue(callback);
}
/**
* Registers the given callback as an Event Middleware for BPMN Message Events.
*
* @param messageName Optional: The name of the message to listen for.
* If set, the callback will only be executed when messages with the given name are received.
* @param callback The callback to execute, when a MessageEvent was received.
* @param eventType Optional: The EventType to listen for.
* Either 'OnFlowNodeEntered', 'OnFlowNodeExited' or 'OnMessageTriggered' (default).
* The callback will only be executed when events with the given EventType are received.
*/
function registerMessageEventMiddleware(...args) {
logger.debug(`Registering new Message Event middleware handler with args: ${JSON.stringify(args)}`);
const eventTypeIsSet = args[args.length - 1] === processcube_engine_sdk_1.EngineEventType.OnFlowNodeEntered ||
args[args.length - 1] === processcube_engine_sdk_1.EngineEventType.OnFlowNodeExited ||
args[args.length - 1] === processcube_engine_sdk_1.EngineEventType.OnMessageTriggered;
const eventType = eventTypeIsSet ? args[args.length - 1] : processcube_engine_sdk_1.EngineEventType.OnMessageTriggered;
const callback = eventTypeIsSet ? args[args.length - 2] : args[args.length - 1];
const messageName = (eventTypeIsSet && args.length === 3) || (!eventTypeIsSet && args.length === 2) ? args[0] : undefined;
registerEventMiddleware(async (event) => {
const isThrowingEvent = event.flowNodeType === processcube_engine_sdk_1.BpmnType.intermediateThrowEvent || event.flowNodeType === processcube_engine_sdk_1.BpmnType.endEvent;
const isMessageEvent = event.currentFlowNode?.messageName?.length > 0;
const isExpectedEventType = event.eventType === eventType;
const isNotExpectedOnMessageFlowNodeEvent = !isThrowingEvent || !isMessageEvent || !isExpectedEventType;
if (isNotExpectedOnMessageFlowNodeEvent) {
return;
}
const messageNameMatchesSubscription = !messageName || messageName === event.currentFlowNode.messageName;
if (messageNameMatchesSubscription) {
callback(event);
}
});
}
/**
* Registers the given callback as an Event Middleware for BPMN Signal Events.
*
* @param signalName Optional: The name of the signal to listen for.
* If set, the callback will only be executed when signals with the given name are received.
* @param callback The callback to execute, when a SignalEvent was received.
* @param eventType Optional: The EventType to listen for.
* Either 'OnFlowNodeEntered', 'OnFlowNodeExited' or 'OnSignalTriggered' (default).
* The callback will only be executed when events with the given EventType are received.
*/
function registerSignalEventMiddleware(...args) {
logger.debug(`Registering new Signal Event middleware handler with args: ${JSON.stringify(args)}`);
const eventTypeIsSet = args[args.length - 1] === processcube_engine_sdk_1.EngineEventType.OnFlowNodeEntered ||
args[args.length - 1] === processcube_engine_sdk_1.EngineEventType.OnFlowNodeExited ||
args[args.length - 1] === processcube_engine_sdk_1.EngineEventType.OnSignalTriggered;
const eventType = eventTypeIsSet ? args[args.length - 1] : processcube_engine_sdk_1.EngineEventType.OnSignalTriggered;
const callback = eventTypeIsSet ? args[args.length - 2] : args[args.length - 1];
const signalName = (eventTypeIsSet && args.length === 3) || (!eventTypeIsSet && args.length === 2) ? args[0] : undefined;
registerEventMiddleware(async (event) => {
const isThrowingEvent = event.flowNodeType === processcube_engine_sdk_1.BpmnType.intermediateThrowEvent || event.flowNodeType === processcube_engine_sdk_1.BpmnType.endEvent;
const isSignalEvent = event.currentFlowNode?.signalName?.length > 0;
const isExpectedEventType = event.eventType === eventType;
const isNotExpectedOnSignalFlowNodeEvent = !isThrowingEvent || !isSignalEvent || !isExpectedEventType;
if (isNotExpectedOnSignalFlowNodeEvent) {
return;
}
const signalNameMatchesSubscription = !signalName || signalName === event.currentFlowNode.signalName;
if (signalNameMatchesSubscription) {
callback(event);
}
});
}
async function removeEventMiddleware(callbackToRemove) {
logger.debug(`Removing event middleware handler...`);
const registeredMiddlewares = container.getAll(index_1.middlewareEventTag);
const middlewareNotFound = !registeredMiddlewares.some((middleware) => middleware === callbackToRemove);
if (middlewareNotFound) {
logger.debug(`Middleware to remove was not found.`);
return;
}
logger.debug(`Number of middlewares before remove: ${registeredMiddlewares.length}`);
const middlewaresToKeep = registeredMiddlewares.filter((middleware) => middleware !== callbackToRemove);
await container.unbind(index_1.middlewareEventTag);
logger.debug(`Number of middlewares after remove: ${middlewaresToKeep.length}`);
for (const middleware of middlewaresToKeep) {
container.bind(index_1.middlewareEventTag).toConstantValue(middleware);
}
}
//# sourceMappingURL=EventMiddlewares.js.map