import { default as AsyncStorageRN } from "@react-native-async-storage/async-storage"; import { noop } from "lodash"; import { stringifyPairs } from "./utils"; import { tryJson } from "../base/utils"; export class StorageSDK { private readonly api: typeof AsyncStorageRN = AsyncStorageRN; async getAllKeys(): Promise { return this.api.getAllKeys(); } async removeItem(key: string): Promise { await this.api.removeItem(key); } async mergeItem(key: string, value: T): Promise { const stringified = JSON.stringify(value); await this.api.mergeItem(key, stringified); } async multiRemove(keys: string[]): Promise { await this.api.multiRemove(keys); } async multiMerge(keyValuePairs: [string, T][]): Promise { const stringifiedPairs = stringifyPairs(keyValuePairs); if (stringifiedPairs) { await this.api.multiMerge(stringifiedPairs); } } async clear(): Promise { await this.api.clear(); } flushGetRequests(): void { this.api.flushGetRequests(); } safeSet(key: string, value: T, onError?: (e: Error) => void): void { this.setItem(key, value).catch(onError || noop); } safeRemove(key: string, onError?: (e: Error) => void): void { this.api.removeItem(key).catch(onError || noop); } async setItem(key: string, value: T): Promise { const stringified = JSON.stringify(value); await this.api.setItem(key, stringified); } async getItem(key: string): Promise { const jsonValue = await this.api.getItem(key); return tryJson(jsonValue ?? "") as T; } async multiSet(keyValuePairs: [string, T][]): Promise { const stringifiedPairs = stringifyPairs(keyValuePairs); if (stringifiedPairs) { await this.api.multiSet(stringifiedPairs); } } async multiGet(keys: readonly string[]): Promise { const keyJsonValuePairs = await this.api.multiGet(keys); return keyJsonValuePairs.map(([key, jsonValue]) => [key, tryJson(jsonValue ?? "")]) as T; } } export const AsyncStorage = new StorageSDK();