Skip to content

Commit 8dbc6ae

Browse files
gantoineclaude
andcommitted
refactor(discord-presence): use TypedEventEmitter in the IPC client
Extend the shared TypedEventEmitter instead of hand-rolling on/emit overrides whose signatures are incompatible with Node's EventEmitter (which would error under @types/node >= 20). Events are now a typed payload map. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent d0f60aa commit 8dbc6ae

1 file changed

Lines changed: 8 additions & 18 deletions

File tree

apps/code/src/main/services/discord-presence/discord-ipc.ts

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { randomUUID } from "node:crypto";
2-
import { EventEmitter } from "node:events";
32
import net from "node:net";
43
import path from "node:path";
54
import { logger } from "../../utils/logger";
5+
import { TypedEventEmitter } from "../../utils/typed-event-emitter";
66

77
const log = logger.scope("discord-ipc");
88

@@ -29,9 +29,10 @@ export interface DiscordActivity {
2929
instance?: boolean;
3030
}
3131

32+
/** Event → payload map for {@link TypedEventEmitter}. Both are payload-less. */
3233
interface DiscordIpcClientEvents {
33-
ready: () => void;
34-
disconnect: () => void;
34+
ready: undefined;
35+
disconnect: undefined;
3536
}
3637

3738
/**
@@ -44,7 +45,7 @@ interface DiscordIpcClientEvents {
4445
* It performs no reconnection of its own; the owning service decides when to
4546
* retry so the policy lives in one place.
4647
*/
47-
export class DiscordIpcClient extends EventEmitter {
48+
export class DiscordIpcClient extends TypedEventEmitter<DiscordIpcClientEvents> {
4849
private socket: net.Socket | null = null;
4950
private readBuffer = Buffer.alloc(0);
5051
private ready = false;
@@ -53,17 +54,6 @@ export class DiscordIpcClient extends EventEmitter {
5354
super();
5455
}
5556

56-
override on<K extends keyof DiscordIpcClientEvents>(
57-
event: K,
58-
listener: DiscordIpcClientEvents[K],
59-
): this {
60-
return super.on(event, listener);
61-
}
62-
63-
override emit<K extends keyof DiscordIpcClientEvents>(event: K): boolean {
64-
return super.emit(event);
65-
}
66-
6757
isReady(): boolean {
6858
return this.ready;
6959
}
@@ -101,7 +91,7 @@ export class DiscordIpcClient extends EventEmitter {
10191
private tryConnect(paths: string[], index: number): void {
10292
if (index >= paths.length) {
10393
log.debug("No reachable Discord IPC socket");
104-
super.emit("disconnect");
94+
this.emit("disconnect", undefined);
10595
return;
10696
}
10797

@@ -179,7 +169,7 @@ export class DiscordIpcClient extends EventEmitter {
179169
if (msg?.cmd === "DISPATCH" && msg.evt === "READY") {
180170
this.ready = true;
181171
log.info("Discord IPC handshake complete");
182-
super.emit("ready");
172+
this.emit("ready", undefined);
183173
}
184174
}
185175
}
@@ -194,7 +184,7 @@ export class DiscordIpcClient extends EventEmitter {
194184
// best effort
195185
}
196186
this.socket = null;
197-
super.emit("disconnect");
187+
this.emit("disconnect", undefined);
198188
}
199189

200190
private write(op: number, payload: unknown): void {

0 commit comments

Comments
 (0)