From dac2997cb17b72992d0357e6bd5fbc982ee3da9b Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Wed, 21 Feb 2018 15:31:41 +0000 Subject: [PATCH 1/2] fix(maxAge): delete cache entries older than max age. Fixes #14 --- index.js | 2 ++ test.js | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/index.js b/index.js index ad49270..42dc788 100644 --- a/index.js +++ b/index.js @@ -29,6 +29,8 @@ module.exports = (fn, opts) => { if (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) { return c.data; } + + cache.delete(key); } const ret = fn.apply(this, arguments); diff --git a/test.js b/test.js index d4b06d6..8d06060 100644 --- a/test.js +++ b/test.js @@ -40,6 +40,25 @@ test('maxAge option', async t => { t.is(memoized(1), 1); }); +test('maxAge option deletes old items', async t => { + let i = 0; + const f = () => i++; + const cache = new Map(); + const deleted = []; + cache.delete = item => deleted.push(item); + const memoized = m(f, {maxAge: 100, cache}); + t.is(memoized(1), 0); + t.is(memoized(1), 0); + t.is(cache.has(1), true); + await delay(50); + t.is(memoized(1), 0); + t.is(deleted.length, 0); + await delay(200); + t.is(memoized(1), 1); + t.is(deleted.length, 1); + t.is(deleted[0], 1); +}); + test('cacheKey option', t => { let i = 0; const f = () => i++; From 7b088beebabff2a1e7c4964cd9c1735e8683a162 Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Mon, 11 Jun 2018 12:32:42 +0100 Subject: [PATCH 2/2] test: ensure maxAge is still adhered to when memoizer function throws --- test.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test.js b/test.js index 8d06060..534e789 100644 --- a/test.js +++ b/test.js @@ -59,6 +59,26 @@ test('maxAge option deletes old items', async t => { t.is(deleted[0], 1); }); +test('maxAge items are deleted even if function throws', async t => { + let i = 0; + const f = () => { + if (i === 1) { + throw new Error('failure'); + } + return i++; + }; + const cache = new Map(); + const memoized = m(f, {maxAge: 100, cache}); + t.is(memoized(1), 0); + t.is(memoized(1), 0); + t.is(cache.size, 1); + await delay(50); + t.is(memoized(1), 0); + await delay(200); + t.throws(() => memoized(1), 'failure'); + t.is(cache.size, 0); +}); + test('cacheKey option', t => { let i = 0; const f = () => i++;