@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
JavaScript
;
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;