@stainless-code/persist
Version:
Hydration-aware persistence for any reactive store — zero-dep persistSource core; codecs, backends, cross-tab transport, source + framework hydration adapters ship as opt-in recipes
53 lines (52 loc) • 1.7 kB
JavaScript
import { n as createJSONStorage } from "../persist-core-B5VikEft.mjs";
import { createMMKV } from "react-native-mmkv";
//#region src/adapters/backends/mmkv.ts
/**
* `StateStorage` over a `react-native-mmkv` `MMKV` instance — synchronous,
* string-wire. Pass an instance from `createMMKV({ id, encryptionKey?, path? })`.
*
* @example
* ```ts
* import { createMMKV } from "react-native-mmkv";
* import { mmkvStateStorage } from "@stainless-code/persist/backends/mmkv";
*
* const instance = createMMKV({ id: "app-prefs" });
* const storage = mmkvStateStorage(instance);
* ```
*/
function mmkvStateStorage(instance) {
return {
getItem: (name) => instance.getString(name) ?? null,
setItem: (name, value) => {
instance.set(name, value);
},
removeItem: (name) => {
instance.remove(name);
}
};
}
/**
* Build a JSON-encoded `PersistStorage` over a fresh `react-native-mmkv`
* instance. Synchronous backend → hydration settles before first render →
* no `useHydrated` gate required (unlike IndexedDB / AsyncStorage). MMKV is
* the fastest RN KV store; pair `encryptionKey` for secrets-at-rest.
*
* @example
* ```ts
* import { createMmkvStorage } from "@stainless-code/persist/backends/mmkv";
* import { persistStore } from "@stainless-code/persist/sources/tanstack-store";
*
* const storage = createMmkvStorage<Prefs>({ id: "app-prefs" })!;
* persistStore(store, { name: "app:prefs:v1", storage });
* ```
*/
function createMmkvStorage(options) {
const instance = createMMKV({
id: options.id,
path: options.path,
encryptionKey: options.encryptionKey
});
return createJSONStorage(() => mmkvStateStorage(instance));
}
//#endregion
export { createMmkvStorage, mmkvStateStorage };