UNPKG

process-reporting-ts

Version:
112 lines (111 loc) 5.99 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.fireEvent = exports.publishEvent = exports.activityInterceptor = exports.descriptorFunction = void 0; const pure_function_decorator_1 = require("pure-function-decorator"); const axios_1 = __importDefault(require("axios")); const uuid_1 = require("uuid"); const models_1 = require("./models"); const util_1 = require("./util"); const activities = {}; const descriptorFunction = (origFunction, bpmnElementOptions) => { /** * NOTE: It's very important here we do not use arrow function otherwise 'this' will be messed up due * to the nature how arrow function defines this inside. */ return (function (...args) { return __awaiter(this, void 0, void 0, function* () { const params = (0, util_1.getParameters)(origFunction); const payload = (0, util_1.getPayload)(params, args); const transactionId = (0, util_1.parseExpression)(bpmnElementOptions.instanceIdExpression, payload); const referenceId = (0, util_1.parseExpression)(bpmnElementOptions.keyExpression, payload); const multipleInstanceIndex = (0, util_1.parseExpression)(bpmnElementOptions.multipleInstance, payload); const startedBy = (0, util_1.parseExpression)(bpmnElementOptions.startedByExpression, payload); const retryCount = 0; const reportEvent = { payload: (0, util_1.serializePayload)(payload, bpmnElementOptions.maskParams), referenceId: referenceId, status: models_1.ReportStatus.STARTED, transactionId: transactionId, multipleInstanceIndex: (multipleInstanceIndex || 0) + '.' + (retryCount || 0), startedBy }; publishEvent(reportEvent, bpmnElementOptions); try { const response = yield origFunction.apply(null, args); publishEvent(Object.assign(Object.assign({}, reportEvent), { status: models_1.ReportStatus.COMPLETED, payload: (0, util_1.serializePayload)(response, bpmnElementOptions.maskParams) }), bpmnElementOptions); return response; } catch (e) { publishEvent(Object.assign(Object.assign({}, reportEvent), { status: models_1.ReportStatus.ERROR, errorMessage: e + '', payload: undefined }), bpmnElementOptions); throw e; } }); }); }; exports.descriptorFunction = descriptorFunction; const activityInterceptor = (target, propertyKey, descriptor) => { const origFunction = descriptor.value; const bpmnElementOptions = activities[origFunction.name]; descriptor.value = (0, exports.descriptorFunction)(origFunction, bpmnElementOptions); return descriptor; }; exports.activityInterceptor = activityInterceptor; function publishEvent(reportEvent, bpmnElementOptions) { reportEvent.elementId = bpmnElementOptions.id; if (bpmnElementOptions.processId) { reportEvent.processId = bpmnElementOptions.processId; } reportEvent.startEvent = bpmnElementOptions.startEvent === true; reportEvent.endEvent = bpmnElementOptions.endEvent === true; reportEvent.executionId = (0, uuid_1.v4)(); if (reportEvent.startEvent) { reportEvent.referenceType = process.env.REPORTING_EVENT_CATEGORY; } else if (reportEvent.endEvent && reportEvent.status === models_1.ReportStatus.COMPLETED) { reportEvent.status = models_1.ReportStatus.PROCESS_COMPLETED; } const { transactionId } = reportEvent; const [parentTransactionId] = transactionId.split(':'); reportEvent.transactionId = parentTransactionId; (0, exports.fireEvent)(reportEvent); } exports.publishEvent = publishEvent; const fireEvent = (event) => { const url = process.env.REPORTING_SERVER + '/reporting-service/rest/api/report'; if (!event.processId) { event.processId = process.env.REPORTING_PROCESS_ID; } event.eventTime = new Date(); event.processVersion = process.env.REPORTING_PROCESS_VERSION; event.startedBy = event.startedBy || 'system'; axios_1.default.post(url, event) .catch(it => console.log('Unable to post Process [' + event.processId + '] event [' + event.elementId + ']!')); }; exports.fireEvent = fireEvent; exports.default = (activityHandler, options) => { activities[activityHandler.name] = options || { id: activityHandler.name }; // override id from function name activities[activityHandler.name].id = activities[activityHandler.name].id || activityHandler.name; activities[activityHandler.name].instanceIdExpression = activities[activityHandler.name].instanceIdExpression || '{{ context.triggerMetadata.instanceId }}'; activities[activityHandler.name].startedByExpression = activities[activityHandler.name].startedByExpression || '{{ context.triggerMetadata.startedBy }}'; return (0, pure_function_decorator_1.fnDecorator)(exports.activityInterceptor, activityHandler); };