From db593440c4206ab7fdff2712740f655f13026c4a Mon Sep 17 00:00:00 2001 From: geekhuashan Date: Fri, 3 Apr 2026 22:42:14 +0800 Subject: [PATCH] fix(discord voice): fire-and-forget autoJoin and increase playback timeout to 60s --- .../src/voice/manager.ready-listener.test.ts | 24 +++++++++++++++++++ extensions/discord/src/voice/manager.ts | 8 ++++--- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 extensions/discord/src/voice/manager.ready-listener.test.ts diff --git a/extensions/discord/src/voice/manager.ready-listener.test.ts b/extensions/discord/src/voice/manager.ready-listener.test.ts new file mode 100644 index 00000000000..841cda70bb9 --- /dev/null +++ b/extensions/discord/src/voice/manager.ready-listener.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it, vi } from "vitest"; +import { DiscordVoiceReadyListener } from "./manager.js"; + +describe("DiscordVoiceReadyListener", () => { + it("starts auto-join without blocking the ready listener", async () => { + let resolveJoin: (() => void) | undefined; + const autoJoin = vi.fn( + () => + new Promise((resolve) => { + resolveJoin = resolve; + }), + ); + const listener = new DiscordVoiceReadyListener({ + autoJoin, + } as unknown as ConstructorParameters[0]); + + const result = listener.handle({} as never, {} as never); + + await expect(result).resolves.toBeUndefined(); + expect(autoJoin).toHaveBeenCalledTimes(1); + + resolveJoin?.(); + }); +}); diff --git a/extensions/discord/src/voice/manager.ts b/extensions/discord/src/voice/manager.ts index 4f30f3b65cc..2ba10d0246c 100644 --- a/extensions/discord/src/voice/manager.ts +++ b/extensions/discord/src/voice/manager.ts @@ -32,7 +32,7 @@ const CHANNELS = 2; const BIT_DEPTH = 16; const MIN_SEGMENT_SECONDS = 0.35; const SILENCE_DURATION_MS = 1_000; -const PLAYBACK_READY_TIMEOUT_MS = 15_000; +const PLAYBACK_READY_TIMEOUT_MS = 60_000; const SPEAKING_READY_TIMEOUT_MS = 60_000; const DECRYPT_FAILURE_WINDOW_MS = 30_000; const DECRYPT_FAILURE_RECONNECT_THRESHOLD = 3; @@ -939,8 +939,10 @@ export class DiscordVoiceReadyListener extends ReadyListener { super(); } - async handle() { - await this.manager.autoJoin(); + async handle(_data: unknown, _client: Client): Promise { + void this.manager + .autoJoin() + .catch((err) => logger.warn(`discord voice: autoJoin failed: ${formatErrorMessage(err)}`)); } }