From c9b4eefce2cfb0401e19f4a4b8afb9ab55ead117 Mon Sep 17 00:00:00 2001 From: Grzegorz Kielak Date: Tue, 2 Jan 2024 10:33:42 +0100 Subject: [PATCH] feat: allow to overwrite event id strategy --- src/event-bus.ts | 18 +++++++-------- src/helpers/default-event-id-provider.ts | 20 ++++++++++++++++ src/helpers/default-get-event-id.ts | 23 ------------------- .../events/event-id-provider.interface.ts | 10 ++++++++ src/interfaces/index.ts | 1 + 5 files changed, 40 insertions(+), 32 deletions(-) create mode 100644 src/helpers/default-event-id-provider.ts delete mode 100644 src/helpers/default-get-event-id.ts create mode 100644 src/interfaces/events/event-id-provider.interface.ts diff --git a/src/event-bus.ts b/src/event-bus.ts index 2a6c08d2..d721f759 100644 --- a/src/event-bus.ts +++ b/src/event-bus.ts @@ -5,12 +5,10 @@ import { catchError, filter, mergeMap } from 'rxjs/operators'; import { CommandBus } from './command-bus'; import { EVENTS_HANDLER_METADATA, SAGA_METADATA } from './decorators/constants'; import { InvalidSagaException } from './exceptions'; -import { - defaultGetEventId, - defaultReflectEventId, -} from './helpers/default-get-event-id'; +import { defaultEventIdProvider } from './helpers/default-event-id-provider'; import { DefaultPubSub } from './helpers/default-pubsub'; import { + EventIdProvider, ICommand, IEvent, IEventBus, @@ -31,7 +29,7 @@ export class EventBus extends ObservableBus implements IEventBus, OnModuleDestroy { - protected getEventId: (event: EventBase) => string | null; + public eventIdProvider: EventIdProvider; protected readonly subscriptions: Subscription[]; private _publisher: IEventPublisher; @@ -44,7 +42,7 @@ export class EventBus ) { super(); this.subscriptions = []; - this.getEventId = defaultGetEventId; + this.eventIdProvider = defaultEventIdProvider; this.useDefaultPublisher(); } @@ -146,13 +144,15 @@ export class EventBus events.map((event) => this.bind( instance as IEventHandler, - defaultReflectEventId(event), + this.eventIdProvider.reflectEventId(event), ), ); } protected ofEventId(id: string) { - return this.subject$.pipe(filter((event) => this.getEventId(event) === id)); + return this.subject$.pipe( + filter((event) => this.eventIdProvider.getEventId(event) === id), + ); } protected registerSaga(saga: ISaga) { @@ -191,7 +191,7 @@ export class EventBus private reflectEvents( handler: EventHandlerType, - ): FunctionConstructor[] { + ): Array> { return Reflect.getMetadata(EVENTS_HANDLER_METADATA, handler); } diff --git a/src/helpers/default-event-id-provider.ts b/src/helpers/default-event-id-provider.ts new file mode 100644 index 00000000..b2dcf7dc --- /dev/null +++ b/src/helpers/default-event-id-provider.ts @@ -0,0 +1,20 @@ +import { IEvent } from '../interfaces'; +import { EVENT_METADATA } from '../decorators/constants'; +import { Type } from '@nestjs/common'; +import { EventIdProvider } from '../interfaces'; + +class DefaultEventIdProvider + implements EventIdProvider +{ + getEventId(event: EventBase): string | null { + const { constructor } = Object.getPrototypeOf(event); + + return this.reflectEventId(constructor); + } + + reflectEventId(event: Type): string | null { + return Reflect.getMetadata(EVENT_METADATA, event)?.id ?? null; + } +} + +export const defaultEventIdProvider = new DefaultEventIdProvider(); diff --git a/src/helpers/default-get-event-id.ts b/src/helpers/default-get-event-id.ts deleted file mode 100644 index 361de41b..00000000 --- a/src/helpers/default-get-event-id.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { IEvent } from '../interfaces'; -import { EVENT_METADATA } from '../decorators/constants'; -import { Type } from '@nestjs/common'; - -/** - * Null if the published class is not connected to any handler - * @param event - * @returns - */ -export const defaultGetEventId = ( - event: EventBase, -): string => { - const { constructor } = Object.getPrototypeOf(event); - return Reflect.getMetadata(EVENT_METADATA, constructor)?.id ?? null; -}; - -export const defaultReflectEventId = < - EventBase extends Type = Type, ->( - event: EventBase, -): string => { - return Reflect.getMetadata(EVENT_METADATA, event).id; -}; diff --git a/src/interfaces/events/event-id-provider.interface.ts b/src/interfaces/events/event-id-provider.interface.ts new file mode 100644 index 00000000..76fdf9cc --- /dev/null +++ b/src/interfaces/events/event-id-provider.interface.ts @@ -0,0 +1,10 @@ +import { IEvent } from './event.interface'; +import { Type } from '@nestjs/common'; + +export interface EventIdProvider { + /** + * Null if the published class is not connected to any handler + */ + getEventId(event: EventBase): string | null; + reflectEventId(event: Type): string | null; +} diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index a9df2105..081411e5 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -7,6 +7,7 @@ export * from './events/event-handler.interface'; export * from './events/event-publisher.interface'; export * from './events/event.interface'; export * from './events/message-source.interface'; +export * from './events/event-id-provider.interface'; export * from './exceptions/unhandled-exception-info.interface'; export * from './exceptions/unhandled-exception-publisher.interface'; export * from './queries/query-bus.interface';