diff --git a/.env.example b/.env.example index f136792e69..55d3ddc770 100644 --- a/.env.example +++ b/.env.example @@ -166,6 +166,8 @@ GEMINI_CLI_USER_AGENT=google-api-nodejs-client/9.15.1 # Timeout settings # FETCH_TIMEOUT_MS=120000 # STREAM_IDLE_TIMEOUT_MS=60000 +# API bridge timeout for /v1 proxy requests (default: 30000) +# API_BRIDGE_PROXY_TIMEOUT_MS=120000 # CORS configuration (default: * allows all origins) # CORS_ORIGINS=* diff --git a/src/lib/apiBridgeServer.ts b/src/lib/apiBridgeServer.ts index b8786ab081..44e40591bb 100644 --- a/src/lib/apiBridgeServer.ts +++ b/src/lib/apiBridgeServer.ts @@ -2,7 +2,23 @@ import http from "node:http"; import type { IncomingMessage, ServerResponse } from "node:http"; import { getRuntimePorts } from "@/lib/runtime/ports"; -const PROXY_TIMEOUT_MS = 30_000; // 30s timeout to prevent resource exhaustion +const DEFAULT_PROXY_TIMEOUT_MS = 30_000; + +function parseProxyTimeoutMs(raw: string | undefined): number { + if (raw == null || raw.trim() === "") return DEFAULT_PROXY_TIMEOUT_MS; + const parsed = Number(raw); + + if (!Number.isFinite(parsed) || parsed <= 0) { + console.warn( + `[API Bridge] Invalid API_BRIDGE_PROXY_TIMEOUT_MS=\"${raw}\". Using default ${DEFAULT_PROXY_TIMEOUT_MS}ms.` + ); + return DEFAULT_PROXY_TIMEOUT_MS; + } + + return Math.floor(parsed); +} + +const PROXY_TIMEOUT_MS = parseProxyTimeoutMs(process.env.API_BRIDGE_PROXY_TIMEOUT_MS); const OPENAI_COMPAT_PATHS = [ /^\/v1(?:\/|$)/,