From 21d87b184c878f1cdb21b839e6561db63ae9d09e Mon Sep 17 00:00:00 2001 From: xixu-me Date: Wed, 19 Aug 2026 16:23:36 +0800 Subject: [PATCH] fix(retry): avoid CPU busy wait --- src/lib/rateLimit.ts | 16 ++-------------- tests/lib/rateLimit.test.ts | 4 +++- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/lib/rateLimit.ts b/src/lib/rateLimit.ts index f6abb5d..e0ea816 100644 --- a/src/lib/rateLimit.ts +++ b/src/lib/rateLimit.ts @@ -169,20 +169,8 @@ export async function checkRateLimit( * @param seconds - Number of seconds to delay * @returns Promise that resolves after the specified delay */ -export async function delayRequest(seconds: number): Promise { - return new Promise((resolve) => { - // Use a simple delay implementation for Workers environment - const start = Date.now(); - const checkTime = () => { - if (Date.now() - start >= seconds * 1000) { - resolve(); - } else { - // Use minimal delay to prevent blocking - Promise.resolve().then(checkTime); - } - }; - checkTime(); - }); +export function delayRequest(seconds: number): Promise { + return new Promise((resolve) => setTimeout(resolve, seconds * 1000)); } /** diff --git a/tests/lib/rateLimit.test.ts b/tests/lib/rateLimit.test.ts index 3f053d7..460b99c 100644 --- a/tests/lib/rateLimit.test.ts +++ b/tests/lib/rateLimit.test.ts @@ -16,7 +16,7 @@ describe("Rate Limit Module", () => { }); afterEach(() => { - jest.clearAllMocks(); + jest.restoreAllMocks(); }); describe("getClientIP", () => { @@ -90,10 +90,12 @@ describe("Rate Limit Module", () => { }); it("should handle zero delay", async () => { + const timer = jest.spyOn(globalThis, "setTimeout"); const startTime = Date.now(); await delayRequest(0); const endTime = Date.now(); + expect(timer).toHaveBeenCalledTimes(1); expect(endTime - startTime).toBeLessThan(50); }); });