1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // @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();
- },
- };
- }
- export { createFallbackableCache, createNullCache };
|