cache-common.esm.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // @todo Add logger on options to debug when caches go wrong.
  2. function createFallbackableCache(options) {
  3. const caches = [...options.caches];
  4. const current = caches.shift(); // eslint-disable-line functional/immutable-data
  5. if (current === undefined) {
  6. return createNullCache();
  7. }
  8. return {
  9. get(key, defaultValue, events = {
  10. miss: () => Promise.resolve(),
  11. }) {
  12. return current.get(key, defaultValue, events).catch(() => {
  13. return createFallbackableCache({ caches }).get(key, defaultValue, events);
  14. });
  15. },
  16. set(key, value) {
  17. return current.set(key, value).catch(() => {
  18. return createFallbackableCache({ caches }).set(key, value);
  19. });
  20. },
  21. delete(key) {
  22. return current.delete(key).catch(() => {
  23. return createFallbackableCache({ caches }).delete(key);
  24. });
  25. },
  26. clear() {
  27. return current.clear().catch(() => {
  28. return createFallbackableCache({ caches }).clear();
  29. });
  30. },
  31. };
  32. }
  33. function createNullCache() {
  34. return {
  35. get(_key, defaultValue, events = {
  36. miss: () => Promise.resolve(),
  37. }) {
  38. const value = defaultValue();
  39. return value
  40. .then(result => Promise.all([result, events.miss(result)]))
  41. .then(([result]) => result);
  42. },
  43. set(_key, value) {
  44. return Promise.resolve(value);
  45. },
  46. delete(_key) {
  47. return Promise.resolve();
  48. },
  49. clear() {
  50. return Promise.resolve();
  51. },
  52. };
  53. }
  54. export { createFallbackableCache, createNullCache };