56 lines
1.0 KiB
JavaScript
56 lines
1.0 KiB
JavaScript
|
'use strict';
|
||
|
const mimicFn = require('mimic-fn');
|
||
|
|
||
|
const cacheStore = new WeakMap();
|
||
|
|
||
|
const defaultCacheKey = function (x) {
|
||
|
if (arguments.length === 1 && (x === null || x === undefined || (typeof x !== 'function' && typeof x !== 'object'))) {
|
||
|
return x;
|
||
|
}
|
||
|
|
||
|
return JSON.stringify(arguments);
|
||
|
};
|
||
|
|
||
|
module.exports = (fn, opts) => {
|
||
|
opts = Object.assign({
|
||
|
cacheKey: defaultCacheKey,
|
||
|
cache: new Map()
|
||
|
}, opts);
|
||
|
|
||
|
const memoized = function () {
|
||
|
const cache = cacheStore.get(memoized);
|
||
|
const key = opts.cacheKey.apply(null, arguments);
|
||
|
|
||
|
if (cache.has(key)) {
|
||
|
const c = cache.get(key);
|
||
|
|
||
|
if (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) {
|
||
|
return c.data;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const ret = fn.apply(null, arguments);
|
||
|
|
||
|
cache.set(key, {
|
||
|
data: ret,
|
||
|
maxAge: Date.now() + (opts.maxAge || 0)
|
||
|
});
|
||
|
|
||
|
return ret;
|
||
|
};
|
||
|
|
||
|
mimicFn(memoized, fn);
|
||
|
|
||
|
cacheStore.set(memoized, opts.cache);
|
||
|
|
||
|
return memoized;
|
||
|
};
|
||
|
|
||
|
module.exports.clear = fn => {
|
||
|
const cache = cacheStore.get(fn);
|
||
|
|
||
|
if (cache && typeof cache.clear === 'function') {
|
||
|
cache.clear();
|
||
|
}
|
||
|
};
|