From 8902752c172824a6b3c649962b6a3e9d1eeaab68 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Tue, 10 Feb 2026 10:55:53 -0800 Subject: [PATCH] improvement(timeouts): files/base64 should use max timeouts --- apps/sim/app/api/jobs/[jobId]/route.ts | 2 +- apps/sim/lib/knowledge/documents/document-processor.ts | 2 +- apps/sim/lib/uploads/utils/file-utils.server.ts | 6 +++++- apps/sim/lib/uploads/utils/user-file-base64.server.ts | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/sim/app/api/jobs/[jobId]/route.ts b/apps/sim/app/api/jobs/[jobId]/route.ts index 34c2e4217..14be54fac 100644 --- a/apps/sim/app/api/jobs/[jobId]/route.ts +++ b/apps/sim/app/api/jobs/[jobId]/route.ts @@ -76,7 +76,7 @@ export async function GET( } if (job.status === JOB_STATUS.PROCESSING || job.status === JOB_STATUS.PENDING) { - response.estimatedDuration = 180000 + response.estimatedDuration = 300000 } return NextResponse.json(response) diff --git a/apps/sim/lib/knowledge/documents/document-processor.ts b/apps/sim/lib/knowledge/documents/document-processor.ts index 37896d9a3..80789e81b 100644 --- a/apps/sim/lib/knowledge/documents/document-processor.ts +++ b/apps/sim/lib/knowledge/documents/document-processor.ts @@ -14,7 +14,7 @@ import { mistralParserTool } from '@/tools/mistral/parser' const logger = createLogger('DocumentProcessor') const TIMEOUTS = { - FILE_DOWNLOAD: 180000, + FILE_DOWNLOAD: 600000, MISTRAL_OCR_API: 120000, } as const diff --git a/apps/sim/lib/uploads/utils/file-utils.server.ts b/apps/sim/lib/uploads/utils/file-utils.server.ts index b759918d0..69077c663 100644 --- a/apps/sim/lib/uploads/utils/file-utils.server.ts +++ b/apps/sim/lib/uploads/utils/file-utils.server.ts @@ -1,6 +1,7 @@ 'use server' import type { Logger } from '@sim/logger' +import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' import { secureFetchWithPinnedIP, validateUrlWithDNS, @@ -135,7 +136,10 @@ export async function resolveFileInputToUrl( * For internal URLs, uses direct storage access (server-side only) * For external URLs, validates DNS/SSRF and uses secure fetch with IP pinning */ -export async function downloadFileFromUrl(fileUrl: string, timeoutMs = 180000): Promise { +export async function downloadFileFromUrl( + fileUrl: string, + timeoutMs = getMaxExecutionTimeout() +): Promise { const { parseInternalFileUrl } = await import('./file-utils') if (isInternalFileUrl(fileUrl)) { diff --git a/apps/sim/lib/uploads/utils/user-file-base64.server.ts b/apps/sim/lib/uploads/utils/user-file-base64.server.ts index 33f7e6259..f3abdf5ac 100644 --- a/apps/sim/lib/uploads/utils/user-file-base64.server.ts +++ b/apps/sim/lib/uploads/utils/user-file-base64.server.ts @@ -1,13 +1,14 @@ import type { Logger } from '@sim/logger' import { createLogger } from '@sim/logger' import { getRedisClient } from '@/lib/core/config/redis' +import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' import { isUserFileWithMetadata } from '@/lib/core/utils/user-file' import { bufferToBase64 } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage, downloadFileFromUrl } from '@/lib/uploads/utils/file-utils.server' import type { UserFile } from '@/executor/types' const DEFAULT_MAX_BASE64_BYTES = 10 * 1024 * 1024 -const DEFAULT_TIMEOUT_MS = 180000 +const DEFAULT_TIMEOUT_MS = getMaxExecutionTimeout() const DEFAULT_CACHE_TTL_SECONDS = 300 const REDIS_KEY_PREFIX = 'user-file:base64:'