import dotenv from 'dotenv'; import { fileURLToPath } from 'node:url'; dotenv.config({ path: fileURLToPath(new URL('../../../.env', import.meta.url)) }); import { createDatabase } from '../../api/src/infrastructure/database/client.js'; import { createLocalImageStorage, resolveProjectImageStorageRoot } from '../../api/src/infrastructure/images/local-image-storage.js'; import { createImageDerivativeProcessor } from '../../api/src/infrastructure/images/image-derivative-processor.js'; import { createSharpImageRenderer } from '../../api/src/infrastructure/images/sharp-image-renderer.js'; import { createImageDerivativeJobRepository } from '../../api/src/modules/inventory/repositories/image-derivative-job-repository.js'; import { processNextPersistentImageDerivativeJob } from './image-derivative-worker.js'; const pollIntervalMs = Number.parseInt(process.env.WORKER_POLL_INTERVAL_MS ?? '2000', 10); async function runWorker() { const imageStorageRoot = resolveProjectImageStorageRoot(process.env.IMAGE_STORAGE_ROOT ?? '.local/image-storage', import.meta.url); const database = createDatabase(); const imageStorage = createLocalImageStorage(imageStorageRoot); const jobRepository = createImageDerivativeJobRepository(database.db); const processor = createImageDerivativeProcessor({ imageStorage, renderer: createSharpImageRenderer(), }); async function processOne() { const result = await processNextPersistentImageDerivativeJob({ jobRepository, async loadSource(sourceKey) { return { sourceKey, data: await imageStorage.get(sourceKey) }; }, processor, }); if (result) console.log(`Image derivative job ${result.id} ${result.status.toLowerCase()}.`); } await processOne(); const timer = setInterval(() => processOne().catch((error) => console.error(error)), pollIntervalMs); const shutdown = async () => { clearInterval(timer); await database.close(); }; process.once('SIGINT', shutdown); process.once('SIGTERM', shutdown); } runWorker().catch((error) => { console.error(error); process.exitCode = 1; });