@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
51 lines (50 loc) • 2.1 kB
JavaScript
import { n as createJSONStorage } from "../persist-core-B5VikEft.mjs";
import * as SecureStore from "expo-secure-store";
//#region src/adapters/backends/secure-store.ts
const sanitizeKey = (name) => name.replace(/[^\w.-]/g, "_");
/**
* `StateStorage` over `expo-secure-store` — fully async, string-wire, backed
* by the platform keychain/keystore. Values are encrypted at rest by the OS.
*
* **~2KB value limit per key** (platform-imposed) — use this for small secrets
* (auth tokens, short prefs), not large state. Oversized writes reject; pair
* `partialize` to persist only a small slice.
*
* SecureStore keys must match `/^[\w.-]+$/`. Persist names using colons (e.g.
* `auth:token:v1`) are sanitized — characters outside that set become `_` — so
* colon-style names round-trip consistently across get/set/remove.
*
* @example
* ```ts
* import { secureStoreStateStorage } from "@stainless-code/persist/backends/secure-store";
*
* const storage = secureStoreStateStorage();
* ```
*/
function secureStoreStateStorage() {
return {
getItem: (name) => SecureStore.getItemAsync(sanitizeKey(name)),
setItem: (name, value) => SecureStore.setItemAsync(sanitizeKey(name), value),
removeItem: (name) => SecureStore.deleteItemAsync(sanitizeKey(name))
};
}
/**
* Build a JSON-encoded `PersistStorage` over `expo-secure-store`. Async backend
* → `useHydrated` gating is mandatory. **~2KB value limit per key** — keep
* persisted state small; use `partialize` to project a tiny slice (e.g. an auth
* token) and a different backend (IndexedDB, MMKV) for larger state.
*
* @example
* ```ts
* import { createSecureStoreStorage } from "@stainless-code/persist/backends/secure-store";
* import { persistStore } from "@stainless-code/persist/sources/tanstack-store";
*
* const storage = createSecureStoreStorage<AuthToken>()!;
* persistStore(store, { name: "auth:token:v1", storage, partialize: (s) => s.token });
* ```
*/
function createSecureStoreStorage() {
return createJSONStorage(() => secureStoreStateStorage());
}
//#endregion
export { createSecureStoreStorage, secureStoreStateStorage };