-
Notifications
You must be signed in to change notification settings - Fork 9
/
idb.js
114 lines (95 loc) · 2.89 KB
/
idb.js
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
107
108
109
110
111
112
113
114
(function() {
function promisifyRequest(obj) {
return new Promise(function(resolve, reject) {
function onsuccess(event) {
resolve(obj.result);
unlisten();
}
function onerror(event) {
reject(obj.error);
unlisten();
}
function unlisten() {
obj.removeEventListener('complete', onsuccess);
obj.removeEventListener('success', onsuccess);
obj.removeEventListener('error', onerror);
obj.removeEventListener('abort', onerror);
}
obj.addEventListener('complete', onsuccess);
obj.addEventListener('success', onsuccess);
obj.addEventListener('error', onerror);
obj.addEventListener('abort', onerror);
});
}
function IDBHelper(name, version, upgradeCallback) {
var request = indexedDB.open(name, version);
this.ready = promisifyRequest(request);
request.onupgradeneeded = function(event) {
upgradeCallback(request.result, event.oldVersion);
};
}
IDBHelper.supported = 'indexedDB' in self;
var IDBHelperProto = IDBHelper.prototype;
IDBHelperProto.transaction = function(stores, callback, opts) {
opts = opts || {};
return this.ready.then(function(db) {
var mode = opts.mode || 'readonly';
var tx = db.transaction(stores, mode);
var val = callback(tx, db);
var promise = promisifyRequest(tx);
var readPromise;
if (!val) {
return promise;
}
if (val[0] && 'result' in val[0]) {
readPromise = Promise.all(val.map(promisifyRequest));
}
else {
readPromise = promisifyRequest(val);
}
return promise.then(function() {
return readPromise;
});
});
};
IDBHelperProto.get = function(store, key) {
return this.transaction(store, function(tx) {
return tx.objectStore(store).get(key);
});
};
IDBHelperProto.put = function(store, key, value) {
return this.transaction(store, function(tx) {
tx.objectStore(store).put(value, key);
}, {
mode: 'readwrite'
});
};
IDBHelperProto.each = function(storeName, callback, opts) {
opts = opts || {};
return new Promise(function(resolve, reject) {
this.transaction(storeName, function(tx) {
var store = tx.objectStore(storeName);
var cursorRequest;
if (opts.indexName) {
cursorRequest = store.index(opts.indexName).openCursor();
}
else {
cursorRequest = store.openCursor();
}
cursorRequest.onsuccess = function() {
var cursor = cursorRequest.result;
if (!cursor) {
resolve();
return;
}
callback(cursor.value, cursor.key, cursor);
cursor.continue();
};
cursorRequest.onerror = function() {
reject(cursorRequest.error);
};
});
}.bind(this));
};
self.IDBHelper = IDBHelper;
}());