From 754fbee227b700f54cea0292331f2e14a493b780 Mon Sep 17 00:00:00 2001 From: Richard R Date: Thu, 21 May 2026 20:54:22 -0600 Subject: [PATCH] refactor(compute-core): centralize runtime cpu config exports --- compute/core/package.json | 1 + compute/core/src/runtime/docstore.ts | 2 +- compute/core/src/runtime/index.ts | 15 ++++++++++ src/lib/server/compute/concurrency-limiter.ts | 2 +- src/lib/server/compute/cpu-budget.ts | 28 ------------------- src/lib/server/whisper/alignment.ts | 2 +- tsconfig.json | 1 + 7 files changed, 20 insertions(+), 31 deletions(-) create mode 100644 compute/core/src/runtime/index.ts delete mode 100644 src/lib/server/compute/cpu-budget.ts diff --git a/compute/core/package.json b/compute/core/package.json index 639b6aa..2198343 100644 --- a/compute/core/package.json +++ b/compute/core/package.json @@ -15,6 +15,7 @@ ".": "./src/index.ts", "./contracts": "./src/contracts.ts", "./local-runtime": "./src/local-runtime.ts", + "./runtime": "./src/runtime/index.ts", "./runtime/timeout-config": "./src/runtime/timeout-config.ts", "./pdf-layout/*": "./src/pdf-layout/*.ts" } diff --git a/compute/core/src/runtime/docstore.ts b/compute/core/src/runtime/docstore.ts index 4e93930..7d7dd6b 100644 --- a/compute/core/src/runtime/docstore.ts +++ b/compute/core/src/runtime/docstore.ts @@ -1,6 +1,6 @@ import path from 'path'; -export const DOCSTORE_DIR = process.env.COMPUTE_DOCSTORE_DIR?.trim() || path.join(process.cwd(), 'docstore'); +export const DOCSTORE_DIR = path.join(process.cwd(), 'docstore'); export function getDocstoreDir(): string { return DOCSTORE_DIR; diff --git a/compute/core/src/runtime/index.ts b/compute/core/src/runtime/index.ts new file mode 100644 index 0000000..c67490a --- /dev/null +++ b/compute/core/src/runtime/index.ts @@ -0,0 +1,15 @@ +export { + getComputeJobConcurrency, + getAvailableCpuCores, + getOnnxThreadsPerJob, +} from './cpu-budget'; + +export { + getComputeTimeoutConfig, + getWorkerClientWaitTimeoutMs, + withTimeout, + withIdleTimeoutAndHardCap, + type ComputeTimeoutConfig, + type ComputeOperationKind, + type IdleTimeoutAndHardCapInput, +} from './timeout-config'; diff --git a/src/lib/server/compute/concurrency-limiter.ts b/src/lib/server/compute/concurrency-limiter.ts index e733cba..1673f21 100644 --- a/src/lib/server/compute/concurrency-limiter.ts +++ b/src/lib/server/compute/concurrency-limiter.ts @@ -1,4 +1,4 @@ -import { getComputeJobConcurrency } from '@/lib/server/compute/cpu-budget'; +import { getComputeJobConcurrency } from '@openreader/compute-core/runtime'; export class ConcurrencyLimiter { private readonly maxInFlight: number; diff --git a/src/lib/server/compute/cpu-budget.ts b/src/lib/server/compute/cpu-budget.ts deleted file mode 100644 index 50d161b..0000000 --- a/src/lib/server/compute/cpu-budget.ts +++ /dev/null @@ -1,28 +0,0 @@ -import os from 'node:os'; - -function readPositiveInt(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); -} - -export function getComputeJobConcurrency(): number { - return readPositiveInt('COMPUTE_JOB_CONCURRENCY', 1); -} - -export function getAvailableCpuCores(): number { - if (typeof os.availableParallelism === 'function') { - const value = os.availableParallelism(); - if (Number.isFinite(value) && value >= 1) return Math.floor(value); - } - const fallback = os.cpus().length; - return Number.isFinite(fallback) && fallback >= 1 ? Math.floor(fallback) : 1; -} - -export function getOnnxThreadsPerJob(): number { - const concurrency = getComputeJobConcurrency(); - const usableCores = Math.max(1, getAvailableCpuCores() - 1); - return Math.max(1, Math.floor(usableCores / concurrency)); -} diff --git a/src/lib/server/whisper/alignment.ts b/src/lib/server/whisper/alignment.ts index f225ea2..713c87b 100644 --- a/src/lib/server/whisper/alignment.ts +++ b/src/lib/server/whisper/alignment.ts @@ -8,7 +8,7 @@ import { Tokenizer } from '@huggingface/tokenizers'; import JSZip from 'jszip'; import type { TTSAudioBuffer, TTSAudioBytes, TTSSentenceAlignment } from '@/types/tts'; import { getFFmpegPath } from '@/lib/server/audiobooks/ffmpeg-bin'; -import { getOnnxThreadsPerJob } from '@/lib/server/compute/cpu-budget'; +import { getOnnxThreadsPerJob } from '@openreader/compute-core/runtime'; import { mapWordsToSentenceOffsets, type WhisperWord, diff --git a/tsconfig.json b/tsconfig.json index 3eab189..82246b7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,6 +23,7 @@ "@openreader/compute-core": ["./compute/core/src/index.ts"], "@openreader/compute-core/contracts": ["./compute/core/src/contracts.ts"], "@openreader/compute-core/local-runtime": ["./compute/core/src/local-runtime.ts"], + "@openreader/compute-core/runtime": ["./compute/core/src/runtime/index.ts"], "@openreader/compute-core/runtime/timeout-config": ["./compute/core/src/runtime/timeout-config.ts"], "@openreader/compute-core/pdf-layout/*": ["./compute/core/src/pdf-layout/*"] }