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" };