express-cache-file
Version:
Express middleware to cache static files in server memory
66 lines (65 loc) • 2.19 kB
JavaScript
;
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;