Files
notesnook/apps/mobile/src/utils/Storage.js
2020-10-13 17:02:14 +05:00

129 lines
2.6 KiB
JavaScript

import "react-native-get-random-values";
import {generateSecureRandom} from 'react-native-securerandom';
import Sodium from 'react-native-sodium';
import RNFetchBlob from 'rn-fetch-blob';
import {PERMISSIONS, requestMultiple, RESULTS} from "react-native-permissions";
import {MMKV} from "./MMKV";
async function read(key, isArray = false) {
let data;
try {
data = await MMKV.getItem(key);
} catch (e) {}
if (!data) return null;
try {
data = JSON.parse(data);
data = isArray ? [...data] : data;
} catch (e) {}
return data;
}
async function write(key, data) {
return await MMKV.setItem(
key,
typeof data === 'string' ? data : JSON.stringify(data),
);
}
async function readMulti(keys) {
if (keys.length <= 0) {
return [];
} else {
let data = await MMKV.getMultipleItemsAsync(keys.slice());
return data.map(([key, value]) => {
let obj;
try {
obj = JSON.parse(value);
} catch (e) {
obj = value;
}
return [key, obj];
});
}
}
async function remove(key) {
return await MMKV.removeItem(key);
}
async function clear() {
return await MMKV.clearStore();
}
function encrypt(password, data) {
return Sodium.encrypt(password, data).then((result) => result);
}
function decrypt(password, data) {
return Sodium.decrypt(password, data).then((result) => result);
}
async function deriveKey(password, salt) {
try {
let data = await Sodium.deriveKey(password, salt);
return data.key;
} catch (e) {}
}
async function getAllKeys() {
return await MMKV.indexer.getKeys();
}
async function getRandomBytes(length) {
return await generateSecureRandom(length);
}
async function requestPermission() {
let granted = false;
try {
const response = await requestMultiple([
PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,
PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,
]);
granted =
response['android.permission.READ_EXTERNAL_STORAGE'] ===
RESULTS.GRANTED &&
response['android.permission.WRITE_EXTERNAL_STORAGE'] === RESULTS.GRANTED;
} catch (err) {
}
return granted;
}
async function checkAndCreateDir(dir) {
try {
let exists = await RNFetchBlob.fs.exists(dir);
let isDir = await RNFetchBlob.fs.isDir(dir);
if (!exists || !isDir) {
await RNFetchBlob.fs.mkdir(dir);
}
} catch (e) {
console.log(e);
await RNFetchBlob.fs.mkdir(dir);
} finally {
}
return dir;
}
export default {
read,
write,
readMulti,
remove,
clear,
encrypt,
decrypt,
deriveKey,
getAllKeys,
getRandomBytes,
checkAndCreateDir,
requestPermission
};