import { deleteDB, type IDBPDatabase, openDB } from "idb"; export interface KeyValueDatabase { get(key: IDBValidKey): Promise; set(key: IDBValidKey, value: T): Promise; del(key: IDBValidKey): Promise; clear(): Promise; keys(query?: IDBValidKey | IDBKeyRange, count?: number): Promise; close(): void; destroy(): Promise; } const databaseCache: { [key: string]: IDBPDatabase } = {}; export const OpenKeyValueDatabase = async (dbKey: string): Promise => { if (dbKey in databaseCache) { databaseCache[dbKey].close(); delete databaseCache[dbKey]; } const storeKey = dbKey; const dbPromise = openDB(dbKey, 1, { upgrade(db) { db.createObjectStore(storeKey); }, }); const db = await dbPromise; databaseCache[dbKey] = db; return { async get(key: IDBValidKey): Promise { return await db.get(storeKey, key); }, async set(key: IDBValidKey, value: T) { return await db.put(storeKey, value, key); }, async del(key: IDBValidKey) { return await db.delete(storeKey, key); }, async clear() { return await db.clear(storeKey); }, async keys(query?: IDBValidKey | IDBKeyRange, count?: number) { return await db.getAllKeys(storeKey, query, count); }, close() { delete databaseCache[dbKey]; return db.close(); }, async destroy() { delete databaseCache[dbKey]; db.close(); await deleteDB(dbKey); }, }; };