fix(discord): unify reconnect watchdog and land #31025/#30530

Landed follow-up intent from contributor PR #31025 (@theotarr) and PR #30530 (@liuxiaopai-ai).

Co-authored-by: theotarr <theotarr@users.noreply.github.com>
Co-authored-by: liuxiaopai-ai <liuxiaopai-ai@users.noreply.github.com>
This commit is contained in:
Peter Steinberger
2026-03-02 00:23:07 +00:00
parent 0eac494db7
commit 0c0f556927
12 changed files with 462 additions and 5 deletions

View File

@@ -81,4 +81,48 @@ describe("waitForDiscordGatewayStop", () => {
await expect(promise).resolves.toBeUndefined();
});
it("rejects via registerForceStop and disconnects gateway", async () => {
const emitter = new EventEmitter();
const disconnect = vi.fn();
const abort = new AbortController();
let forceStop: ((err: unknown) => void) | undefined;
const promise = waitForDiscordGatewayStop({
gateway: { emitter, disconnect },
abortSignal: abort.signal,
registerForceStop: (fn) => {
forceStop = fn;
},
});
expect(forceStop).toBeDefined();
forceStop?.(new Error("reconnect watchdog timeout"));
await expect(promise).rejects.toThrow("reconnect watchdog timeout");
expect(disconnect).toHaveBeenCalledTimes(1);
expect(emitter.listenerCount("error")).toBe(0);
});
it("ignores forceStop after promise already settled", async () => {
const emitter = new EventEmitter();
const disconnect = vi.fn();
const abort = new AbortController();
let forceStop: ((err: unknown) => void) | undefined;
const promise = waitForDiscordGatewayStop({
gateway: { emitter, disconnect },
abortSignal: abort.signal,
registerForceStop: (fn) => {
forceStop = fn;
},
});
abort.abort();
await expect(promise).resolves.toBeUndefined();
forceStop?.(new Error("too late"));
expect(disconnect).toHaveBeenCalledTimes(1);
});
});