diff --git a/index.js b/index.js index a22d269..8522159 100644 --- a/index.js +++ b/index.js @@ -20,20 +20,30 @@ module.exports = (fn, opts) => { const memoized = function () { const cache = cacheStore.get(memoized); const key = opts.cacheKey.apply(null, arguments); // eslint-disable-line prefer-rest-params + const maxAgeDefined = typeof opts.maxAge === 'number'; if (cache.has(key)) { const c = cache.get(key); - if (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) { + if (Date.now() < c.maxAge) { return c.data; } + + if (typeof c.maxAgeTimeout !== 'undefined') { + clearTimeout(c.maxAgeTimeout); + } + + cache.delete(key); } const ret = fn.apply(null, arguments); // eslint-disable-line prefer-spread, prefer-rest-params cache.set(key, { data: ret, - maxAge: Date.now() + (opts.maxAge || 0) + maxAge: maxAgeDefined ? Date.now() + opts.maxAge : Infinity, + maxAgeTimeout: maxAgeDefined ? setTimeout(() => { + cache.delete(key); + }, opts.maxAge).unref() : undefined }); return ret; @@ -50,6 +60,12 @@ module.exports.clear = fn => { const cache = cacheStore.get(fn); if (cache && typeof cache.clear === 'function') { + cache.forEach(c => { + if (typeof c.maxAgeTimeout !== 'undefined') { + clearTimeout(c.maxAgeTimeout); + } + }); + cache.clear(); } };