diff --git a/extensions/feishu/src/async.test.ts b/extensions/feishu/src/async.test.ts index 4d80592722b..352f4b64946 100644 --- a/extensions/feishu/src/async.test.ts +++ b/extensions/feishu/src/async.test.ts @@ -49,4 +49,19 @@ describe("waitForAbortableDelay", () => { await expect(delay).resolves.toBe(true); }); + + it("normalizes oversized delays before arming the timer", async () => { + const timeoutSpy = vi + .spyOn(globalThis, "setTimeout") + .mockImplementation((callback: () => void) => { + queueMicrotask(callback); + return 1 as unknown as ReturnType; + }); + vi.spyOn(globalThis, "clearTimeout").mockImplementation(() => undefined); + + const delay = waitForAbortableDelay(Number.MAX_SAFE_INTEGER); + + expect(timeoutSpy).toHaveBeenCalledWith(expect.any(Function), MAX_TIMER_TIMEOUT_MS); + await expect(delay).resolves.toBe(true); + }); }); diff --git a/extensions/feishu/src/async.ts b/extensions/feishu/src/async.ts index 7224a4dc45a..6b138083085 100644 --- a/extensions/feishu/src/async.ts +++ b/extensions/feishu/src/async.ts @@ -101,7 +101,7 @@ export function waitForAbortableDelay( return; } - timer = setTimeout(() => finish(true), delayMs); + timer = setTimeout(() => finish(true), resolveTimerTimeoutMs(delayMs, 1)); timer.unref?.(); }); }