mirror of
https://github.com/imezx/Warp.git
synced 2025-04-24 23:20:02 +00:00
83 lines
3.2 KiB
JavaScript
83 lines
3.2 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
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) || '{}');
|
|
};
|
|
const setNamespace = (namespace) => {
|
|
getStorage().setItem(namespaceKey, JSON.stringify(namespace));
|
|
};
|
|
const removeOutdatedCacheItems = () => {
|
|
const timeToLive = options.timeToLive ? options.timeToLive * 1000 : null;
|
|
const namespace = getNamespace();
|
|
const filteredNamespaceWithoutOldFormattedCacheItems = Object.fromEntries(Object.entries(namespace).filter(([, cacheItem]) => {
|
|
return cacheItem.timestamp !== undefined;
|
|
}));
|
|
setNamespace(filteredNamespaceWithoutOldFormattedCacheItems);
|
|
if (!timeToLive)
|
|
return;
|
|
const filteredNamespaceWithoutExpiredItems = Object.fromEntries(Object.entries(filteredNamespaceWithoutOldFormattedCacheItems).filter(([, cacheItem]) => {
|
|
const currentTimestamp = new Date().getTime();
|
|
const isExpired = cacheItem.timestamp + timeToLive < currentTimestamp;
|
|
return !isExpired;
|
|
}));
|
|
setNamespace(filteredNamespaceWithoutExpiredItems);
|
|
};
|
|
return {
|
|
get(key, defaultValue, events = {
|
|
miss: () => Promise.resolve(),
|
|
}) {
|
|
return Promise.resolve()
|
|
.then(() => {
|
|
removeOutdatedCacheItems();
|
|
const keyAsString = JSON.stringify(key);
|
|
return getNamespace()[keyAsString];
|
|
})
|
|
.then(value => {
|
|
return Promise.all([value ? value.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)] = {
|
|
timestamp: new Date().getTime(),
|
|
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);
|
|
});
|
|
},
|
|
};
|
|
}
|
|
|
|
exports.createBrowserLocalStorageCache = createBrowserLocalStorageCache;
|