From bc878dfb6412ce84ed8f80dce4b307b5e80457e1 Mon Sep 17 00:00:00 2001 From: sent Date: Thu, 5 Jun 2025 21:23:14 -0700 Subject: [PATCH] Add others/scaler.mjs --- others/scaler.mjs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 others/scaler.mjs diff --git a/others/scaler.mjs b/others/scaler.mjs new file mode 100644 index 00000000..00578b6f --- /dev/null +++ b/others/scaler.mjs @@ -0,0 +1,37 @@ +import chokidar from "chokidar"; +import { LRUCache } from "lru-cache"; +import path from "path"; + +let maxKeys = 10_000; +let cache = makeCache(maxKeys); + +function makeCache(maxEntries) { + return new LRUCache({ + maxSize: maxEntries, + ttl: 60_000, + allowStale: false, + updateAgeOnGet: false, + updateAgeOnHas: false + }); +} + +function scaleCache() { + const { heapUsed, heapTotal } = process.memoryUsage(); + const freeHeapRatio = (heapTotal - heapUsed) / heapTotal; + const newMax = freeHeapRatio > 0.5 ? 20_000 : freeHeapRatio < 0.2 ? 5_000 : 10_000; + if (newMax !== maxKeys) { + maxKeys = newMax; + cache = makeCache(maxKeys); + console.log(`[SCALER] freeHeap ${((heapTotal - heapUsed) / 1e6).toFixed(1)}MB → maxKeys: ${maxKeys}`); + } +} + +setInterval(scaleCache, 60_000); +scaleCache(); + +const watchPath = path.join(process.cwd(), "public"); +chokidar.watch(watchPath, { ignoreInitial: true }).on("all", () => { + cache.clear(); +}); + +export { cache }; \ No newline at end of file