unrip/src/core/event-envelope.mjs

41 lines
1.1 KiB
JavaScript

import crypto from 'node:crypto';
export function buildEventEnvelope({
eventType,
venue,
payload,
source,
eventId = crypto.randomUUID(),
schemaVersion = 1,
observedAt = null,
ingestedAt = new Date(),
raw = null,
}) {
if (!eventType) throw new Error('Missing eventType');
if (!venue) throw new Error('Missing venue');
if (payload == null) throw new Error('Missing payload');
return {
event_id: String(eventId),
event_type: String(eventType),
venue: String(venue),
source: source ? String(source) : null,
schema_version: Number(schemaVersion),
observed_at: toIsoStringOrNull(observedAt),
ingested_at: toIsoStringOrNull(ingestedAt) ?? new Date().toISOString(),
payload,
raw,
};
}
export function parseEventMessage(value) {
const event = typeof value === 'string' ? JSON.parse(value) : value;
if (!event || typeof event !== 'object') throw new Error('Event must be an object');
return event;
}
function toIsoStringOrNull(value) {
if (value == null) return null;
const date = value instanceof Date ? value : new Date(value);
return Number.isNaN(date.getTime()) ? null : date.toISOString();
}