UNPKG

@eang/core

Version:

eang - model driven enterprise event processing

84 lines 3.56 kB
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