A social knowledge tool for researchers built on ATProto
1import {
2 IEventSubscriber,
3 IEventHandler,
4} from '../../application/events/IEventSubscriber';
5import { IDomainEvent } from '../../domain/events/IDomainEvent';
6import { InMemoryEventPublisher } from './InMemoryEventPublisher';
7import { EventName } from './EventConfig';
8
9export class InMemoryEventSubscriber implements IEventSubscriber {
10 private handlers: Map<EventName, IEventHandler<any>> = new Map();
11 private isStarted = false;
12
13 async subscribe<T extends IDomainEvent>(
14 eventType: EventName,
15 handler: IEventHandler<T>,
16 ): Promise<void> {
17 this.handlers.set(eventType, handler);
18
19 // Register with the static publisher
20 InMemoryEventPublisher.addSubscriber(
21 eventType,
22 async (event: IDomainEvent) => {
23 const result = await handler.handle(event as T);
24 if (result.isErr()) {
25 throw result.error;
26 }
27 },
28 );
29 }
30
31 async start(): Promise<void> {
32 this.isStarted = true;
33 console.log('InMemoryEventSubscriber started');
34 }
35
36 async stop(): Promise<void> {
37 this.isStarted = false;
38 console.log('InMemoryEventSubscriber stopped');
39 }
40}