added lots of magic

This commit is contained in:
Kevin Jahns 2015-06-09 22:30:42 +02:00
parent c3ba8173d7
commit 1b63f5efde
11 changed files with 46370 additions and 2518 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -137,13 +137,13 @@ module.exports = {
/* /*
* Broadcast a message to all connected peers. * Broadcast a message to all connected peers.
* @param message {Object} The message to broadcast. * @param message {Object} The message to broadcast.
# *
broadcast: (message)-> broadcast: (message)->
throw new Error "You must implement broadcast!" throw new Error "You must implement broadcast!"
# *
* Send a message to a peer, or set of peers * Send a message to a peer, or set of peers
# *
send: (peer_s, message)-> send: (peer_s, message)->
throw new Error "You must implement send!" throw new Error "You must implement send!"
*/ */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

32404
build/test/xml-test.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,48 +1,172 @@
class Buffer class DBTransaction
constructor: (@buffer)-> constructor: (@t)->
set: (op)->
setOperation: (op)->
that = this that = this
new Promise (resolve, reject)=> new Promise (resolve, reject)->
request = that.buffer.put op req = that.t.objectStore("HistoryBuffer").put op
request.onsuccess = (event)-> req.onsuccess = (event)->
resolve op resolve op
request.onerror = (event)-> req.onerror = (event)->
reject "Could not set value!" reject "Could not set Operation!"
get: (uid)-> getOperation: (uid)->
that = this that = this
new Promise (resolve, reject)=> new Promise (resolve, reject)->
request = that.buffer.get uid req = that.t.objectStore("HistoryBuffer").get uid
request.onsuccess = (event)-> req.onsuccess = (event)->
resolve request.result resolve req.result
request.onerror = (event)-> req.onerror = (event)->
reject "Could not set value!" reject "Could not get Operation!"
class window.HB getOperations: (state_map)->
flow = Promise.resolve()
ops = []
that = this
hb = that.t.objectStore("HistoryBuffer")
that.getStateVector().then (end_state_vector)->
for end_state of end_state_vector
# convert to the db-structure
do (end_state = end_state)->
start_state =
user: end_state.name
state: state_map[end_state] ? 0
flow = flow.then ()->
from = [start_state.user, start_state.number]
to = [end_state.user, end_state.number]
range = IDBKeyRange.bound from, to
defer = Promise.defer()
hb.openCursor(range).onsuccess = ()->
cursor = event.target.result
if cursor?
ops.push cursor.value # add Operation
cursor.continue()
else
# got all ops from this user
defer.resolve ops
defer.promise
setState: (state)->
that = this
new Promise (resolve, reject)->
req = that.t.objectStore("StateVector").put state
req.onsuccess = (event)->
resolve state
req.onerror = (event)->
reject "Could not set state vector!"
getState: (user)->
defer = Promise.defer()
req = @t.objectStore("StateVector").get user
req.onsuccess = (event)->
defer.resolve req.result
req.onerror = (event)->
defer.reject "Could not get state vector!"
defer.promise
getStateVector: ()->
defer = Promise.defer()
state_vector = []
@t.objectStore("StateVector").openCursor().onsuccess = ()->
cursor = event.target.result
if cursor?
state = cursor.value
state_vector.push state
cursor.continue()
else
# got all ops from this user
defer.resolve state_vector
defer.promise
class Transaction
constructor: (@t)->
updateOperation: (op)->
@t.setOperation op
addOperation: (op)->
that = this
@t.getState op.uid[0]
.then (state)->
# only add operation if this is an expected operation
if not state?
state =
user: op.uid[0]
number: 0
if op.uid[1] is state.number
state.number++
that.t.setState state
else
return Promise.reject("Unexpected Operation")
.then that.t.setOperation op
getOperation: (uid)->
@t.getOperation uid
getState: (user)->
@t.getState user
getOperations: (state_vector)->
@t.getOperations state_vector
class window.DB
constructor: ()-> constructor: ()->
@ready = (new Promise (resolve, reject)-> @ready = (new Promise (resolve, reject)->
request = indexedDB.open "Testy", 7 req = indexedDB.open "Testy", 7
request.onerror = ()-> req.onerror = ()->
reject "Couldn't open the IndexedDB database!" reject "Couldn't open the IndexedDB database!"
request.onsuccess = (event)-> req.onsuccess = (event)->
resolve event.target.result resolve event.target.result
request.onupgradeneeded = (event)-> req.onupgradeneeded = (event)->
db = event.target.result db = event.target.result
objectStore = db.createObjectStore "HistoryBuffer", {keyPath: "uid"} objectStore = db.createObjectStore "HistoryBuffer", {keyPath: "uid"}
objectStore = db.createObjectStore "StateVector", {keyPath: "user"}
).catch (message)-> ).catch (message)->
throw new Error message throw new Error message
requestBuffer: ()-> requestTransaction: ()->
@ready.then (db)-> @ready.then (db)->
new Promise (resolve, reject)-> new Promise (resolve, reject)->
resolve new Buffer(db.transaction(["HistoryBuffer"], "readwrite").objectStore("HistoryBuffer")) resolve new Transaction( new DBTransaction(db.transaction(["HistoryBuffer", "StateVector"], "readwrite")) )
removeDatabase: ()-> removeDatabase: ()->
req = indexedDB.deleteDatabase "Testy" req = indexedDB.deleteDatabase "Testy"
req.onsuccess = ()-> req.onsuccess = ()->
console.log("Deleted database successfully"); console.log("Deleted database successfully");
req.onblocked = ()->
console.log("Database is currently being blocked")
console.dir arguments
req.onerror = ()-> req.onerror = ()->
console.log("Couldn't delete database") console.log("Couldn't delete database")
console.dir arguments
null
window.hb = new HB() window.db = new DB()
window.addDummyDataSet = ()->
db.requestTransaction().then (t)->
t.getState("dmonad").then (state)->
state ?= {number: 0}
t.addOperation({uid: ["dmonad", state.number]})
window.getOp = (num = 3)->
db.requestTransaction().then (t)->
t.getOperation(["dmonad", num])
.then (op)->
console.log("yay:")
console.log(op)
window.getOps = (state_map = {dmonad: 5})->
db.requestTransaction().then (t)->
t.getOperations(state_map)
.then (op)->
console.log("yay:")
console.log(op)

View File

@ -1,96 +1,272 @@
// Generated by CoffeeScript 1.9.2 // Generated by CoffeeScript 1.9.2
(function() { (function() {
var Buffer; var DBTransaction, Transaction;
Buffer = (function() { DBTransaction = (function() {
function Buffer(buffer) { function DBTransaction(t1) {
this.buffer = buffer; this.t = t1;
} }
Buffer.prototype.set = function(op) { DBTransaction.prototype.setOperation = function(op) {
var that; var that;
that = this; that = this;
return new Promise((function(_this) { return new Promise(function(resolve, reject) {
return function(resolve, reject) { var req;
var request; req = that.t.objectStore("HistoryBuffer").put(op);
request = that.buffer.put(op); req.onsuccess = function(event) {
request.onsuccess = function(event) {
return resolve(op); return resolve(op);
}; };
return request.onerror = function(event) { return req.onerror = function(event) {
return reject("Could not set value!"); return reject("Could not set Operation!");
}; };
}; });
})(this));
}; };
Buffer.prototype.get = function(uid) { DBTransaction.prototype.getOperation = function(uid) {
var that; var that;
that = this; that = this;
return new Promise((function(_this) { return new Promise(function(resolve, reject) {
return function(resolve, reject) { var req;
var request; req = that.t.objectStore("HistoryBuffer").get(uid);
request = that.buffer.get(uid); req.onsuccess = function(event) {
request.onsuccess = function(event) { return resolve(req.result);
return resolve(request.result);
}; };
return request.onerror = function(event) { return req.onerror = function(event) {
return reject("Could not set value!"); return reject("Could not get Operation!");
}; };
}; });
})(this));
}; };
return Buffer; DBTransaction.prototype.getOperations = function(state_map) {
var flow, hb, ops, that;
flow = Promise.resolve();
ops = [];
that = this;
hb = that.t.objectStore("HistoryBuffer");
return that.getStateVector().then(function(end_state_vector) {
var end_state, results;
results = [];
for (end_state in end_state_vector) {
results.push((function(end_state) {
var ref, start_state;
start_state = {
user: end_state.name,
state: (ref = state_map[end_state]) != null ? ref : 0
};
return flow = flow.then(function() {
var defer, from, range, to;
from = [start_state.user, start_state.number];
to = [end_state.user, end_state.number];
range = IDBKeyRange.bound(from, to);
defer = Promise.defer();
hb.openCursor(range).onsuccess = function() {
var cursor;
cursor = event.target.result;
if (cursor != null) {
ops.push(cursor.value);
return cursor["continue"]();
} else {
return defer.resolve(ops);
}
};
return defer.promise;
});
})(end_state));
}
return results;
});
};
DBTransaction.prototype.setState = function(state) {
var that;
that = this;
return new Promise(function(resolve, reject) {
var req;
req = that.t.objectStore("StateVector").put(state);
req.onsuccess = function(event) {
return resolve(state);
};
return req.onerror = function(event) {
return reject("Could not set state vector!");
};
});
};
DBTransaction.prototype.getState = function(user) {
var defer, req;
defer = Promise.defer();
req = this.t.objectStore("StateVector").get(user);
req.onsuccess = function(event) {
return defer.resolve(req.result);
};
req.onerror = function(event) {
return defer.reject("Could not get state vector!");
};
return defer.promise;
};
DBTransaction.prototype.getStateVector = function() {
var defer, state_vector;
defer = Promise.defer();
state_vector = [];
this.t.objectStore("StateVector").openCursor().onsuccess = function() {
var cursor, state;
cursor = event.target.result;
if (cursor != null) {
state = cursor.value;
state_vector.push(state);
return cursor["continue"]();
} else {
return defer.resolve(state_vector);
}
};
return defer.promise;
};
return DBTransaction;
})(); })();
window.HB = (function() { Transaction = (function() {
function HB() { function Transaction(t1) {
this.t = t1;
}
Transaction.prototype.updateOperation = function(op) {
return this.t.setOperation(op);
};
Transaction.prototype.addOperation = function(op) {
var that;
that = this;
return this.t.getState(op.uid[0]).then(function(state) {
if (state == null) {
state = {
user: op.uid[0],
number: 0
};
}
if (op.uid[1] === state.number) {
state.number++;
return that.t.setState(state);
} else {
return Promise.reject("Unexpected Operation");
}
}).then(that.t.setOperation(op));
};
Transaction.prototype.getOperation = function(uid) {
return this.t.getOperation(uid);
};
Transaction.prototype.getState = function(user) {
return this.t.getState(user);
};
Transaction.prototype.getOperations = function(state_vector) {
return this.t.getOperations(state_vector);
};
return Transaction;
})();
window.DB = (function() {
function DB() {
this.ready = (new Promise(function(resolve, reject) { this.ready = (new Promise(function(resolve, reject) {
var request; var req;
request = indexedDB.open("Testy", 7); req = indexedDB.open("Testy", 7);
request.onerror = function() { req.onerror = function() {
return reject("Couldn't open the IndexedDB database!"); return reject("Couldn't open the IndexedDB database!");
}; };
request.onsuccess = function(event) { req.onsuccess = function(event) {
return resolve(event.target.result); return resolve(event.target.result);
}; };
return request.onupgradeneeded = function(event) { return req.onupgradeneeded = function(event) {
var db, objectStore; var db, objectStore;
db = event.target.result; db = event.target.result;
return objectStore = db.createObjectStore("HistoryBuffer", { objectStore = db.createObjectStore("HistoryBuffer", {
keyPath: "uid" keyPath: "uid"
}); });
return objectStore = db.createObjectStore("StateVector", {
keyPath: "user"
});
}; };
}))["catch"](function(message) { }))["catch"](function(message) {
throw new Error(message); throw new Error(message);
}); });
} }
HB.prototype.requestBuffer = function() { DB.prototype.requestTransaction = function() {
return this.ready.then(function(db) { return this.ready.then(function(db) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
return resolve(new Buffer(db.transaction(["HistoryBuffer"], "readwrite").objectStore("HistoryBuffer"))); return resolve(new Transaction(new DBTransaction(db.transaction(["HistoryBuffer", "StateVector"], "readwrite"))));
}); });
}); });
}; };
HB.prototype.removeDatabase = function() { DB.prototype.removeDatabase = function() {
var req; var req;
req = indexedDB.deleteDatabase("Testy"); req = indexedDB.deleteDatabase("Testy");
req.onsuccess = function() { req.onsuccess = function() {
return console.log("Deleted database successfully"); return console.log("Deleted database successfully");
}; };
return req.onerror = function() { req.onblocked = function() {
return console.log("Couldn't delete database"); console.log("Database is currently being blocked");
return console.dir(arguments);
}; };
req.onerror = function() {
console.log("Couldn't delete database");
return console.dir(arguments);
};
return null;
}; };
return HB; return DB;
})(); })();
window.hb = new HB(); window.db = new DB();
window.addDummyDataSet = function() {
return db.requestTransaction().then(function(t) {
return t.getState("dmonad").then(function(state) {
if (state == null) {
state = {
number: 0
};
}
return t.addOperation({
uid: ["dmonad", state.number]
});
});
});
};
window.getOp = function(num) {
if (num == null) {
num = 3;
}
return db.requestTransaction().then(function(t) {
return t.getOperation(["dmonad", num]).then(function(op) {
console.log("yay:");
return console.log(op);
});
});
};
window.getOps = function(state_map) {
if (state_map == null) {
state_map = {
dmonad: 5
};
}
return db.requestTransaction().then(function(t) {
return t.getOperations(state_map).then(function(op) {
console.log("yay:");
return console.log(op);
});
});
};
}).call(this); }).call(this);