const fs = require('fs'); const path = require('path'); const CACHE_DIR = process.env.CACHE_DIR || path.join(__dirname, '../../cache'); const MAX_BYTES = 50 * 1024 * 1024; function ensureDir() { if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true }); } function cachePath(key) { return path.join(CACHE_DIR, key.replace(/[^a-zA-Z0-9._-]/g, '_') + '.json'); } function get(key, maxAgeMs) { ensureDir(); const p = cachePath(key); if (!fs.existsSync(p)) return null; try { const raw = JSON.parse(fs.readFileSync(p, 'utf8')); if (maxAgeMs && Date.now() - raw.fetchedAt > maxAgeMs) return null; return raw.data; } catch (e) { return null; } } function set(key, data) { ensureDir(); fs.writeFileSync(cachePath(key), JSON.stringify({ fetchedAt: Date.now(), data }, null, 0)); pruneIfNeeded(); } function pruneIfNeeded() { ensureDir(); const files = fs.readdirSync(CACHE_DIR).map(f => { const p = path.join(CACHE_DIR, f); return { p, mtime: fs.statSync(p).mtimeMs, size: fs.statSync(p).size }; }).sort((a, b) => a.mtime - b.mtime); let total = files.reduce((s, f) => s + f.size, 0); for (const f of files) { if (total <= MAX_BYTES) break; fs.unlinkSync(f.p); total -= f.size; } } module.exports = { get, set, CACHE_DIR };