41 lines
1.1 KiB
JavaScript
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();
|
|
}
|