From ca8f6e1efd62ea98d4fa496a3e3663ed2d6eba52 Mon Sep 17 00:00:00 2001 From: Alix-007 Date: Thu, 9 Jul 2026 15:29:44 +0800 Subject: [PATCH] fix(zalouser): clear probe timeout after auth resolves (#101649) --- extensions/zalouser/src/probe.test.ts | 17 +++++++++++++++++ extensions/zalouser/src/probe.ts | 23 ++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/extensions/zalouser/src/probe.test.ts b/extensions/zalouser/src/probe.test.ts index 5bdcdbdd76d2..c37e0db29cd6 100644 --- a/extensions/zalouser/src/probe.test.ts +++ b/extensions/zalouser/src/probe.test.ts @@ -60,6 +60,23 @@ describe("probeZalouser", () => { }); }); + it("clears the probe timeout after auth resolves", async () => { + vi.useFakeTimers(); + const clearTimeoutSpy = vi.spyOn(globalThis, "clearTimeout"); + mockGetUserInfo.mockResolvedValueOnce({ + userId: "123", + displayName: "Alice", + }); + + await expect(probeZalouser("default", 10)).resolves.toEqual({ + ok: true, + user: { userId: "123", displayName: "Alice" }, + }); + + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(vi.getTimerCount()).toBe(0); + }); + it("caps oversized lookup timeout before scheduling", async () => { vi.useFakeTimers(); mockGetUserInfo.mockReturnValueOnce(new Promise(() => {})); diff --git a/extensions/zalouser/src/probe.ts b/extensions/zalouser/src/probe.ts index 468d4e7b0b36..027709d7605d 100644 --- a/extensions/zalouser/src/probe.ts +++ b/extensions/zalouser/src/probe.ts @@ -14,14 +14,27 @@ export async function probeZalouser( timeoutMs?: number, ): Promise { try { - const user = timeoutMs - ? await Promise.race([ + let user: ZcaUserInfo | null; + if (timeoutMs) { + let timeout: ReturnType | undefined; + try { + user = await Promise.race([ getZaloUserInfo(profile), new Promise((resolve) => { - setTimeout(() => resolve(null), resolveTimerTimeoutMs(timeoutMs, 1000, 1000)); + timeout = setTimeout( + () => resolve(null), + resolveTimerTimeoutMs(timeoutMs, 1000, 1000), + ); }), - ]) - : await getZaloUserInfo(profile); + ]); + } finally { + if (timeout) { + clearTimeout(timeout); + } + } + } else { + user = await getZaloUserInfo(profile); + } if (!user) { return { ok: false, error: "Not authenticated" };