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(); }