@eang/core
Version:
eang - model driven enterprise event processing
84 lines • 3.56 kB
JavaScript
import { EntityUpdateContext } from '../eang-core.js';
import { Cnx, EangEventType } from './entity.js';
import { createObj } from './objects.js';
import { unescapeSubjectToken } from './NatsStreamingService.js';
export function parseMsg(msg) {
// const headers = msg.headers
const subject = msg.subject;
// TODO: handle content-type... default is JSON and does not require header
// const hdrs = headers()
// hdrs.append('Content-Type', opts.contentType || 'application/json')
const { obj, cnx, context } = JSON.parse(Buffer.from(msg.data).toString());
if (!obj && !cnx) {
throw new Error('Invalid message format: missing obj or cnx');
}
if (obj && cnx) {
throw new Error('Invalid message format: both obj and cnx are present');
}
const subjectData = parseSubjectData(subject);
// Validate eventType
const validEventTypes = Object.values(EangEventType);
if (!validEventTypes.includes(subjectData.eventType)) {
throw new Error(`Invalid eventType: ${subjectData.eventType}`);
}
const entity = obj ? createObj(obj) : new Cnx(cnx);
const eventType = subjectData.eventType;
let contextObj = context;
if (eventType === EangEventType.update) {
contextObj = new EntityUpdateContext(context);
}
const { tenant, organizationalUnit, user } = subjectData;
return {
msg,
subjectData,
entity,
eventType,
context: contextObj,
tenant,
organizationalUnit,
user
};
}
export function parseSubjectData(subject) {
const parts = subject.split('.');
if (parts[1] === 'obj') {
// Validate minimum parts for obj type (need at least 10 parts: eang.obj.tenant.ou.user.type.instance.childOf.key.event)
if (parts.length < 10) {
throw new Error(`Invalid obj subject format: ${subject}. Expected at least 10 parts, got ${parts.length}`);
}
return {
entityType: parts[1], // obj
tenant: unescapeSubjectToken(parts[2]),
organizationalUnit: unescapeSubjectToken(parts[3]),
user: unescapeSubjectToken(parts[4]),
typeOf: unescapeSubjectToken(parts[5]),
instanceOf: unescapeSubjectToken(parts[6]),
childOf: unescapeSubjectToken(parts[7]),
key: unescapeSubjectToken(parts[8]),
eventType: unescapeSubjectToken(parts[9])
};
} //if (parts[1] === 'cnx') {
else {
// Validate minimum parts for cnx type (need at least 15 parts)
if (parts.length < 15) {
throw new Error(`Invalid cnx subject format: ${subject}. Expected at least 15 parts, got ${parts.length}`);
}
return {
entityType: 'cnx',
tenant: unescapeSubjectToken(parts[2]),
organizationalUnit: unescapeSubjectToken(parts[3]),
user: unescapeSubjectToken(parts[4]),
typeOf: unescapeSubjectToken(parts[5]),
instanceOf: unescapeSubjectToken(parts[6]),
key: unescapeSubjectToken(parts[7]),
eventType: unescapeSubjectToken(parts[8]),
fromObjTypeOf: unescapeSubjectToken(parts[9]),
fromObjInstanceOf: unescapeSubjectToken(parts[10]),
fromObjKey: unescapeSubjectToken(parts[11]),
toObjTypeOf: unescapeSubjectToken(parts[12]),
toObjInstanceOf: unescapeSubjectToken(parts[13]),
toObjKey: unescapeSubjectToken(parts[14])
};
}
}
//# sourceMappingURL=functions.js.map