UNPKG

@logistically/events

Version:

A production-ready event-driven architecture library for NestJS with Redis Streams, comprehensive batching, reliable consumption, and enterprise-grade features.

61 lines (60 loc) 1.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DefaultEventValidator = void 0; exports.generateEventId = generateEventId; exports.generateEventHash = generateEventHash; exports.createEventHeader = createEventHeader; exports.createEventEnvelope = createEventEnvelope; const crypto_1 = require("crypto"); // ===== IDEMPOTENCY UTILITIES ===== function generateEventId() { return (0, crypto_1.randomUUID)(); } function generateEventHash(body) { const bodyString = JSON.stringify(body); return (0, crypto_1.createHash)('sha256').update(bodyString).digest('hex'); } function createEventHeader(eventType, origin, body) { return { id: generateEventId(), type: eventType, origin, timestamp: new Date().toISOString(), hash: generateEventHash(body), version: '1.0.0', // TODO: Make this configurable }; } function createEventEnvelope(eventType, origin, body, namespace) { // Apply namespace as prefix for ownership, not restriction const finalEventType = namespace ? `${namespace}.${eventType}` : eventType; return { header: createEventHeader(finalEventType, origin, body), body, }; } class DefaultEventValidator { constructor(schemas) { this.schemas = schemas || {}; } registerSchema(eventType, schema) { this.schemas[eventType] = schema; } getSchema(eventType) { const schema = this.schemas[eventType]; if (!schema) { throw new Error(`No schema registered for event type: ${eventType}`); } return schema; } validate(eventType, body) { try { const schema = this.getSchema(eventType); schema.parse(body); return { valid: true }; } catch (error) { return { valid: false, error: error.message }; } } } exports.DefaultEventValidator = DefaultEventValidator;