Files

49 lines
1.3 KiB
JavaScript

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 };