@device-router/storage
v1.0.1
Published
Storage adapters (memory, Redis) for persisting device profiles in DeviceRouter
Maintainers
Readme
@device-router/storage
Storage adapters for persisting device profiles in DeviceRouter. Ships with in-memory and Redis adapters.
Installation
pnpm add @device-router/storageFor Redis support:
pnpm add @device-router/storage ioredisUsage
In-memory (development)
Profiles are stored in a Map with automatic TTL expiration. Suitable for single-process development and testing.
import { MemoryStorageAdapter } from '@device-router/storage';
const storage = new MemoryStorageAdapter();Redis (production)
For multi-process and multi-server deployments. Uses Redis EX for TTL.
import { RedisStorageAdapter } from '@device-router/storage';
import Redis from 'ioredis';
const redis = new Redis();
const storage = new RedisStorageAdapter({
client: redis,
keyPrefix: 'dr:profile:', // default
});The client option accepts any object with get, set, del, exists, and keys methods matching the ioredis interface. This means you can use any Redis-compatible client.
The client may also provide an optional scan(cursor, ...args) method. When available, clear(), count(), and keys() use SCAN-based iteration instead of the blocking KEYS command. This is recommended for production to avoid blocking the Redis event loop on large datasets.
Custom adapter
Implement the StorageAdapter interface:
import type { StorageAdapter } from '@device-router/storage';
import type { DeviceProfile } from '@device-router/types';
class MyAdapter implements StorageAdapter {
async get(sessionToken: string): Promise<DeviceProfile | null> {
/* ... */
}
async set(sessionToken: string, profile: DeviceProfile, ttlSeconds: number): Promise<void> {
/* ... */
}
async delete(sessionToken: string): Promise<void> {
/* ... */
}
async exists(sessionToken: string): Promise<boolean> {
/* ... */
}
async clear(): Promise<void> {
/* ... */
}
async count(): Promise<number> {
/* ... */
}
async keys(): Promise<string[]> {
/* ... */
}
}API
StorageAdapter interface
| Method | Signature | Description |
| -------- | ------------------------------------------------------------------------------ | ------------------------- |
| get | (sessionToken: string) => Promise<DeviceProfile \| null> | Retrieve a profile |
| set | (sessionToken: string, profile: DeviceProfile, ttl: number) => Promise<void> | Store with TTL (seconds) |
| delete | (sessionToken: string) => Promise<void> | Remove a profile |
| exists | (sessionToken: string) => Promise<boolean> | Check if a profile exists |
| clear | () => Promise<void> | Remove all entries |
| count | () => Promise<number> | Count stored profiles |
| keys | () => Promise<string[]> | List session tokens |
MemoryStorageAdapter
Implements StorageAdapter plus:
clear()— Remove all entries and cancel timerscount()— Count stored profileskeys()— List session tokens
RedisStorageAdapter
Constructor options:
| Option | Type | Default | Description |
| ----------- | -------- | --------------- | -------------------------- |
| client | object | (required) | Redis-compatible client |
| keyPrefix | string | 'dr:profile:' | Key prefix for all entries |
License
MIT
