Repository navigation
Expand file tree
/
Copy pathlocal-store.js
More file actions
33 lines (33 loc) · 1.46 KB
/
Copy pathlocal-store.js
File metadata and controls
33 lines (33 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'use strict';
/* IndexedDB stores the complete workbench on this browser profile's local disk. */
(function (global) {
let database;
async function open() {
if (database) return database;
database = new Promise((resolve, reject) => {
const request = indexedDB.open('interceptor-workspace', 1);
request.onupgradeneeded = () => request.result.createObjectStore('workspaces');
request.onsuccess = () => resolve(request.result);
request.onerror = () => { database = null; reject(request.error); };
});
return database;
}
async function transaction(mode, operation) {
const db = await open();
return new Promise((resolve, reject) => {
const tx = db.transaction('workspaces', mode);
const request = operation(tx.objectStore('workspaces'));
tx.oncomplete = () => resolve(request.result);
tx.onerror = () => reject(tx.error);
tx.onabort = () => reject(tx.error || new Error('Local save cancelled.'));
});
}
const api = {
read: () => transaction('readonly', (store) => store.get('current')),
write: (snapshot) => transaction('readwrite', (store) => store.put(snapshot, 'current')),
preserve: (snapshot) => transaction('readwrite', (store) => store.put(snapshot, 'before-restore')),
previous: () => transaction('readonly', (store) => store.get('before-restore')),
clear: () => transaction('readwrite', (store) => store.delete('current')),
};
global.LocalStore = api;
})(globalThis);