Finished support for new connector type
This commit is contained in:
142
build/node/ConnectorsDeprecated/IwcConnector.js
Normal file
142
build/node/ConnectorsDeprecated/IwcConnector.js
Normal file
@@ -0,0 +1,142 @@
|
||||
(function() {
|
||||
var createIwcConnector;
|
||||
|
||||
createIwcConnector = function(callback, options) {
|
||||
var IwcConnector, duiClient, init, iwcHandler, received_HB, userIwcHandler;
|
||||
userIwcHandler = null;
|
||||
if (options != null) {
|
||||
userIwcHandler = options.iwcHandler;
|
||||
}
|
||||
iwcHandler = {};
|
||||
duiClient = new DUIClient();
|
||||
duiClient.connect(function(intent) {
|
||||
var _ref;
|
||||
if ((_ref = iwcHandler[intent.action]) != null) {
|
||||
_ref.map(function(f) {
|
||||
return setTimeout(function() {
|
||||
return f(intent);
|
||||
}, 0);
|
||||
});
|
||||
}
|
||||
if (userIwcHandler != null) {
|
||||
return userIwcHandler(intent);
|
||||
}
|
||||
});
|
||||
duiClient.initOK();
|
||||
received_HB = null;
|
||||
IwcConnector = (function() {
|
||||
function IwcConnector(engine, HB, execution_listener, yatta) {
|
||||
var receiveHB, receive_, sendHistoryBuffer, send_;
|
||||
this.engine = engine;
|
||||
this.HB = HB;
|
||||
this.execution_listener = execution_listener;
|
||||
this.yatta = yatta;
|
||||
this.duiClient = duiClient;
|
||||
this.iwcHandler = iwcHandler;
|
||||
send_ = (function(_this) {
|
||||
return function(o) {
|
||||
if (Object.getOwnPropertyNames(_this.initialized).length !== 0) {
|
||||
return _this.send(o);
|
||||
}
|
||||
};
|
||||
})(this);
|
||||
this.execution_listener.push(send_);
|
||||
this.initialized = {};
|
||||
receiveHB = (function(_this) {
|
||||
return function(json) {
|
||||
var him;
|
||||
HB = json.extras.HB;
|
||||
him = json.extras.user;
|
||||
_this.engine.applyOpsCheckDouble(HB);
|
||||
return _this.initialized[him] = true;
|
||||
};
|
||||
})(this);
|
||||
iwcHandler["Yatta_push_HB_element"] = [receiveHB];
|
||||
this.sendIwcIntent("Yatta_get_HB_element", this.HB.getOperationCounter());
|
||||
receive_ = (function(_this) {
|
||||
return function(intent) {
|
||||
var o;
|
||||
o = intent.extras;
|
||||
if (_this.initialized[o.uid.creator] != null) {
|
||||
return _this.receive(o);
|
||||
}
|
||||
};
|
||||
})(this);
|
||||
this.iwcHandler["Yatta_new_operation"] = [receive_];
|
||||
if (received_HB != null) {
|
||||
this.engine.applyOpsCheckDouble(received_HB);
|
||||
}
|
||||
sendHistoryBuffer = (function(_this) {
|
||||
return function(intent) {
|
||||
var json, state_vector;
|
||||
state_vector = intent.extras;
|
||||
console.log(state_vector);
|
||||
json = {
|
||||
HB: _this.yatta.getHistoryBuffer()._encode(state_vector),
|
||||
user: _this.yatta.getUserId()
|
||||
};
|
||||
return _this.sendIwcIntent("Yatta_push_HB_element", json);
|
||||
};
|
||||
})(this);
|
||||
this.iwcHandler["Yatta_get_HB_element"] = [sendHistoryBuffer];
|
||||
}
|
||||
|
||||
IwcConnector.prototype.setIwcHandler = function(f) {
|
||||
return userIwcHandler = f;
|
||||
};
|
||||
|
||||
IwcConnector.prototype.sendIwcIntent = function(action_name, content) {
|
||||
var intent;
|
||||
intent = null;
|
||||
if (arguments.length >= 2) {
|
||||
action_name = arguments[0], content = arguments[1];
|
||||
intent = {
|
||||
action: action_name,
|
||||
component: "",
|
||||
data: "",
|
||||
dataType: "",
|
||||
flags: ["PUBLISH_GLOBAL"],
|
||||
extras: content
|
||||
};
|
||||
} else {
|
||||
intent = arguments[0];
|
||||
}
|
||||
return this.duiClient.sendIntent(intent);
|
||||
};
|
||||
|
||||
IwcConnector.prototype.send = function(o) {
|
||||
if (o.uid.creator === this.HB.getUserId() && (typeof o.uid.op_number !== "string")) {
|
||||
return this.sendIwcIntent("Yatta_new_operation", o);
|
||||
}
|
||||
};
|
||||
|
||||
IwcConnector.prototype.receive = function(o) {
|
||||
if (o.uid.creator !== this.HB.getUserId()) {
|
||||
return this.engine.applyOp(o);
|
||||
}
|
||||
};
|
||||
|
||||
return IwcConnector;
|
||||
|
||||
})();
|
||||
init = function() {
|
||||
var proposed_user_id;
|
||||
proposed_user_id = Math.floor(Math.random() * 1000000);
|
||||
return callback(IwcConnector, proposed_user_id);
|
||||
};
|
||||
setTimeout(init, 5000);
|
||||
return void 0;
|
||||
};
|
||||
|
||||
module.exports = createIwcConnector;
|
||||
|
||||
if (typeof window !== "undefined" && window !== null) {
|
||||
if (window.Y == null) {
|
||||
window.Y = {};
|
||||
}
|
||||
window.Y.createIwcConnector = createIwcConnector;
|
||||
}
|
||||
|
||||
}).call(this);
|
||||
|
||||
//# sourceMappingURL=../ConnectorsDeprecated/IwcConnector.js.map
|
||||
1
build/node/ConnectorsDeprecated/IwcConnector.js.map
Normal file
1
build/node/ConnectorsDeprecated/IwcConnector.js.map
Normal file
File diff suppressed because one or more lines are too long
169
build/node/ConnectorsDeprecated/PeerJsConnector.js
Normal file
169
build/node/ConnectorsDeprecated/PeerJsConnector.js
Normal file
@@ -0,0 +1,169 @@
|
||||
(function() {
|
||||
var createPeerJsConnector;
|
||||
|
||||
createPeerJsConnector = function() {
|
||||
var PeerJsConnector, callback, peer;
|
||||
peer = null;
|
||||
if (arguments.length === 2) {
|
||||
peer = new Peer(arguments[0]);
|
||||
callback = arguments[1];
|
||||
} else {
|
||||
peer = new Peer(arguments[0], arguments[1]);
|
||||
peer.on('error', function(err) {
|
||||
throw new Error("Peerjs connector: " + err);
|
||||
});
|
||||
peer.on('disconnected', function() {
|
||||
throw new Error("Peerjs connector disconnected from signalling server. Cannot accept new connections. Not fatal, but not so good either..");
|
||||
});
|
||||
callback = arguments[2];
|
||||
}
|
||||
PeerJsConnector = (function() {
|
||||
function PeerJsConnector(engine, HB, execution_listener, yatta) {
|
||||
var send_, sync_every_collaborator;
|
||||
this.engine = engine;
|
||||
this.HB = HB;
|
||||
this.execution_listener = execution_listener;
|
||||
this.yatta = yatta;
|
||||
this.peer = peer;
|
||||
this.connections = {};
|
||||
this.new_connection_listeners = [];
|
||||
this.peer.on('connection', (function(_this) {
|
||||
return function(conn) {
|
||||
return _this.addConnection(conn);
|
||||
};
|
||||
})(this));
|
||||
sync_every_collaborator = (function(_this) {
|
||||
return function() {
|
||||
var conn, conn_id, _ref, _results;
|
||||
_ref = _this.connections;
|
||||
_results = [];
|
||||
for (conn_id in _ref) {
|
||||
conn = _ref[conn_id];
|
||||
_results.push(conn.send({
|
||||
sync_state_vector: _this.HB.getOperationCounter()
|
||||
}));
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
})(this);
|
||||
setInterval(sync_every_collaborator, 4000);
|
||||
send_ = (function(_this) {
|
||||
return function(o) {
|
||||
var conn, conn_id, _ref, _results;
|
||||
if (o.uid.creator === _this.HB.getUserId() && (typeof o.uid.op_number !== "string")) {
|
||||
_ref = _this.connections;
|
||||
_results = [];
|
||||
for (conn_id in _ref) {
|
||||
conn = _ref[conn_id];
|
||||
_results.push(conn.send({
|
||||
op: o
|
||||
}));
|
||||
}
|
||||
return _results;
|
||||
}
|
||||
};
|
||||
})(this);
|
||||
this.execution_listener.push(send_);
|
||||
}
|
||||
|
||||
PeerJsConnector.prototype.connectToPeer = function(id) {
|
||||
if ((this.connections[id] == null) && id !== this.yatta.getUserId()) {
|
||||
return this.addConnection(peer.connect(id));
|
||||
}
|
||||
};
|
||||
|
||||
PeerJsConnector.prototype.getAllConnectionIds = function() {
|
||||
var conn_id, _results;
|
||||
_results = [];
|
||||
for (conn_id in this.connections) {
|
||||
_results.push(conn_id);
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
PeerJsConnector.prototype.onNewConnection = function(f) {
|
||||
return this.new_connection_listeners.push(f);
|
||||
};
|
||||
|
||||
PeerJsConnector.prototype.addConnection = function(conn) {
|
||||
var initialized_him, initialized_me, sendStateVector;
|
||||
this.connections[conn.peer] = conn;
|
||||
initialized_me = false;
|
||||
initialized_him = false;
|
||||
conn.on('data', (function(_this) {
|
||||
return function(data) {
|
||||
var conn_id, _i, _len, _ref, _results;
|
||||
if (data === "empty_message") {
|
||||
|
||||
} else if (data.HB != null) {
|
||||
initialized_me = true;
|
||||
_this.engine.applyOpsCheckDouble(data.HB);
|
||||
if (!data.initialized) {
|
||||
conn.send({
|
||||
conns: _this.getAllConnectionIds()
|
||||
});
|
||||
return _this.new_connection_listeners.map(function(f) {
|
||||
return f(conn);
|
||||
});
|
||||
}
|
||||
} else if (data.op != null) {
|
||||
return _this.engine.applyOp(data.op);
|
||||
} else if (data.conns != null) {
|
||||
_ref = data.conns;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
conn_id = _ref[_i];
|
||||
_results.push(_this.connectToPeer(conn_id));
|
||||
}
|
||||
return _results;
|
||||
} else if (data.sync_state_vector != null) {
|
||||
return conn.send({
|
||||
HB: _this.yatta.getHistoryBuffer()._encode(data.sync_state_vector),
|
||||
initialized: true
|
||||
});
|
||||
} else if (data.state_vector != null) {
|
||||
if (!initialized_him) {
|
||||
conn.send({
|
||||
HB: _this.yatta.getHistoryBuffer()._encode(data.state_vector),
|
||||
initialized: false
|
||||
});
|
||||
return initialized_him = true;
|
||||
}
|
||||
} else {
|
||||
throw new Error("Can't parse this operation: " + data);
|
||||
}
|
||||
};
|
||||
})(this));
|
||||
sendStateVector = (function(_this) {
|
||||
return function() {
|
||||
conn.send({
|
||||
state_vector: _this.HB.getOperationCounter()
|
||||
});
|
||||
if (!initialized_me) {
|
||||
return setTimeout(sendStateVector, 100);
|
||||
}
|
||||
};
|
||||
})(this);
|
||||
return sendStateVector();
|
||||
};
|
||||
|
||||
return PeerJsConnector;
|
||||
|
||||
})();
|
||||
return peer.on('open', function(id) {
|
||||
return callback(PeerJsConnector, id);
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = createPeerJsConnector;
|
||||
|
||||
if (typeof window !== "undefined" && window !== null) {
|
||||
if (window.Y == null) {
|
||||
window.Y = {};
|
||||
}
|
||||
window.Y.createPeerJsConnector = createPeerJsConnector;
|
||||
}
|
||||
|
||||
}).call(this);
|
||||
|
||||
//# sourceMappingURL=../ConnectorsDeprecated/PeerJsConnector.js.map
|
||||
1
build/node/ConnectorsDeprecated/PeerJsConnector.js.map
Normal file
1
build/node/ConnectorsDeprecated/PeerJsConnector.js.map
Normal file
File diff suppressed because one or more lines are too long
90
build/node/ConnectorsDeprecated/TestConnector.js
Normal file
90
build/node/ConnectorsDeprecated/TestConnector.js
Normal file
@@ -0,0 +1,90 @@
|
||||
(function() {
|
||||
var _;
|
||||
|
||||
_ = require("underscore");
|
||||
|
||||
module.exports = function(user_list) {
|
||||
var TestConnector;
|
||||
return TestConnector = (function() {
|
||||
function TestConnector(engine, HB, execution_listener) {
|
||||
var appliedOperationsListener, send_;
|
||||
this.engine = engine;
|
||||
this.HB = HB;
|
||||
this.execution_listener = execution_listener;
|
||||
send_ = (function(_this) {
|
||||
return function(o) {
|
||||
return _this.send(o);
|
||||
};
|
||||
})(this);
|
||||
this.execution_listener.push(send_);
|
||||
this.applied_operations = [];
|
||||
appliedOperationsListener = (function(_this) {
|
||||
return function(o) {
|
||||
return _this.applied_operations.push(o);
|
||||
};
|
||||
})(this);
|
||||
this.execution_listener.push(appliedOperationsListener);
|
||||
if (!((user_list != null ? user_list.length : void 0) === 0)) {
|
||||
this.engine.applyOps(user_list[0].getHistoryBuffer()._encode());
|
||||
}
|
||||
this.HB.setManualGarbageCollect();
|
||||
this.unexecuted = {};
|
||||
}
|
||||
|
||||
TestConnector.prototype.getOpsInExecutionOrder = function() {
|
||||
return this.applied_operations;
|
||||
};
|
||||
|
||||
TestConnector.prototype.send = function(o) {
|
||||
var user, _i, _len, _results;
|
||||
if ((o.uid.creator === this.HB.getUserId()) && (typeof o.uid.op_number !== "string")) {
|
||||
_results = [];
|
||||
for (_i = 0, _len = user_list.length; _i < _len; _i++) {
|
||||
user = user_list[_i];
|
||||
if (user.getUserId() !== this.HB.getUserId()) {
|
||||
_results.push(user.getConnector().receive(o));
|
||||
} else {
|
||||
_results.push(void 0);
|
||||
}
|
||||
}
|
||||
return _results;
|
||||
}
|
||||
};
|
||||
|
||||
TestConnector.prototype.receive = function(o) {
|
||||
var _base, _name;
|
||||
if ((_base = this.unexecuted)[_name = o.uid.creator] == null) {
|
||||
_base[_name] = [];
|
||||
}
|
||||
return this.unexecuted[o.uid.creator].push(o);
|
||||
};
|
||||
|
||||
TestConnector.prototype.flushOne = function(user) {
|
||||
var _ref;
|
||||
if (((_ref = this.unexecuted[user]) != null ? _ref.length : void 0) > 0) {
|
||||
return this.engine.applyOp(this.unexecuted[user].shift());
|
||||
}
|
||||
};
|
||||
|
||||
TestConnector.prototype.flushOneRandom = function() {
|
||||
return this.flushOne(_.random(0, user_list.length - 1));
|
||||
};
|
||||
|
||||
TestConnector.prototype.flushAll = function() {
|
||||
var n, ops, _ref;
|
||||
_ref = this.unexecuted;
|
||||
for (n in _ref) {
|
||||
ops = _ref[n];
|
||||
this.engine.applyOps(ops);
|
||||
}
|
||||
return this.unexecuted = {};
|
||||
};
|
||||
|
||||
return TestConnector;
|
||||
|
||||
})();
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
|
||||
//# sourceMappingURL=../ConnectorsDeprecated/TestConnector.js.map
|
||||
1
build/node/ConnectorsDeprecated/TestConnector.js.map
Normal file
1
build/node/ConnectorsDeprecated/TestConnector.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["ConnectorsDeprecated/TestConnector.coffee"],"names":[],"mappings":"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","file":"ConnectorsDeprecated/TestConnector.js","sourceRoot":"/source/","sourcesContent":["\n_ = require \"underscore\"\n\nmodule.exports = (user_list)->\n\n #\n # @nodoc\n # A trivial Connector that simulates network delay.\n #\n class TestConnector\n\n #\n # @param {Engine} engine The transformation engine\n # @param {HistoryBuffer} HB\n # @param {Array<Function>} execution_listener You must ensure that whenever an operation is executed, every function in this Array is called.\n # @param {Yatta} yatta The Yatta framework.\n #\n constructor: (@engine, @HB, @execution_listener)->\n send_ = (o)=>\n @send o\n @execution_listener.push send_\n\n @applied_operations = []\n appliedOperationsListener = (o)=>\n @applied_operations.push o\n @execution_listener.push appliedOperationsListener\n if not (user_list?.length is 0)\n @engine.applyOps user_list[0].getHistoryBuffer()._encode()\n\n @HB.setManualGarbageCollect()\n @unexecuted = {}\n\n #\n # This engine applied operations in a specific order.\n # Get the ops in the right order.\n #\n getOpsInExecutionOrder: ()->\n @applied_operations\n\n #\n # This function is called whenever an operation was executed.\n # @param {Operation} o The operation that was executed.\n #\n send: (o)->\n if (o.uid.creator is @HB.getUserId()) and (typeof o.uid.op_number isnt \"string\")\n for user in user_list\n if user.getUserId() isnt @HB.getUserId()\n user.getConnector().receive(o)\n\n #\n # This function is called whenever an operation was received from another peer.\n # @param {Operation} o The operation that was received.\n #\n receive: (o)->\n @unexecuted[o.uid.creator] ?= []\n @unexecuted[o.uid.creator].push o\n\n #\n # Flush one operation from the line of a specific user.\n #\n flushOne: (user)->\n if @unexecuted[user]?.length > 0\n @engine.applyOp @unexecuted[user].shift()\n\n #\n # Flush one operation on a random line.\n #\n flushOneRandom: ()->\n @flushOne (_.random 0, (user_list.length-1))\n\n #\n # Flush all operations on every line.\n #\n flushAll: ()->\n for n,ops of @unexecuted\n @engine.applyOps ops\n @unexecuted = {}\n\n"]}
|
||||
Reference in New Issue
Block a user