@eang/core
Version:
eang - model driven enterprise event processing
89 lines • 3.14 kB
JavaScript
import { Cnx, EangEventType } from './entity.js';
import { createObj } from './objects.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;
const { tenant, organizationalUnit, user } = subjectData;
return {
msg,
subjectData,
entity,
eventType,
context,
tenant,
organizationalUnit,
user
};
}
export function parseSubjectData(subject) {
const parts = subject.split('.');
if (parts[1] === 'obj') {
// Validate minimum parts for obj type (need at least 9 parts: eang.obj.tenant.ou.user.type.instance.key.event)
if (parts.length < 9) {
throw new Error(`Invalid obj subject format: ${subject}. Expected at least 9 parts, got ${parts.length}`);
}
return {
entityType: parts[1], // obj
tenant: parts[2],
organizationalUnit: parts[3],
user: parts[4],
typeOf: parts[5],
instanceOf: parts[6],
key: parts[7],
eventType: parts[8]
};
} //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: parts[2],
organizationalUnit: parts[3],
user: parts[4],
typeOf: parts[5],
instanceOf: parts[6],
key: parts[7],
eventType: parts[8],
fromObjTypeOf: parts[9],
fromObjInstanceOf: parts[10],
fromObjKey: parts[11],
toObjTypeOf: parts[12],
toObjInstanceOf: parts[13],
toObjKey: parts[14]
};
}
}
// export function getEangMsgFromEvents(
// events: EntityEvent[],
// tenant: string,
// organizationalUnit: string,
// user: string,
// options?: Partial<JetStreamPublishOptions>
// ) {
// const messages = events.map((event) => {
// return getEangMsgFromEvent(event, tenant, organizationalUnit, user, options)
// })
// return messages
// }
//# sourceMappingURL=functions.js.map