mirror of
https://github.com/imezx/Warp.git
synced 2025-04-25 15:40:02 +00:00
62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
|
'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;
|