54 lines
2 KiB
JavaScript
54 lines
2 KiB
JavaScript
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 };
|