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