@jacobmarshall/kv
Version:
A super simple key value store backed by IndexedDB
104 lines (96 loc) • 2.72 kB
JavaScript
(function() {
'use strict';
var DB_NAME = 'kv';
var STORE_NAME = 'kv';
var TRANS_RO = 'readonly';
var TRANS_RW = 'readwrite';
function kv(name) {
var db;
function getDB() {
if (!db) {
db = new Promise(function(resolve, reject) {
var openreq = indexedDB.open(name, 1);
openreq.onerror = function() {
reject(openreq.error);
};
openreq.onupgradeneeded = function() {
// First time setup: create an empty object store
openreq.result.createObjectStore(STORE_NAME);
};
openreq.onsuccess = function() {
resolve(openreq.result);
};
});
}
return db;
}
function withStore(type, callback) {
return getDB().then(function(db) {
return new Promise(function(resolve, reject) {
var transaction = db.transaction(STORE_NAME, type);
transaction.oncomplete = function() {
resolve();
};
transaction.onerror = function() {
reject(transaction.error);
};
callback(transaction.objectStore(STORE_NAME));
});
});
}
return {
get: function(key) {
var req;
return withStore(TRANS_RO, function(store) {
req = store.get(key);
}).then(function() {
return req.result;
});
},
set: function(key, value) {
return withStore(TRANS_RW, function(store) {
store.put(value, key);
});
},
remove: function(key) {
return withStore(TRANS_RW, function(store) {
store.delete(key);
});
},
clear: function() {
return withStore(TRANS_RW, function(store) {
store.clear();
});
},
keys: function() {
var keys = [];
return withStore(TRANS_RO, function(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(function() {
return keys;
});
}
};
}
var def = kv(DB_NAME);
for (var name in def) {
if (def.hasOwnProperty(name)) {
kv[name] = def[name];
}
}
if (typeof module != 'undefined' && module.exports) {
module.exports = kv;
} else if (typeof define === 'function' && define.amd) {
define('kv', [], function() {
return kv;
});
} else {
self.kv = kv;
}
})();