import { ICacheBackend } from '../types'; export class IndexedDBCache implements ICacheBackend { db: IDBDatabase = null as any; constructor( private dbName: string, private storeName: string = 'dataWithCacheStore' ) { const idb = indexedDB.open(dbName, 1); idb.onupgradeneeded = () => { idb.result.createObjectStore(storeName); }; idb.onsuccess = () => { this.db = idb.result; }; } async get(objectType: string, objectId: string): Promise { return new Promise((resolve, reject) => { const tx = this.db.transaction(this.storeName, 'readonly'); const store = tx.objectStore(this.storeName); const req = store.get(this.getKey(objectType, objectId)); req.onsuccess = () => { resolve(req.result || null); }; req.onerror = (err) => { reject(req.error); }; }); } async set(objectType: string, objectId: string, data: any): Promise { return new Promise((resolve, reject) => { const tx = this.db.transaction(this.storeName, 'readwrite'); const store = tx.objectStore(this.storeName); const req = store.put(data, this.getKey(objectType, objectId)); req.onsuccess = () => { resolve(); }; req.onerror = (err) => { reject(req.error); }; }); } private getKey(objectType: string, objectId: string) { return objectType + '__' + objectId; } }