'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); // @todo Add logger on options to debug when caches go wrong. function createFallbackableCache(options) { const caches = [...options.caches]; const current = caches.shift(); // eslint-disable-line functional/immutable-data if (current === undefined) { return createNullCache(); } return { get(key, defaultValue, events = { miss: () => Promise.resolve(), }) { return current.get(key, defaultValue, events).catch(() => { return createFallbackableCache({ caches }).get(key, defaultValue, events); }); }, set(key, value) { return current.set(key, value).catch(() => { return createFallbackableCache({ caches }).set(key, value); }); }, delete(key) { return current.delete(key).catch(() => { return createFallbackableCache({ caches }).delete(key); }); }, clear() { return current.clear().catch(() => { return createFallbackableCache({ caches }).clear(); }); }, }; } function createNullCache() { return { get(_key, defaultValue, events = { miss: () => Promise.resolve(), }) { const value = defaultValue(); return value .then(result => Promise.all([result, events.miss(result)])) .then(([result]) => result); }, set(_key, value) { return Promise.resolve(value); }, delete(_key) { return Promise.resolve(); }, clear() { return Promise.resolve(); }, }; } exports.createFallbackableCache = createFallbackableCache; exports.createNullCache = createNullCache;