process-reporting-ts
Version:
Process reporting with typescript
112 lines (111 loc) • 5.99 kB
JavaScript
;
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);
};