Skip to content

Commit 8930306

Browse files
committed
feat: create event bus actor
Signed-off-by: codeSafari10 <codeSafari10@gmail.com>
1 parent 6cde861 commit 8930306

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

src/actors/eventBus.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import { Observable, Subject, filter } from 'rxjs';
3+
4+
// Generic Event interface
5+
export interface EventBusEvent<Type extends string, Data = unknown> {
6+
type: Type;
7+
data: Data;
8+
}
9+
10+
// Helper type to extract event types from a union
11+
export type EventType<T> = T extends EventBusEvent<infer Type, any> ? Type : never;
12+
13+
// Helper type to extract payload type for a given event type
14+
export type DataType<T, Type extends string> = T extends EventBusEvent<Type, infer Data>
15+
? Data
16+
: never;
17+
18+
// Generic EventBus class
19+
export class EventBus<T extends EventBusEvent<string, any>> {
20+
private eventSubject: Subject<T>;
21+
private eventObservable: Observable<T>;
22+
23+
constructor() {
24+
this.eventSubject = new Subject<T>();
25+
this.eventObservable = this.eventSubject.asObservable();
26+
}
27+
28+
// Method to publish an event
29+
publish<E extends T>(event: E): void {
30+
this.eventSubject.next(event);
31+
}
32+
33+
// Method to subscribe to a specific event type
34+
on(eventType: EventType<T>): Observable<T> {
35+
return this.eventObservable.pipe(filter((event): event is T => event.type === eventType));
36+
}
37+
38+
// Method to subscribe to all events
39+
onAny(): Observable<T> {
40+
return this.eventObservable;
41+
}
42+
}

src/actors/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,5 @@ export {
3737
sendToActor,
3838
sendToActors
3939
} from './utils';
40+
41+
export * from './eventBus';

0 commit comments

Comments
 (0)