@yoroi/common
Version:
The Common package of Yoroi SDK
118 lines (117 loc) • 3.43 kB
JavaScript
;
import { MMKV } from 'react-native-mmkv';
import { parseSafe } from '../../utils/parsers';
import { isFileKey } from '../helpers/is-file-key';
import { isFolderKey } from '../helpers/is-folder-key';
export const mountMMKVStorage = ({
path,
id = 'default.mmkv'
}, {
instance
} = {}) => {
// think of the id as the filename and the path as filter
const storage = instance ?? new MMKV({
id
});
const withPath = key => `${path}${key}`;
const withoutPath = absolutePath => absolutePath.slice(path.length);
function join(folderToJoin) {
return mountMMKVStorage({
path: `${path}${folderToJoin}`,
id
}, {
instance: storage
});
}
function getItem(key, deserializer = parseSafe) {
const item = storage.getString(withPath(key)) ?? null;
return deserializer(item);
}
function multiGet(keys, deserializer = parseSafe) {
const absolutePaths = keys.map(key => withPath(key));
return Object.freeze(absolutePaths.map(key => [withoutPath(key), deserializer(storage.getString(key) ?? null)]));
}
function setItem(key, value, serializer = JSON.stringify) {
const item = serializer(value);
storage.set(withPath(key), item);
}
function multiSet(tuples, serializer = JSON.stringify) {
tuples.forEach(([key, value]) => storage.set(withPath(key), serializer(value)));
}
function removeItem(key) {
storage.delete(withPath(key));
}
function removeFolder(folderName) {
const keys = storage.getAllKeys();
const filteredKeys = keys.filter(key => key.startsWith(path) && withoutPath(key).startsWith(folderName) && isFolderKey({
key,
path
}));
filteredKeys.forEach(key => storage.delete(key));
}
function multiRemove(keys) {
const absolutePaths = keys.map(key => withPath(key));
absolutePaths.forEach(key => storage.delete(key));
}
function getAllKeys() {
return Object.freeze(storage.getAllKeys().filter(key => key.startsWith(path) && isFileKey({
key,
path
})).map(withoutPath));
}
function clear() {
const keys = storage.getAllKeys();
const filteredKeys = keys.filter(key => key.startsWith(path));
filteredKeys.forEach(key => storage.delete(key));
}
return {
join,
getItem,
multiGet,
setItem,
multiSet,
removeItem,
removeFolder,
multiRemove,
getAllKeys,
clear
};
};
export const mountMMKVMultiStorage = options => {
const {
storage,
dataFolder,
keyExtractor,
serializer = JSON.stringify,
deserializer = parseSafe
} = options;
const dataStorage = storage.join(dataFolder);
const {
getAllKeys,
multiSet,
multiGet
} = dataStorage;
const clear = () => storage.removeFolder(dataFolder);
const saveMany = items => {
const entries = items.map(item => {
if (typeof keyExtractor === 'function') {
return [keyExtractor(item), item];
}
return [String(item[keyExtractor]), item];
});
const entriesWithKeys = entries.filter(([key]) => key != null && key !== '');
return multiSet(entriesWithKeys, serializer);
};
const readAll = () => multiGet(getAllKeys(), deserializer);
const readMany = keys => multiGet(keys, deserializer);
const removeMany = keys => dataStorage.multiRemove(keys);
return {
getAllKeys,
clear,
readAll,
saveMany,
readMany,
removeMany
};
};
//# sourceMappingURL=mmkv-storage.js.map