UNPKG

ngrx-store-persist

Version:

ngrx-store-persist depends on @ngrx/store and angular 2+

104 lines (88 loc) 3.18 kB
export class IndexedDBService { private db: IDBDatabase | null = null; private readonly DB_NAME = 'NGRX Storage'; private readonly STORE_NAME = 'keyvaluepairs'; async init(): Promise<void> { if (this.db) { return; } return new Promise((resolve, reject) => { const request = indexedDB.open(this.DB_NAME, 3); request.onerror = () => reject(request.error); request.onsuccess = () => { this.db = request.result; resolve(); }; request.onupgradeneeded = (event) => { const db = (event.target as IDBOpenDBRequest).result; if (!db.objectStoreNames.contains(this.STORE_NAME)) { db.createObjectStore(this.STORE_NAME); } }; }); } async getItem(key: string): Promise<any> { await this.init(); return new Promise((resolve, reject) => { if (!this.db) { reject(new Error('Database not initialized')); return; } const transaction = this.db.transaction(this.STORE_NAME, 'readonly'); const store = transaction.objectStore(this.STORE_NAME); const request = store.get(key); request.onerror = () => reject(request.error); request.onsuccess = () => { try { const value = request.result; resolve(value ? JSON.parse(value) : null); } catch { resolve(request.result); } }; }); } async setItem(key: string, value: any): Promise<void> { await this.init(); return new Promise((resolve, reject) => { if (!this.db) { reject(new Error('Database not initialized')); return; } const transaction = this.db.transaction(this.STORE_NAME, 'readwrite'); const store = transaction.objectStore(this.STORE_NAME); const serialized = typeof value === 'string' ? value : JSON.stringify(value); const request = store.put(serialized, key); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(); }); } async removeItem(key: string): Promise<void> { await this.init(); return new Promise((resolve, reject) => { if (!this.db) { reject(new Error('Database not initialized')); return; } const transaction = this.db.transaction(this.STORE_NAME, 'readwrite'); const store = transaction.objectStore(this.STORE_NAME); const request = store.delete(key); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(); }); } async keys(): Promise<string[]> { await this.init(); return new Promise((resolve, reject) => { if (!this.db) { reject(new Error('Database not initialized')); return; } const transaction = this.db.transaction(this.STORE_NAME, 'readonly'); const store = transaction.objectStore(this.STORE_NAME); const request = store.getAllKeys(); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(Array.from(request.result as string[])); }); } }