69 lines
2.8 KiB
TypeScript
69 lines
2.8 KiB
TypeScript
import path from "node:path"
|
|
import os from "node:os"
|
|
import { existsSync } from "node:fs"
|
|
import { fileURLToPath } from "node:url"
|
|
import { AgentConfig } from "./types.js"
|
|
import { loadDotEnv } from "./env.js"
|
|
|
|
const currentFile = fileURLToPath(import.meta.url)
|
|
const agentRoot = path.resolve(path.dirname(currentFile), "..")
|
|
|
|
const optional = (value: string | undefined) => {
|
|
const trimmed = value?.trim()
|
|
return trimmed ? trimmed : undefined
|
|
}
|
|
|
|
const numberFromEnv = (value: string | undefined, fallback: number) => {
|
|
if (!value) return fallback
|
|
|
|
const parsed = Number(value)
|
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback
|
|
}
|
|
|
|
const scanFormatFromEnv = (value: string | undefined): AgentConfig["scanFormat"] => {
|
|
if (value === "png" || value === "tiff" || value === "pdf") return value
|
|
return "pdf"
|
|
}
|
|
|
|
const booleanFromEnv = (value: string | undefined, fallback: boolean) => {
|
|
if (!value) return fallback
|
|
return ["1", "true", "yes", "ja", "on"].includes(value.trim().toLowerCase())
|
|
}
|
|
|
|
const postprocessProfileFromEnv = (value: string | undefined): AgentConfig["postprocessProfile"] => {
|
|
if (value === "document" || value === "receipt" || value === "raw") return value
|
|
return "document"
|
|
}
|
|
|
|
const defaultPostprocessPython = () => {
|
|
const localVenvPython = path.join(agentRoot, ".venv-opencv", "bin", "python")
|
|
return existsSync(localVenvPython) ? localVenvPython : "python3"
|
|
}
|
|
|
|
export const loadConfig = (): AgentConfig => {
|
|
loadDotEnv(process.env.FEDEO_AGENT_ENV || ".env")
|
|
|
|
const fedeoUrl = optional(process.env.FEDEO_URL)
|
|
const agentToken = optional(process.env.FEDEO_AGENT_TOKEN)
|
|
|
|
if (!fedeoUrl) throw new Error("FEDEO_URL fehlt")
|
|
if (!agentToken) throw new Error("FEDEO_AGENT_TOKEN fehlt")
|
|
|
|
return {
|
|
fedeoUrl: fedeoUrl.replace(/\/+$/, ""),
|
|
agentToken,
|
|
pollSeconds: numberFromEnv(process.env.FEDEO_POLL_SECONDS, 5),
|
|
workDir: optional(process.env.FEDEO_WORK_DIR) || path.join(os.tmpdir(), "fedeo-device-agent"),
|
|
scannerName: optional(process.env.FEDEO_SCANNER_NAME),
|
|
printerName: optional(process.env.FEDEO_PRINTER_NAME),
|
|
scanFormat: scanFormatFromEnv(process.env.FEDEO_SCAN_FORMAT),
|
|
scanResolution: numberFromEnv(process.env.FEDEO_SCAN_RESOLUTION, 300),
|
|
scanMode: optional(process.env.FEDEO_SCAN_MODE) || "Color",
|
|
scanSource: optional(process.env.FEDEO_SCAN_SOURCE),
|
|
scanPostprocess: booleanFromEnv(process.env.FEDEO_SCAN_POSTPROCESS, false),
|
|
postprocessProfile: postprocessProfileFromEnv(process.env.FEDEO_SCAN_POSTPROCESS_PROFILE),
|
|
postprocessPython: optional(process.env.FEDEO_SCAN_POSTPROCESS_PYTHON) || defaultPostprocessPython(),
|
|
postprocessStrict: booleanFromEnv(process.env.FEDEO_SCAN_POSTPROCESS_STRICT, false),
|
|
}
|
|
}
|