@@ -8,25 +8,25 @@ import { EventEmitter } from 'events';
8
8
import { prisma } from '../prisma' ;
9
9
import { z } from 'zod' ;
10
10
import { authedProcedure , publicProcedure , router } from '../trpc' ;
11
+ import { on } from 'node:events' ;
11
12
12
- interface MyEvents {
13
- add : ( data : Post ) => void ;
14
- isTypingUpdate : ( ) => void ;
15
- }
16
- declare interface MyEventEmitter {
17
- on < TEv extends keyof MyEvents > ( event : TEv , listener : MyEvents [ TEv ] ) : this;
18
- off < TEv extends keyof MyEvents > ( event : TEv , listener : MyEvents [ TEv ] ) : this;
19
- once < TEv extends keyof MyEvents > ( event : TEv , listener : MyEvents [ TEv ] ) : this;
20
- emit < TEv extends keyof MyEvents > (
21
- event : TEv ,
22
- ...args : Parameters < MyEvents [ TEv ] >
23
- ) : boolean ;
13
+ type EventMap < T > = Record < keyof T , any [ ] > ;
14
+ class IterableEventEmitter < T extends EventMap < T > > extends EventEmitter < T > {
15
+ toIterable < TEventName extends keyof T & string > (
16
+ eventName : TEventName ,
17
+ opts ?: NonNullable < Parameters < typeof on > [ 2 ] > ,
18
+ ) : AsyncIterable < T [ TEventName ] > {
19
+ return on ( this as any , eventName , opts ) as any ;
20
+ }
24
21
}
25
22
26
- class MyEventEmitter extends EventEmitter { }
23
+ interface MyEvents {
24
+ add : [ Post ] ;
25
+ isTypingUpdate : [ ] ;
26
+ }
27
27
28
28
// In a real app, you'd probably use Redis or something
29
- const ee = new MyEventEmitter ( ) ;
29
+ const ee = new IterableEventEmitter < MyEvents > ( ) ;
30
30
31
31
// who is currently typing, key is `name`
32
32
const currentlyTyping : Record < string , { lastTyped : Date } > =
0 commit comments