@yoroi/common
Version:
The Common package of Yoroi SDK
109 lines (108 loc) • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mountAsyncStorage = exports.mountAsyncMultiStorage = void 0;
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
var _parsers = require("../../utils/parsers");
var _isFileKey = require("../helpers/is-file-key");
var _isFolderKey = require("../helpers/is-folder-key");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const mountAsyncStorage = ({
path
}) => {
const withPath = key => `${path}${key}`;
const withoutPath = value => value.slice(path.length);
async function getItem(key, parse = _parsers.parseSafe) {
const item = await _asyncStorage.default.getItem(withPath(key));
return parse(item);
}
async function multiGet(keys, parse = _parsers.parseSafe) {
const absolutePaths = keys.map(key => withPath(key));
const items = await _asyncStorage.default.multiGet(absolutePaths);
return items.map(([key, value]) => [withoutPath(key), parse(value)]);
}
return {
join: folderName => mountAsyncStorage({
path: `${path}${folderName}`
}),
getItem,
multiGet,
setItem: async (key, value, stringify = JSON.stringify) => {
const item = stringify(value);
await _asyncStorage.default.setItem(withPath(key), item);
},
multiSet: async (tuples, stringify = JSON.stringify) => {
const items = tuples.map(([key, value]) => [withPath(key), stringify(value)]);
await _asyncStorage.default.multiSet(items);
},
removeItem: async key => {
await _asyncStorage.default.removeItem(withPath(key));
},
removeFolder: async folderName => {
const keys = await _asyncStorage.default.getAllKeys();
const filteredKeys = keys.filter(key => key.startsWith(path) && withoutPath(key).startsWith(folderName) && (0, _isFolderKey.isFolderKey)({
key,
path
}));
await _asyncStorage.default.multiRemove(filteredKeys);
},
multiRemove: async keys => {
await _asyncStorage.default.multiRemove(keys.map(key => withPath(key)));
},
getAllKeys: () => {
return _asyncStorage.default.getAllKeys().then(keys => keys.filter(key => key.startsWith(path) && (0, _isFileKey.isFileKey)({
key,
path
}))).then(
// temporary any until async interface is migrated to receive keys for multi storage
filteredKeys => filteredKeys.map(withoutPath));
},
clear: async () => {
const keys = await _asyncStorage.default.getAllKeys();
const filteredKeys = keys.filter(key => key.startsWith(path));
await _asyncStorage.default.multiRemove(filteredKeys);
}
};
};
exports.mountAsyncStorage = mountAsyncStorage;
const mountAsyncMultiStorage = options => {
const {
storage,
dataFolder,
keyExtractor,
serializer = JSON.stringify,
deserializer = _parsers.parseSafe
} = options;
const dataStorage = storage.join(dataFolder);
const {
getAllKeys: getAllKeysStorage,
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 = () => getAllKeys().then(keysToRead => multiGet(keysToRead, deserializer));
const readMany = keysToRead => dataStorage.multiGet(keysToRead, deserializer);
const removeMany = keysToRead => dataStorage.multiRemove(keysToRead);
const getAllKeys = () => getAllKeysStorage().then(keys => keys);
return {
getAllKeys,
clear,
readAll,
saveMany,
readMany,
removeMany
};
};
exports.mountAsyncMultiStorage = mountAsyncMultiStorage;
//# sourceMappingURL=async-storage.js.map