yjs/src/IndexdedDB.js
2015-06-17 19:16:52 +02:00

77 lines
2.2 KiB
JavaScript

var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
class Transaction {
constructor (transaction) {
this.transaction = transaction;
}
setOperation (op) {
return new Promise((resolve, reject)=> {
var req = this.transaction.objectStore("OperationBuffer").put(op);
req.onsuccess = function () {
resolve(op);
};
req.onerror = function () {
reject("Could not set Operation!");
};
});
}
getOperation (uid) {
return new Promise((resolve, reject)=>{
var req = this.transaction.objectStore("OperationBuffer").get(uid);
req.onsuccess = function () {
resolve(req.result);
};
req.onerror = function () {
reject("Could not get Operation");
};
});
}
}
class DB {
constructor (namespace : string) {
this.namespace = namespace;
this.ready = new Promise(function(yay, nay){
var req = indexedDB.open(namespace); //eslint-disable-line no-undef
req.onerror = function(){
nay("Couldn't open the IndexedDB database!");
};
req.onsuccess = function(event){
yay(event.target.result);
};
req.onupgradeneeded = function(event){
var db = event.target.result;
db.createObjectStore("OperationBuffer", {keyPath: "uid"});
db.createObjectStore("StateVector", {keyPath: "user"});
};
}).catch(function(message){
throw new Error(message);
});
}
requestTransaction (generator : Function) {
this.ready.then(function(){
var gen = generator(3);//new Transaction(db.transaction(["OperationBuffer", "StateVector"], "readwrite"))
gen.next();
});
}
}
return {
"DB": DB,
"Transaction": Transaction
};
})();
function requestTransaction(makeGen : Function){ //eslint-disable-line no-unused-vars
var gen = makeGen([1, 2, 3]);
function handle(result : Object){
if (result.done) {
return result.value;
}
return result.value.then(function(res){
return handle(gen.next(res));
}, function(err){
return handle(gen.throw(err));
});
}
return handle(gen.next());
}