@logistically/events-nestjs
Version:
NestJS integration for @logistically/events v3 - Event-driven architecture with Redis Streams
173 lines (172 loc) • 5.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventUtils = void 0;
const events_1 = require("@logistically/events");
const event_types_1 = require("@logistically/events/dist/event-types");
class EventUtils {
/**
* Creates a new NestJS event with the given type and data
*/
static createEvent(eventType, data, origin, metadata = {}, originPrefix) {
const envelope = (0, events_1.createEventEnvelope)(eventType, origin, data, originPrefix);
return {
...envelope,
nestjsMetadata: {
correlationId: metadata.correlationId,
causationId: metadata.causationId,
...metadata,
},
};
}
/**
* Generates a unique event ID
*/
static generateEventId() {
return (0, event_types_1.generateEventId)();
}
/**
* Generates a hash for event data
*/
static generateEventHash(data) {
return (0, event_types_1.generateEventHash)(data);
}
/**
* Generates a correlation ID for tracking related events
*/
static generateCorrelationId() {
return `corr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
}
/**
* Creates a causation ID from a correlation ID
*/
static createCausationId(correlationId) {
return `caus-${correlationId}`;
}
/**
* Validates if an event object is properly formatted
*/
static validateEvent(event) {
const isValid = (event &&
typeof event === 'object' &&
event.header &&
typeof event.header === 'object' &&
typeof event.header.id === 'string' &&
typeof event.header.type === 'string' &&
typeof event.header.origin === 'string' &&
typeof event.header.timestamp === 'string' &&
event.body !== undefined);
return Boolean(isValid);
}
/**
* Clones an event with new metadata
*/
static cloneEvent(event, newMetadata = {}) {
const newEnvelope = (0, events_1.createEventEnvelope)(event.header.type, event.header.origin, event.body, event.header.originPrefix);
return {
...newEnvelope,
nestjsMetadata: {
...event.nestjsMetadata,
...newMetadata,
},
};
}
/**
* Creates a batch of events with shared correlation ID
*/
static createEventBatch(events, origin, correlationId, originPrefix) {
const sharedCorrelationId = correlationId || this.generateCorrelationId();
return events.map((eventData, index) => {
const causationId = index === 0
? sharedCorrelationId
: this.createCausationId(sharedCorrelationId);
return this.createEvent(eventData.type, eventData.data, origin, {
...eventData.metadata,
correlationId: sharedCorrelationId,
causationId,
}, originPrefix);
});
}
/**
* Extracts correlation ID from event metadata
*/
static getCorrelationId(event) {
return event.nestjsMetadata?.correlationId;
}
/**
* Extracts causation ID from event metadata
*/
static getCausationId(event) {
return event.nestjsMetadata?.causationId;
}
/**
* Checks if two events are related (same correlation ID)
*/
static areEventsRelated(event1, event2) {
const corrId1 = this.getCorrelationId(event1);
const corrId2 = this.getCorrelationId(event2);
return corrId1 !== undefined && corrId1 === corrId2;
}
/**
* Creates a domain event with aggregate information
*/
static createDomainEvent(eventType, data, origin, aggregateId, version, metadata = {}, originPrefix) {
return this.createEvent(eventType, data, origin, {
...metadata,
aggregateId,
version,
}, originPrefix);
}
/**
* Serializes an event for storage or transmission
*/
static serializeEvent(event) {
return JSON.stringify(event, (key, value) => {
if (value instanceof Date) {
return value.toISOString();
}
return value;
});
}
/**
* Deserializes an event from storage or transmission
*/
static deserializeEvent(serialized) {
const parsed = JSON.parse(serialized);
// Convert timestamp back to string if it was converted to Date
if (parsed.header?.timestamp instanceof Date) {
parsed.header.timestamp = parsed.header.timestamp.toISOString();
}
return parsed;
}
/**
* Creates a request event for HTTP requests
*/
static createRequestEvent(method, path, correlationId, causationId, origin = 'nestjs', metadata = {}) {
return this.createEvent('http.request', {
method,
path,
timestamp: new Date().toISOString(),
}, origin, {
correlationId,
causationId,
...metadata,
});
}
/**
* Creates a response event for HTTP responses
*/
static createResponseEvent(method, path, statusCode, duration, correlationId, causationId, origin = 'nestjs', metadata = {}) {
return this.createEvent('http.response', {
method,
path,
statusCode,
duration,
timestamp: new Date().toISOString(),
}, origin, {
correlationId,
causationId,
...metadata,
});
}
}
exports.EventUtils = EventUtils;