From cd6320aa625e98ce0fd591af376c23be3f2d21fa Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Wed, 20 Jun 2018 07:36:14 +0100 Subject: [PATCH] Delete cache entries older than max age (#16) --- index.js | 2 ++ test.js | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 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..534e789 100644 --- a/test.js +++ b/test.js @@ -40,6 +40,45 @@ 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('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++;