Unified storage for React Native. One interface — fast key-value, encrypted secrets, and structured logs.
rn-storage-kit gives you three batteries-included storage primitives behind a single, consistent async get/set/remove/clear interface:
| Primitive | Backed by | Use for |
|---|---|---|
MMKVStorageAdapter |
react-native-mmkv | Preferences, cache, state |
SecureStorageAdapter |
react-native-keychain | Tokens, passwords, secrets |
| Logger | MMKV-persisted, TTL-aware | Debug traces, production safety |
npm install @devraj-labs/rn-storage-kitnpm install react-native-mmkv react-native-keychainFollow the native setup guides for both libraries:
Fast, synchronous storage wrapped in a promise-based interface.
import { MMKVStorageAdapter } from '@devraj-labs/rn-storage-kit';
const storage = new MMKVStorageAdapter();
// optionally scope to a named MMKV instance:
const storage = new MMKVStorageAdapter('my-app.settings');
await storage.set('theme', 'dark');
const theme = await storage.get('theme'); // 'dark'
await storage.remove('theme');
await storage.clear();
const keys = await storage.getAllKeys();Identical interface — swap the adapter, get hardware-backed encryption.
import { SecureStorageAdapter } from '@devraj-labs/rn-storage-kit';
const secure = new SecureStorageAdapter();
await secure.set('auth_token', 'eyJ...');
const token = await secure.get('auth_token');
await secure.remove('auth_token');
await secure.clear();
const keys = await secure.getAllKeys();Secure values are stored in Keychain via
setGenericPasswordper key. A key index is maintained in a dedicated MMKV instance (rn-storage-kit.secure-index) sogetAllKeysandclearwork without Keychain enumeration support.
Production-safe structured logging for every storage operation. Disabled by default.
Call once at app startup, before any storage operations:
import { enableLogger } from '@devraj-labs/rn-storage-kit';
enableLogger({
level: 'debug', // 'none' | 'error' | 'info' | 'debug'
maxEntries: 200, // FIFO cap (default: 200)
ttl: 0, // auto-evict entries older than N ms (0 = off)
allowInProduction: false, // never logs in prod unless explicitly set
});import { disableLogger } from '@devraj-labs/rn-storage-kit';
disableLogger();import { getLogs, clearLogs } from '@devraj-labs/rn-storage-kit';
const entries = getLogs(); // TStorageLogEntry[]
clearLogs();import { onNewLog, offNewLog } from '@devraj-labs/rn-storage-kit';
const handler = (entry) => console.log(entry);
onNewLog(handler);
// later:
offNewLog(handler);| Level | What is recorded |
|---|---|
none |
Nothing |
error |
Failed operations only |
info |
All operations — key and adapter visible, values/results stripped |
debug |
Full detail — key, value, result, duration. Secure values are always masked as *** |
type TStorageLogEntry = {
id: string;
timestamp: number;
adapter: 'mmkv' | 'secure';
operation: 'set' | 'get' | 'remove' | 'clear' | 'getAllKeys';
key?: string;
value?: string; // '***' for secure ops; absent at info level
result?: string | null;
error?: string;
durationMs: number;
secure: boolean;
};Logs survive Metro fast-refresh via a dedicated MMKV instance (rn-storage-kit.logs). Writes are async via setImmediate — zero impact on storage call performance. Secure values never reach the log store.
- Logger is a no-op in production unless
allowInProduction: trueis passed toenableLogger. - Secure adapter values are always logged as
***, regardless of log level. - At
infolevel,valueandresultfields are stripped from all log entries.
| Method | Signature | Description |
|---|---|---|
constructor |
(id?: string) |
Custom MMKV instance ID. Default: 'rn-storage-kit.default' |
get |
(key: string) => Promise<string | null> |
Returns value or null |
set |
(key: string, value: string) => Promise<void> |
Stores a string value |
remove |
(key: string) => Promise<void> |
Deletes a key |
clear |
() => Promise<void> |
Clears the entire MMKV instance |
getAllKeys |
() => Promise<string[]> |
Returns all stored keys |
Same interface as MMKVStorageAdapter. Backed by Keychain via setGenericPassword / getGenericPassword per service key.
| Export | Signature | Description |
|---|---|---|
enableLogger |
(options?: TLoggerOptions) => void |
Activates logging |
disableLogger |
() => void |
Deactivates logging |
getLogs |
() => TStorageLogEntry[] |
Returns a copy of all current entries |
clearLogs |
() => void |
Clears entries from memory and MMKV |
onNewLog |
(cb: TLogListener) => void |
Subscribe to new entries |
offNewLog |
(cb: TLogListener) => void |
Unsubscribe |
src/
mmkv-storage/ MMKVStorageAdapter + TStorageAdapter type
secure-storage/ SecureStorageAdapter (Keychain-backed)
logger/ Logger state, enableLogger, log levels, MMKV persistence
types/ Shared type definitions
index.ts Public barrel
MIT