import { StorageAdapter } from "./types"; export class IndexedDBAdapter implements StorageAdapter { private dbName: string; private storeName: string; private version: number; constructor(dbName: string, storeName: string, version = 1) { this.dbName = dbName; this.storeName = storeName; this.version = version; } private async getDB(): Promise { return new Promise((resolve, reject) => { const request = indexedDB.open(this.dbName, this.version); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(request.result); request.onupgradeneeded = (event) => { const db = (event.target as IDBOpenDBRequest).result; if (!db.objectStoreNames.contains(this.storeName)) { db.createObjectStore(this.storeName, { keyPath: "id" }); } }; }); } async get(key: string): Promise { const db = await this.getDB(); const transaction = db.transaction([this.storeName], "readonly"); const store = transaction.objectStore(this.storeName); return new Promise((resolve, reject) => { const request = store.get(key); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(request.result || null); }); } async set(key: string, value: T): Promise { const db = await this.getDB(); const transaction = db.transaction([this.storeName], "readwrite"); const store = transaction.objectStore(this.storeName); return new Promise((resolve, reject) => { const request = store.put({ id: key, ...value }); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(); }); } async remove(key: string): Promise { const db = await this.getDB(); const transaction = db.transaction([this.storeName], "readwrite"); const store = transaction.objectStore(this.storeName); return new Promise((resolve, reject) => { const request = store.delete(key); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(); }); } async list(): Promise { const db = await this.getDB(); const transaction = db.transaction([this.storeName], "readonly"); const store = transaction.objectStore(this.storeName); return new Promise((resolve, reject) => { const request = store.getAllKeys(); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(request.result as string[]); }); } async clear(): Promise { const db = await this.getDB(); const transaction = db.transaction([this.storeName], "readwrite"); const store = transaction.objectStore(this.storeName); return new Promise((resolve, reject) => { const request = store.clear(); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(); }); } }