2026-05-05 09:59:21 +03:00
|
|
|
import { loadQueueTopologyFromEnv, type QueueTopology } from "@image-platform/queue"
|
2026-05-05 13:25:28 +03:00
|
|
|
import { loadStorageConfigFromEnv, type StorageConfig } from "@image-platform/storage"
|
2026-05-05 09:59:21 +03:00
|
|
|
|
|
|
|
|
export type WorkerConfig = {
|
2026-05-05 13:25:28 +03:00
|
|
|
imgproxyUpstream: URL
|
2026-05-05 09:59:21 +03:00
|
|
|
prefetch: number
|
|
|
|
|
queueTopology: QueueTopology
|
|
|
|
|
rabbitmqUrl: string
|
2026-05-05 13:25:28 +03:00
|
|
|
storage: StorageConfig
|
2026-05-05 09:59:21 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function loadWorkerConfig(env: NodeJS.ProcessEnv = process.env): WorkerConfig {
|
|
|
|
|
return {
|
2026-05-05 13:25:28 +03:00
|
|
|
imgproxyUpstream: new URL(getRequiredEnv(env, "IMGPROXY_UPSTREAM")),
|
2026-05-05 09:59:21 +03:00
|
|
|
prefetch: parsePositiveInteger(env.WORKER_PREFETCH, 2),
|
|
|
|
|
queueTopology: loadQueueTopologyFromEnv(env),
|
2026-05-05 13:25:28 +03:00
|
|
|
rabbitmqUrl: getRequiredEnv(env, "RABBITMQ_URL"),
|
|
|
|
|
storage: loadStorageConfigFromEnv(env),
|
2026-05-05 09:59:21 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-05 13:25:28 +03:00
|
|
|
function getRequiredEnv(env: NodeJS.ProcessEnv, name: string) {
|
|
|
|
|
const value = env[name]
|
|
|
|
|
|
|
|
|
|
if (!value) {
|
|
|
|
|
throw new Error(`${name} is required`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-05 09:59:21 +03:00
|
|
|
function parsePositiveInteger(value: string | undefined, fallback: number) {
|
|
|
|
|
if (!value) {
|
|
|
|
|
return fallback
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const parsed = Number.parseInt(value, 10)
|
|
|
|
|
|
|
|
|
|
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback
|
|
|
|
|
}
|