UNPKG

@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
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 };