cache-browser-local-storage.cjs.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. function createBrowserLocalStorageCache(options) {
  4. const namespaceKey = `algoliasearch-client-js-${options.key}`;
  5. // eslint-disable-next-line functional/no-let
  6. let storage;
  7. const getStorage = () => {
  8. if (storage === undefined) {
  9. storage = options.localStorage || window.localStorage;
  10. }
  11. return storage;
  12. };
  13. const getNamespace = () => {
  14. return JSON.parse(getStorage().getItem(namespaceKey) || '{}');
  15. };
  16. return {
  17. get(key, defaultValue, events = {
  18. miss: () => Promise.resolve(),
  19. }) {
  20. return Promise.resolve()
  21. .then(() => {
  22. const keyAsString = JSON.stringify(key);
  23. const value = getNamespace()[keyAsString];
  24. return Promise.all([value || defaultValue(), value !== undefined]);
  25. })
  26. .then(([value, exists]) => {
  27. return Promise.all([value, exists || events.miss(value)]);
  28. })
  29. .then(([value]) => value);
  30. },
  31. set(key, value) {
  32. return Promise.resolve().then(() => {
  33. const namespace = getNamespace();
  34. // eslint-disable-next-line functional/immutable-data
  35. namespace[JSON.stringify(key)] = value;
  36. getStorage().setItem(namespaceKey, JSON.stringify(namespace));
  37. return value;
  38. });
  39. },
  40. delete(key) {
  41. return Promise.resolve().then(() => {
  42. const namespace = getNamespace();
  43. // eslint-disable-next-line functional/immutable-data
  44. delete namespace[JSON.stringify(key)];
  45. getStorage().setItem(namespaceKey, JSON.stringify(namespace));
  46. });
  47. },
  48. clear() {
  49. return Promise.resolve().then(() => {
  50. getStorage().removeItem(namespaceKey);
  51. });
  52. },
  53. };
  54. }
  55. exports.createBrowserLocalStorageCache = createBrowserLocalStorageCache;