added lots of magic
This commit is contained in:
parent
c3ba8173d7
commit
1b63f5efde
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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
32404
build/test/xml-test.js
Normal file
File diff suppressed because one or more lines are too long
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user