@villedemontreal/workit-core
Version:
This package provides default and no-op implementations of the WorkIt types for client packages.
119 lines • 5.88 kB
JavaScript
;
/*
* Copyright (c) 2025 Ville de Montreal. All rights reserved.
* Licensed under the MIT license.
* See LICENSE file in the project root for full license information.
*/
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); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SCProcessHandler = void 0;
const api_1 = require("@opentelemetry/api");
const events_1 = require("events");
const inversify_1 = require("inversify");
require("reflect-metadata");
const core_1 = require("@opentelemetry/core");
const identifiers_1 = require("../config/constants/identifiers");
const container_1 = require("../config/container");
const interceptors_1 = require("../interceptors");
// eslint-disable-next-line import/order
const debug_1 = require("debug");
const log = (0, debug_1.default)('workit:processHandler');
let SCProcessHandler = class SCProcessHandler extends events_1.EventEmitter {
constructor(successStrategy, failureStrategy, tracer, config) {
super();
/**
* Camunda Process Handler
* T = message.body type
* K = message.properties.customHeaders type
*/
this.handle = async (message, service) => {
log('handling message');
return this._otHandle(message, service);
};
this._otHandle = (message, service) => {
log('handling message with tracing');
const { properties } = message;
const identifier = properties.activityId;
const spanOptions = {
kind: api_1.SpanKind.SERVER,
attributes: {
'wf.activityId': identifier,
'wf.processInstanceId': properties.processInstanceId,
'wf.workflowInstanceKey': properties.workflowInstanceKey,
'wf.retries': properties.retries || 0,
'wf.topicName': properties.topicName,
'worker.id': properties.workerId,
},
};
const ctx = this._propagation.extractFromMessage(message) || api_1.context.active();
const span = this._tracer.startSpan(identifier, spanOptions, ctx);
const rpcMetadata = {
type: core_1.RPCType.HTTP,
span,
};
const requestContext = (0, core_1.setRPCMetadata)(api_1.trace.setSpan(ctx, span), rpcMetadata);
return api_1.context.with(requestContext, () => {
api_1.context.bind(api_1.context.active(), this);
if (properties.businessKey) {
span.setAttribute('wf.businessKey', properties.businessKey);
}
return this._handler(message, service, () => span.end());
});
};
this._handler = async (message, service, callback) => {
let msg = message;
const { properties } = message;
try {
this.emit('message', msg);
const workflowCriteria = {
bpmnProcessId: properties.bpmnProcessId,
version: properties.workflowDefinitionVersion,
};
const task = container_1.IoC.getTask(properties.activityId, workflowCriteria);
msg = await interceptors_1.Interceptors.execute(this._config.interceptors, message);
msg = await task.execute(msg);
await this._success.handle(msg, service);
this.emit('message-handled', null, msg);
}
catch (e) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
log(typeof e === 'object' ? e.message : e);
await this._failure.handle(e, message, service);
this.emit('message-handled', e, message);
}
finally {
if (callback) {
callback();
}
}
};
this._tracer = tracer;
this._config = config || {};
this._propagation = this._config.propagation || container_1.IoC.get(identifiers_1.SERVICE_IDENTIFIER.tracer_propagator);
this._success = successStrategy;
this._failure = failureStrategy;
}
};
SCProcessHandler = __decorate([
(0, inversify_1.injectable)(),
__param(0, (0, inversify_1.inject)(identifiers_1.SERVICE_IDENTIFIER.success_strategy)),
__param(1, (0, inversify_1.inject)(identifiers_1.SERVICE_IDENTIFIER.failure_strategy)),
__param(2, (0, inversify_1.inject)(identifiers_1.SERVICE_IDENTIFIER.tracer)),
__param(3, (0, inversify_1.inject)(identifiers_1.SERVICE_IDENTIFIER.process_handler_config)),
__param(3, (0, inversify_1.optional)()),
__metadata("design:paramtypes", [Object, Object, Object, Object])
], SCProcessHandler);
exports.SCProcessHandler = SCProcessHandler;
container_1.kernel.bind(identifiers_1.SERVICE_IDENTIFIER.process_handler).to(SCProcessHandler);
//# sourceMappingURL=simpleCamundaProcessHandler.js.map