diff options
| author | Aiden Cline <[email protected]> | 2025-12-31 16:15:49 -0600 |
|---|---|---|
| committer | Aiden Cline <[email protected]> | 2025-12-31 16:15:49 -0600 |
| commit | 9a1dc1ffe410ba4ce745b1bf65a15f21d9f9abfa (patch) | |
| tree | 572cd57fdc5be4967af79fd730bb6d5b1747b7f7 | |
| parent | c93e7621bec6d9e0088dc64ff25c0d61f43ccbb6 (diff) | |
| download | opencode-9a1dc1ffe410ba4ce745b1bf65a15f21d9f9abfa.tar.gz opencode-9a1dc1ffe410ba4ce745b1bf65a15f21d9f9abfa.zip | |
core: prevent TimeoutOverflowWarning by capping setTimeout delay to max 32-bit signed integer
| -rw-r--r-- | packages/opencode/src/session/retry.ts | 3 | ||||
| -rw-r--r-- | packages/opencode/test/session/retry.test.ts | 20 |
2 files changed, 22 insertions, 1 deletions
diff --git a/packages/opencode/src/session/retry.ts b/packages/opencode/src/session/retry.ts index 79caeac92..2c18edffe 100644 --- a/packages/opencode/src/session/retry.ts +++ b/packages/opencode/src/session/retry.ts @@ -5,10 +5,11 @@ export namespace SessionRetry { export const RETRY_INITIAL_DELAY = 2000 export const RETRY_BACKOFF_FACTOR = 2 export const RETRY_MAX_DELAY_NO_HEADERS = 30_000 // 30 seconds + export const RETRY_MAX_DELAY = 2_147_483_647 // max 32-bit signed integer for setTimeout export async function sleep(ms: number, signal: AbortSignal): Promise<void> { return new Promise((resolve, reject) => { - const timeout = setTimeout(resolve, ms) + const timeout = setTimeout(resolve, Math.min(ms, RETRY_MAX_DELAY)) signal.addEventListener( "abort", () => { diff --git a/packages/opencode/test/session/retry.test.ts b/packages/opencode/test/session/retry.test.ts index dc29be0b7..b130e927e 100644 --- a/packages/opencode/test/session/retry.test.ts +++ b/packages/opencode/test/session/retry.test.ts @@ -58,6 +58,26 @@ describe("session.retry.delay", () => { const longError = apiError({ "retry-after-ms": "700000" }) expect(SessionRetry.delay(1, longError)).toBe(700000) }) + + test("sleep caps delay to max 32-bit signed integer to avoid TimeoutOverflowWarning", async () => { + const controller = new AbortController() + + const warnings: string[] = [] + const originalWarn = process.emitWarning + process.emitWarning = (warning: string | Error) => { + warnings.push(typeof warning === "string" ? warning : warning.message) + } + + const promise = SessionRetry.sleep(2_560_914_000, controller.signal) + controller.abort() + + try { + await promise + } catch {} + + process.emitWarning = originalWarn + expect(warnings.some((w) => w.includes("TimeoutOverflowWarning"))).toBe(false) + }) }) describe("session.message-v2.fromError", () => { |
