summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-12-31 16:15:49 -0600
committerAiden Cline <[email protected]>2025-12-31 16:15:49 -0600
commit9a1dc1ffe410ba4ce745b1bf65a15f21d9f9abfa (patch)
tree572cd57fdc5be4967af79fd730bb6d5b1747b7f7
parentc93e7621bec6d9e0088dc64ff25c0d61f43ccbb6 (diff)
downloadopencode-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.ts3
-rw-r--r--packages/opencode/test/session/retry.test.ts20
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", () => {