openreader/compute/core/src/runtime/timeout-config.ts

39 lines
1.5 KiB
TypeScript

const DEFAULT_COMPUTE_WHISPER_TIMEOUT_MS = 30_000;
const DEFAULT_COMPUTE_PDF_TIMEOUT_MS = 300_000;
const DEFAULT_COMPUTE_PDF_HARD_CAP_MS = 24 * 60 * 60 * 1000;
const DEFAULT_WORKER_WAIT_BUFFER_MS = 15_000;
const DEFAULT_WORKER_WAIT_MIN_MS = 60_000;
export type ComputeTimeoutConfig = {
whisperTimeoutMs: number;
pdfTimeoutMs: number;
pdfHardCapMs: number;
};
export type ComputeOperationKind = 'whisper_align' | 'pdf_layout';
function readPositiveIntEnv(name: string, fallback: number): number {
const raw = process.env[name]?.trim();
if (!raw) return fallback;
const parsed = Number(raw);
if (!Number.isFinite(parsed) || parsed <= 0) return fallback;
return Math.floor(parsed);
}
let timeoutConfigCache: ComputeTimeoutConfig | null = null;
export function getComputeTimeoutConfig(): ComputeTimeoutConfig {
if (timeoutConfigCache) return timeoutConfigCache;
timeoutConfigCache = {
whisperTimeoutMs: readPositiveIntEnv('COMPUTE_WHISPER_TIMEOUT_MS', DEFAULT_COMPUTE_WHISPER_TIMEOUT_MS),
pdfTimeoutMs: readPositiveIntEnv('COMPUTE_PDF_TIMEOUT_MS', DEFAULT_COMPUTE_PDF_TIMEOUT_MS),
pdfHardCapMs: DEFAULT_COMPUTE_PDF_HARD_CAP_MS,
};
return timeoutConfigCache;
}
export function getWorkerClientWaitTimeoutMs(kind: ComputeOperationKind): number {
const config = getComputeTimeoutConfig();
const timeoutMs = kind === 'pdf_layout' ? config.pdfTimeoutMs : config.whisperTimeoutMs;
return Math.max(DEFAULT_WORKER_WAIT_MIN_MS, timeoutMs + DEFAULT_WORKER_WAIT_BUFFER_MS);
}