UNPKG

express-cache-file

Version:

Express middleware to cache static files in server memory

66 lines (65 loc) 2.19 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const interval_1 = __importDefault(require("./interval")); function getCacheFile(getFile, cache, options) { const expire = (0, interval_1.default)(options.expire); const mode = options.mode || 'cache_first'; return (file, cb) => { const item = cache.files[file]; if (item) { if (!item.expire || item.expire > Date.now()) { cb(null, item); return; } if (mode === 'cache_first') { cb(null, item); } removeFromCache(cache, file, item); } getFile(file, (err, content) => { if (!err) { if (expire >= 0) { content.expire = Date.now() + expire; } saveToCache(cache, file, content); // TODO auto remove other files when cache is too large } if (!item || mode !== 'cache_first') { cb(err, content); } }); }; } function removeFromCache(cache, file, item = cache.files[file]) { delete cache.files[file]; if (item) { cache.usedSize -= item.buffer.byteLength; } } function saveToCache(cache, file, content) { removeFromCache(cache, file); if (checkCacheSize(cache, content.buffer.byteLength)) { cache.files[file] = content; cache.usedSize += content.buffer.byteLength; } } function checkCacheSize(cache, sizeNeeded) { if (!cache.capacity) return true; if (cache.capacity >= cache.usedSize + sizeNeeded) { return true; } const entries = Object.entries(cache.files); for (let i = 0; i < entries.length; i++) { if (cache.capacity >= cache.usedSize + sizeNeeded) { return true; } let entry = entries[i]; removeFromCache(cache, entry[0], entry[1]); } return cache.capacity >= cache.usedSize + sizeNeeded; } exports.default = getCacheFile;