@grubou/bussy
Version:
Command & query bus implementations
46 lines (38 loc) • 1.6 kB
text/typescript
import { DomainEvent } from './types/DomainEvent';
import { EventBus, EventHandlers } from './types/EventBus';
import { EventBusMiddleware } from './middlewares/EventBusMiddleware';
import { BusLogger } from '../common/BusLogger';
import { EventHandler } from './types/EventHandler';
export class InternalEventBus implements EventBus {
constructor(
private logger: BusLogger,
private eventMiddlewares: EventBusMiddleware[],
private eventHandlers: EventHandlers
) {}
publish(events: ReadonlyArray<DomainEvent>): void {
events.reduce((domainEvents, event) => {
const correspondingEventHandlers = this.eventHandlers[event.label()];
this.eventMiddlewares.forEach((middleware) => middleware.handle(event));
Promise.allSettled(
correspondingEventHandlers.map((eventHandler) => {
eventHandler
.reactTo(event)
.then(() => this.logOnSuccess(event, eventHandler))
.catch((error) => this.logOnError(event, eventHandler, error));
})
);
return domainEvents.slice(events.indexOf(event));
}, events);
}
private logOnSuccess(event: DomainEvent, eventHandler: EventHandler<DomainEvent>) {
this.logger.info(`Event: ${event.label()} successfully processed by ${eventHandler.name()}`, {
event: event.serialize()
});
}
private logOnError(event: DomainEvent, eventHandler: EventHandler<DomainEvent>, error: Error) {
this.logger.error(`Event: ${event.label()} unsuccessfully processed by ${eventHandler.name()}`, {
error,
event: event.serialize()
});
}
}