-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathJAXDiskDB.js
More file actions
106 lines (102 loc) · 3.06 KB
/
JAXDiskDB.js
File metadata and controls
106 lines (102 loc) · 3.06 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
class JAXDiskSysStore {
constructor() {
let dbName,storeName;
dbName="CokeCodes";
storeName="System";
this.storeName = storeName;
this._dbp = new Promise((resolve, reject) => {
const openreq = indexedDB.open(dbName, 1);
openreq.onerror = () => reject(openreq.error);
openreq.onsuccess = () => resolve(openreq.result);
// First time setup: create an empty object store
openreq.onupgradeneeded = () => {
openreq.result.createObjectStore(storeName);
};
});
}
_withIDBStore(type, callback) {
return this._dbp.then(db => new Promise((resolve, reject) => {
const transaction = db.transaction(this.storeName, type);
transaction.oncomplete = () => resolve();
transaction.onabort = transaction.onerror = () => reject(transaction.error);
callback(transaction.objectStore(this.storeName));
}));
}
}
let sysStore=null;
class JAXDiskStore {
constructor(diskName, storeName = null) {
let dbName;
dbName="Disk_"+diskName;
storeName=storeName||diskName;
if(storeName!==diskName && storeName!=="info" && storeName!=="base"){
throw Error("JAXDiskStore: Store name error: "+storeName);
}
this.storeName = storeName;
this._dbp = new Promise((resolve, reject) => {
const openreq = indexedDB.open(dbName, 1);
openreq.onerror = () => reject(openreq.error);
openreq.onsuccess = () => resolve(openreq.result);
// First time setup: create an empty object store
openreq.onupgradeneeded = () => {
openreq.result.createObjectStore(diskName);
openreq.result.createObjectStore("info");
openreq.result.createObjectStore("base");
};
});
}
_withIDBStore(type, callback) {
return this._dbp.then(db => new Promise((resolve, reject) => {
const transaction = db.transaction(this.storeName, type);
transaction.oncomplete = () => resolve();
transaction.onabort = transaction.onerror = () => reject(transaction.error);
callback(transaction.objectStore(this.storeName));
}));
}
static systemStore(){
if(sysStore){
return sysStore;
}
sysStore=new JAXDiskSysStore();
return sysStore;
}
}
function get(key, store) {
let req;
return store._withIDBStore('readonly', store => {
req = store.get(key);
}).then(() => req.result);
}
function set(key, value, store) {
return store._withIDBStore('readwrite', store => {
store.put(value, key);
});
}
function del(key, store) {
return store._withIDBStore('readwrite', store => {
store.delete(key);
});
}
function clear(store) {
return store._withIDBStore('readwrite', store => {
store.clear();
});
}
function keys(store) {
const keys = [];
return store._withIDBStore('readonly', store => {
// This would be store.getAllKeys(), but it isn't supported by Edge or Safari.
// And openKeyCursor isn't supported by Safari.
(store.openKeyCursor || store.openCursor).call(store).onsuccess = function () {
if (!this.result)
return;
keys.push(this.result.key);
this.result.continue();
};
}).then(() => keys);
}
function drop(databaseName){
indexedDB.deleteDatabase(databaseName);
}
export default JAXDiskStore;
export { JAXDiskStore, get, set, del, clear, keys, drop };