Skip to content

Commit bc474ad

Browse files
authored
feat(server): allow server to end subscriptions (#6463)
1 parent f019eb3 commit bc474ad

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

src/server/routers/post.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@ import { EventEmitter } from 'events';
88
import { prisma } from '../prisma';
99
import { z } from 'zod';
1010
import { authedProcedure, publicProcedure, router } from '../trpc';
11+
import { on } from 'node:events';
1112

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+
}
2421
}
2522

26-
class MyEventEmitter extends EventEmitter {}
23+
interface MyEvents {
24+
add: [Post];
25+
isTypingUpdate: [];
26+
}
2727

2828
// In a real app, you'd probably use Redis or something
29-
const ee = new MyEventEmitter();
29+
const ee = new IterableEventEmitter<MyEvents>();
3030

3131
// who is currently typing, key is `name`
3232
const currentlyTyping: Record<string, { lastTyped: Date }> =

0 commit comments

Comments
 (0)