function createBrowserLocalStorageCache(options) { const namespaceKey = `algoliasearch-client-js-${options.key}`; // eslint-disable-next-line functional/no-let let storage; const getStorage = () => { if (storage === undefined) { storage = options.localStorage || window.localStorage; } return storage; }; const getNamespace = () => { return JSON.parse(getStorage().getItem(namespaceKey) || '{}'); }; return { get(key, defaultValue, events = { miss: () => Promise.resolve(), }) { return Promise.resolve() .then(() => { const keyAsString = JSON.stringify(key); const value = getNamespace()[keyAsString]; return Promise.all([value || defaultValue(), value !== undefined]); }) .then(([value, exists]) => { return Promise.all([value, exists || events.miss(value)]); }) .then(([value]) => value); }, set(key, value) { return Promise.resolve().then(() => { const namespace = getNamespace(); // eslint-disable-next-line functional/immutable-data namespace[JSON.stringify(key)] = value; getStorage().setItem(namespaceKey, JSON.stringify(namespace)); return value; }); }, delete(key) { return Promise.resolve().then(() => { const namespace = getNamespace(); // eslint-disable-next-line functional/immutable-data delete namespace[JSON.stringify(key)]; getStorage().setItem(namespaceKey, JSON.stringify(namespace)); }); }, clear() { return Promise.resolve().then(() => { getStorage().removeItem(namespaceKey); }); }, }; } export { createBrowserLocalStorageCache };