49 lines
1.3 KiB
JavaScript
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 };
|