Files
jellyfin-audio-player/src/utility/MigratedStorage.ts

51 lines
1.6 KiB
TypeScript
Raw Normal View History

import AsyncStorage from '@react-native-async-storage/async-storage';
import { DocumentDirectoryPath, exists, readFile, writeFile, unlink, mkdir } from 'react-native-fs';
import { Storage } from 'redux-persist';
const STORAGE_BASE_PATH = DocumentDirectoryPath + '/store/';
/** Retrieve the path of a store file for a given key */
function getFileByKey(key: string) {
return STORAGE_BASE_PATH + encodeURIComponent(key) + '.json';
}
/** Ensure that the store directory exists on the local filesystem */
async function ensureDirectoryExists() {
if (!(await exists(STORAGE_BASE_PATH))) {
await mkdir(STORAGE_BASE_PATH);
}
}
/**
* Migrates the Redux store from AsyncStorage to react-native-fs.
*/
const MigratedStorage: Storage = {
async getItem(key) {
const path = getFileByKey(key);
// GUARD: Check whether a store already exists on the filesystem
if (await exists(path)) {
// In which case, we'll read it from disk
return readFile(path);
} else {
// If not, attempt to read the previous store from AsyncStorage
const oldStore = await AsyncStorage.getItem(key);
// GUARD: If it exists, migrate it to a file on the filesystem
if (oldStore) {
await ensureDirectoryExists();
await writeFile(path, oldStore);
return oldStore;
}
}
},
removeItem(key) {
return unlink(getFileByKey(key));
},
async setItem(key, value) {
await ensureDirectoryExists();
return writeFile(getFileByKey(key), value);
},
};
export default MigratedStorage;