import type { IStorageAdapter } from '@namiml/sdk-core'; type SQLiteRow = { value?: string; key?: string }; type SQLiteDatabase = { runSync(query: string, params?: unknown[]): void; getFirstSync(query: string, params?: unknown[]): SQLiteRow | null; getAllSync(query: string, params?: unknown[]): SQLiteRow[]; }; export class ExpoStorageAdapter implements IStorageAdapter { private db: SQLiteDatabase | null = null; private memoryFallback: Map | null = null; constructor() { try { const { openDatabaseSync } = require('expo-sqlite'); const database = openDatabaseSync('nami-sdk-storage') as SQLiteDatabase; database.runSync( 'CREATE TABLE IF NOT EXISTS kv (key TEXT PRIMARY KEY, value TEXT)' ); this.db = database; } catch { this.memoryFallback = new Map(); } } getItem(key: string): string | null { if (this.memoryFallback) return this.memoryFallback.get(key) ?? null; const database = this.db; if (!database) return null; try { const row = database.getFirstSync('SELECT value FROM kv WHERE key = ?', [key]); return row?.value ?? null; } catch { return null; } } setItem(key: string, value: string): void { if (this.memoryFallback) { this.memoryFallback.set(key, value); return; } const database = this.db; if (!database) return; try { database.runSync('INSERT OR REPLACE INTO kv (key, value) VALUES (?, ?)', [key, value]); } catch { /* silent */ } } removeItem(key: string): void { if (this.memoryFallback) { this.memoryFallback.delete(key); return; } const database = this.db; if (!database) return; try { database.runSync('DELETE FROM kv WHERE key = ?', [key]); } catch { /* silent */ } } clear(): void { if (this.memoryFallback) { this.memoryFallback.clear(); return; } const database = this.db; if (!database) return; try { database.runSync('DELETE FROM kv'); } catch { /* silent */ } } getAllKeys(): string[] { if (this.memoryFallback) return [...this.memoryFallback.keys()]; const database = this.db; if (!database) return []; try { const rows = database.getAllSync('SELECT key FROM kv'); return rows.map((row) => row.key).filter((key): key is string => typeof key === 'string'); } catch { return []; } } }