cache-browser-local-storage.esm.js 2.0 KB

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