Skip to content

devraj-labs/rn-storage-kit

Repository files navigation

RN Storage Kit

Unified storage for React Native. One interface — fast key-value, encrypted secrets, and structured logs.

npm version license react-native TypeScript


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

Installation

npm install @devraj-labs/rn-storage-kit

Peer dependencies

npm install react-native-mmkv react-native-keychain

Follow the native setup guides for both libraries:


Usage

MMKV storage

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();

Secure storage (Keychain)

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 setGenericPassword per key. A key index is maintained in a dedicated MMKV instance (rn-storage-kit.secure-index) so getAllKeys and clear work without Keychain enumeration support.


Logger

Production-safe structured logging for every storage operation. Disabled by default.

Enable

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

Disable

import { disableLogger } from '@devraj-labs/rn-storage-kit';

disableLogger();

Read and clear logs

import { getLogs, clearLogs } from '@devraj-labs/rn-storage-kit';

const entries = getLogs(); // TStorageLogEntry[]
clearLogs();

Subscribe to new entries

import { onNewLog, offNewLog } from '@devraj-labs/rn-storage-kit';

const handler = (entry) => console.log(entry);
onNewLog(handler);
// later:
offNewLog(handler);

Log levels

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 ***

Log entry shape

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

Persistence

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.


Production safety

  • Logger is a no-op in production unless allowInProduction: true is passed to enableLogger.
  • Secure adapter values are always logged as ***, regardless of log level.
  • At info level, value and result fields are stripped from all log entries.

API reference

MMKVStorageAdapter

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

SecureStorageAdapter

Same interface as MMKVStorageAdapter. Backed by Keychain via setGenericPassword / getGenericPassword per service key.

Logger

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

Project structure

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

License

MIT

About

A developer-friendly storage kit for React Native offering secure and non-secure storage options, cross-platform support, and a built-in debug UI for inspecting and managing data.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors