Skip to content

Commit

Permalink
feat: allow to overwrite event id strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
Grzesie2k committed Jan 2, 2024
1 parent 83ef9ba commit c9b4eef
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 32 deletions.
18 changes: 9 additions & 9 deletions src/event-bus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -31,7 +29,7 @@ export class EventBus<EventBase extends IEvent = IEvent>
extends ObservableBus<EventBase>
implements IEventBus<EventBase>, OnModuleDestroy
{
protected getEventId: (event: EventBase) => string | null;
public eventIdProvider: EventIdProvider<EventBase>;
protected readonly subscriptions: Subscription[];

private _publisher: IEventPublisher<EventBase>;
Expand All @@ -44,7 +42,7 @@ export class EventBus<EventBase extends IEvent = IEvent>
) {
super();
this.subscriptions = [];
this.getEventId = defaultGetEventId;
this.eventIdProvider = defaultEventIdProvider;
this.useDefaultPublisher();
}

Expand Down Expand Up @@ -146,13 +144,15 @@ export class EventBus<EventBase extends IEvent = IEvent>
events.map((event) =>
this.bind(
instance as IEventHandler<EventBase>,
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<EventBase>) {
Expand Down Expand Up @@ -191,7 +191,7 @@ export class EventBus<EventBase extends IEvent = IEvent>

private reflectEvents(
handler: EventHandlerType<EventBase>,
): FunctionConstructor[] {
): Array<Type<EventBase>> {
return Reflect.getMetadata(EVENTS_HANDLER_METADATA, handler);
}

Expand Down
20 changes: 20 additions & 0 deletions src/helpers/default-event-id-provider.ts
Original file line number Diff line number Diff line change
@@ -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<EventBase extends IEvent = IEvent>
implements EventIdProvider<EventBase>
{
getEventId(event: EventBase): string | null {
const { constructor } = Object.getPrototypeOf(event);

return this.reflectEventId(constructor);
}

reflectEventId(event: Type<EventBase>): string | null {
return Reflect.getMetadata(EVENT_METADATA, event)?.id ?? null;
}
}

export const defaultEventIdProvider = new DefaultEventIdProvider();
23 changes: 0 additions & 23 deletions src/helpers/default-get-event-id.ts

This file was deleted.

10 changes: 10 additions & 0 deletions src/interfaces/events/event-id-provider.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { IEvent } from './event.interface';
import { Type } from '@nestjs/common';

export interface EventIdProvider<EventBase extends IEvent = IEvent> {
/**
* Null if the published class is not connected to any handler
*/
getEventId(event: EventBase): string | null;
reflectEventId(event: Type<EventBase>): string | null;
}
1 change: 1 addition & 0 deletions src/interfaces/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down

0 comments on commit c9b4eef

Please sign in to comment.