-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstorage.js
More file actions
75 lines (67 loc) · 2.5 KB
/
Copy pathstorage.js
File metadata and controls
75 lines (67 loc) · 2.5 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const DB_NAME = 'VirtualFS';
const STORE_NAME = 'files';
export const openDB = () => {
return new Promise((resolve, reject) => {
const request = indexedDB.open(DB_NAME, 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore(STORE_NAME, { keyPath: 'path' });
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
};
export const saveFile = async (path, content) => {
const db = await openDB();
const tx = db.transaction(STORE_NAME, 'readwrite');
const store = tx.objectStore(STORE_NAME);
store.put({ path, content });
return tx.complete;
};
export const loadFile = async (path) => {
const db = await openDB();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, 'readonly');
const store = tx.objectStore(STORE_NAME);
const request = store.get(path);
request.onsuccess = () => resolve(request.result ? request.result.content : null);
request.onerror = () => reject(request.error);
});
};
export const deleteFile = async (path) => {
const db = await openDB();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, 'readwrite');
const store = tx.objectStore(STORE_NAME);
const request = store.delete(path);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
};
export const loadAllFiles = async () => {
const db = await openDB();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, 'readonly');
const store = tx.objectStore(STORE_NAME);
const request = store.getAll();
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
};
export const clearIDB = async () => {
return new Promise((resolve, reject) => {
const req = indexedDB.databases ? indexedDB.databases() : Promise.resolve([]);
req.then((dbs) => {
const deletions = dbs.map(dbInfo => {
return new Promise((res, rej) => {
const delReq = indexedDB.deleteDatabase(dbInfo.name);
delReq.onsuccess = () => res();
delReq.onerror = () => rej(delReq.error);
delReq.onblocked = () => rej(new Error('Delete blocked'));
});
});
return Promise.all(deletions);
}).then(() => resolve())
.catch(reject);
});
}