Path: blob/main/core/injected-scripts/indexedDbRestore.ts
1028 views
import type { IIndexedDB } from '@secret-agent/interfaces/IIndexedDB';12async function restoreIndexedDb(restoreDBs: IIndexedDB[]) {3if (!restoreDBs || !restoreDBs.length) return;45for (const restoreDB of restoreDBs) {6await new Promise<void>((resolve, reject) => {7const openDBRequest = indexedDB.open(restoreDB.name, restoreDB.version);8// only run changes when the db doesn't already exist9openDBRequest.onupgradeneeded = event => {10const request = event.target as IDBRequest<IDBDatabase>;11const db = request.result;12for (const objectStoreToRestore of restoreDB.objectStores) {13const objectStore = db.createObjectStore(objectStoreToRestore.name, {14autoIncrement: objectStoreToRestore.autoIncrement,15keyPath: objectStoreToRestore.keyPath,16});1718for (const restoreIndex of objectStoreToRestore.indexes) {19objectStore.createIndex(restoreIndex.name, restoreIndex.keyPath, {20multiEntry: restoreIndex.multiEntry,21unique: restoreIndex.unique,22});23}24}25};26openDBRequest.onsuccess = async event => {27const request = event.target as IDBRequest<IDBDatabase>;28try {29await restoreData(request.result, restoreDB);30resolve();31} catch (err) {32reject(err);33}34};35openDBRequest.onerror = reject;36});37}38}3940async function restoreData(db: IDBDatabase, restoreDB: IIndexedDB) {41for (const objectStoreToRestore of restoreDB.objectStores) {42const data = restoreDB.data[objectStoreToRestore.name];43if (!data || !data.length) continue;44const insertStore = db45.transaction(objectStoreToRestore.name, 'readwrite')46.objectStore(objectStoreToRestore.name);47for (const record of data) {48const { key, value } = TypeSerializer.parse(record);49insertStore.add(value, key);50}51await new Promise((resolve, reject) => {52insertStore.transaction.oncomplete = resolve;53insertStore.transaction.onerror = reject;54});55}56}5758// @ts-ignore59window.restoreUserStorage = restoreIndexedDb;606162