import { deleteDB, IDBPDatabase, openDB } from "idb"; export interface KeyValueDatabase { get(key: string): Promise; set(key: string, value: T): Promise; del(key: string): Promise; clear(): Promise; keys(query?: IDBValidKey | IDBKeyRange, count?: number): Promise; close(): void; destroy(): void; } 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); }, }); let db: IDBPDatabase = null; db = await dbPromise; databaseCache[dbKey] = db; return { get(key: string): Promise { return db.get(storeKey, key); }, set(key: string, value: T) { return db.put(storeKey, value, key); }, del(key: string) { return db.delete(storeKey, key); }, clear() { return db.clear(storeKey); }, keys(query?: IDBValidKey | IDBKeyRange, count?: number) { return db.getAllKeys(storeKey, query, count); }, close() { delete databaseCache[dbKey]; return db.close(); }, async destroy() { delete databaseCache[dbKey]; db.close(); await deleteDB(dbKey); }, }; };