From 01bf6891f66612b232bb07b58c0397b6144975ec Mon Sep 17 00:00:00 2001 From: Valters Jansons Date: Wed, 17 Jul 2019 05:01:41 +0300 Subject: [PATCH] Backport memory leak fixes Commit da4e4398cb27b602de3bd55f746efa9b4a31702b resolved memory leaking issues by introducing a dependency that was not compatible with Node.js v4 which mem v1 supported. This commit adds timers for ensuring the cache Map is cleaned up without using additional dependencies. Bug ref: sindresorhus/mem#14 --- index.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) 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(); } };