UNPKG

disk-memoizer

Version:

Simple disk memoization and in memory LRU cache for high latency IO responses

92 lines (76 loc) 2.71 kB
"use strict"; module.exports = gcTmpFiles; var config = require("./config"); var debug = require("debug")("disk-memoizer:gc"); var reltime = require("reltime"); var fs = require("fs"); var glob = require("glob"); var path = require("path"); var eachLimit = require("async/eachLimit"); var reduce = require("async/reduce"); var RE_TRAIL_SLASH = /\/$/; function gcTmpFiles() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$maxAge = _ref.maxAge, maxAge = _ref$maxAge === undefined ? config.GC_LAST_ACCESS : _ref$maxAge, _ref$interval = _ref.interval, interval = _ref$interval === undefined ? config.GC_INTERVAL : _ref$interval, _ref$cacheDir = _ref.cacheDir, cacheDir = _ref$cacheDir === undefined ? config.CACHE_DIR : _ref$cacheDir; if (config.GC) { debug("[info] Registering GC with options %j", { cacheDir: cacheDir, interval: interval, maxAge: maxAge }); runGc(); return setInterval(runGc, interval); } function runGc() { getFilesToDelete({ cacheDir: cacheDir, maxAge: maxAge }, function (err, filesToDelete) { if (err) { debug("[warning] gc getFilesToDelete failed with error: %s", err.message); return; } eachLimit(Object.keys(filesToDelete), 100, fs.unlink, function (err) { if (err) { // When there are no files to gc we might get an error from find debug("[warning] gc on %s failed with error: %s", cacheDir, err.message); } else { debug("[info] gc completed on %s: %j", cacheDir, filesToDelete); } debug("[info] next gc run for %s in %dms", cacheDir, interval); }); }); } } function getFilesToDelete(_ref2, callback) { var _ref2$maxAge = _ref2.maxAge, maxAge = _ref2$maxAge === undefined ? config.GC_LAST_ACCESS : _ref2$maxAge, _ref2$cacheDir = _ref2.cacheDir, cacheDir = _ref2$cacheDir === undefined ? config.CACHE_DIR : _ref2$cacheDir; var maxAgeDate = reltime.parse(new Date(), "-" + maxAge); glob(path.normalize(cacheDir.replace(RE_TRAIL_SLASH, "")) + "/**/*.cache", function (err, files) { if (err) { return callback(err); } reduce(files, {}, function (result, filepath, callback) { fs.stat(filepath, function (err, stat) { if (err) { return callback(err); } if (stat.atime.getTime() < maxAgeDate.getTime()) { result[filepath] = stat.atime; } callback(null, result); }); }, callback); }); } // Expose for unit testing if (process.env.NODE_ENV === "test") { module.exports.getFilesToDelete = getFilesToDelete; }