// https://github.com/jakearchibald/idb-keyval/blob/main/src/index.ts /* eslint-disable @typescript-eslint/ban-ts-comment */ export function promisifyRequest(request: IDBRequest | IDBTransaction): Promise { return new Promise((resolve, reject) => { // @ts-ignore - file size hacks request.oncomplete = request.onsuccess = () => resolve(request.result); // @ts-ignore - file size hacks request.onabort = request.onerror = () => { console.error(request.error); reject(request.error); }; }); } export function createStore(dbName: string, storeName: string): UseStore { const request = indexedDB.open(dbName); request.onupgradeneeded = () => request.result.createObjectStore(storeName); const dbp = promisifyRequest(request); return (txMode, callback) => dbp.then((db) => { const transaction = db.transaction(storeName, txMode); transaction.onerror = () => { console.error(transaction.error); }; const store = transaction.objectStore(storeName); return callback(store); }); } const defaultStore = () => createStore('auth-worker-store', 'keyval'); export type UseStore = ( txMode: IDBTransactionMode, callback: (store: IDBObjectStore) => T | PromiseLike ) => Promise; export function get(key: IDBValidKey): Promise { return defaultStore()('readonly', (store) => promisifyRequest(store.get(key))); } export async function set(key: IDBValidKey, value: string): Promise { return defaultStore()('readwrite', (store) => { store.put(value, key); return promisifyRequest(store.transaction); }); } export function delMany(keys: Array): Promise { return defaultStore()('readwrite', (store: IDBObjectStore) => { keys.forEach((key: IDBValidKey) => store.delete(key)); return promisifyRequest(store.transaction); }); } export function keys(): Promise> { return defaultStore()('readonly', (store) => { return promisifyRequest(store.getAllKeys() as unknown as IDBRequest>); }); }