/** * Sunucu içi zamanlayıcı — geçmiş sonuç ilanlarını periyodik olarak biriktirir. * Container'da ayrı cron kurmaya gerek kalmaz; server/index.js başlatır. * * Env: * SCAN_ENABLED=0 → kapat (varsayılan açık) * SCAN_INTERVAL_SAAT=6 → tarama sıklığı (saat) * SCAN_GUN=3 → her turda geriye kaç günü tara * SCAN_LIMIT=300 → tur başına maksimum ihale */ import { spawn } from 'node:child_process'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); let calisiyor = false; function tara() { if (calisiyor) { console.log('[scheduler] önceki tarama sürüyor, bu tur atlandı'); return; } calisiyor = true; const gun = process.env.SCAN_GUN || '3'; const limit = process.env.SCAN_LIMIT || '300'; console.log(`[scheduler] EKAP sonuç taraması başlıyor (son ${gun} gün, limit ${limit})`); const p = spawn(process.execPath, [path.join(__dirname, 'ekap-scan.mjs'), '--gun', gun, '--limit', limit], { stdio: ['ignore', 'pipe', 'pipe'], }); p.stdout.on('data', (d) => process.stdout.write(String(d))); p.stderr.on('data', (d) => process.stderr.write(String(d))); p.on('close', (code) => { calisiyor = false; console.log(`[scheduler] tarama bitti (çıkış kodu ${code})`); }); p.on('error', (e) => { calisiyor = false; console.warn('[scheduler] tarama başlatılamadı:', e.message); }); } export function startScheduler() { if (process.env.SCAN_ENABLED === '0') { console.log('[scheduler] devre dışı (SCAN_ENABLED=0)'); return; } const saat = Number(process.env.SCAN_INTERVAL_SAAT || 6); const ms = Math.max(1, saat) * 3600 * 1000; console.log(`[scheduler] geçmiş sonuç taraması her ${saat} saatte bir çalışacak`); // Açılıştan 2 dk sonra ilk tur (sunucu ısınsın), sonra periyodik setTimeout(tara, 2 * 60 * 1000).unref?.(); setInterval(tara, ms).unref?.(); }