38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||
|
|
||
|
function createInMemoryCache(options = { serializable: true }) {
|
||
|
// eslint-disable-next-line functional/no-let
|
||
|
let cache = {};
|
||
|
return {
|
||
|
get(key, defaultValue, events = {
|
||
|
miss: () => Promise.resolve(),
|
||
|
}) {
|
||
|
const keyAsString = JSON.stringify(key);
|
||
|
if (keyAsString in cache) {
|
||
|
return Promise.resolve(options.serializable ? JSON.parse(cache[keyAsString]) : cache[keyAsString]);
|
||
|
}
|
||
|
const promise = defaultValue();
|
||
|
const miss = (events && events.miss) || (() => Promise.resolve());
|
||
|
return promise.then((value) => miss(value)).then(() => promise);
|
||
|
},
|
||
|
set(key, value) {
|
||
|
// eslint-disable-next-line functional/immutable-data
|
||
|
cache[JSON.stringify(key)] = options.serializable ? JSON.stringify(value) : value;
|
||
|
return Promise.resolve(value);
|
||
|
},
|
||
|
delete(key) {
|
||
|
// eslint-disable-next-line functional/immutable-data
|
||
|
delete cache[JSON.stringify(key)];
|
||
|
return Promise.resolve();
|
||
|
},
|
||
|
clear() {
|
||
|
cache = {};
|
||
|
return Promise.resolve();
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
|
||
|
exports.createInMemoryCache = createInMemoryCache;
|