Fixed iwc, update problem
This commit is contained in:
parent
6bbee4ef40
commit
089ae137dc
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
.kateproject.d
|
.kateproject.d
|
||||||
.kateproject
|
.kateproject
|
||||||
.directory
|
.directory
|
||||||
|
myftppass
|
||||||
|
@ -7,7 +7,7 @@ but does not require you to understand how the internals work. The predefined da
|
|||||||
|
|
||||||
Predefined data structures:
|
Predefined data structures:
|
||||||
* Text
|
* Text
|
||||||
* Json - [example](./examples/IwcJson.md)
|
* Json - [example](./examples/IwcJson/)
|
||||||
* XML (coming soon)
|
* XML (coming soon)
|
||||||
|
|
||||||
Unlike other frameworks, Yatta! supports P2P message propagation and is not bound to a specific communication protocol.
|
Unlike other frameworks, Yatta! supports P2P message propagation and is not bound to a specific communication protocol.
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
"Kevin Jahns <kevin.jahns@rwth-aachen.de>"
|
"Kevin Jahns <kevin.jahns@rwth-aachen.de>"
|
||||||
],
|
],
|
||||||
"description": "A Framework that enables Real-Time Collaboration on arbitrary data structures.",
|
"description": "A Framework that enables Real-Time Collaboration on arbitrary data structures.",
|
||||||
"main": "./build/browser/**",
|
"main": "./build/**",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"OT",
|
"OT",
|
||||||
"collaboration",
|
"collaboration",
|
||||||
@ -17,7 +17,6 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"**/.*",
|
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"bower_components",
|
"bower_components",
|
||||||
"test",
|
"test",
|
||||||
|
File diff suppressed because one or more lines are too long
2
build/browser/Connectors/IwcConnector.min.js
vendored
2
build/browser/Connectors/IwcConnector.min.js
vendored
@ -1 +1 @@
|
|||||||
!function t(n,e,r){function i(u,a){if(!e[u]){if(!n[u]){var c="function"==typeof require&&require;if(!a&&c)return c(u,!0);if(o)return o(u,!0);throw new Error("Cannot find module '"+u+"'")}var s=e[u]={exports:{}};n[u][0].call(s.exports,function(t){var e=n[u][1][t];return i(e?e:t)},s,s.exports,t,n,e,r)}return e[u].exports}for(var o="function"==typeof require&&require,u=0;u<r.length;u++)i(r[u]);return i}({1:[function(t,n){var e;e=function(t,n){var e,r,i,o,u,a;return u={},r=new DUIClient,r.connect(function(t){var n;return null!=(n=u[t.action])?n.map(function(n){return setTimeout(function(){return n(t)},0)}):void 0}),r.initOK(),a=null,e=function(){function t(t,n,e,i){var o,c,s;this.engine=t,this.HB=n,this.execution_listener=e,this.yatta=i,this.duiClient=r,this.iwcHandler=u,s=function(t){return function(n){return t.send(n)}}(this),this.execution_listener.push(s),o=function(t){return function(n){var e;return e=n.extras,t.receive(e)}}(this),this.iwcHandler.Yatta_new_operation=[o],null!=a&&this.engine.applyOpsCheckDouble(a),c=function(t){return function(){var n;return n={HB:t.yatta.getHistoryBuffer()._encode()},t.sendIwcIntent("Yatta_push_HB_element",n)}}(this),this.iwcHandler.Yatta_get_HB_element=[c]}return t.prototype.send=function(t){return t.uid.creator===this.HB.getUserId()&&"string"!=typeof t.uid.op_number?this.sendIwcIntent("Yatta_new_operation",t):void 0},t.prototype.receive=function(t){return t.uid.creator!==this.HB.getUserId()?this.engine.applyOp(t):void 0},t.prototype.sendIwcIntent=function(t,n){var e;return e={action:t,component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:n},this.duiClient.sendIntent(e)},t}(),i={action:"Yatta_get_HB_element",component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:{}},o=function(){var o,c;return r.sendIntent(i),o=!1,c=function(i){var u;return u=null,u=null!=n?n:r.getIwcClient()._componentName,a=null!=i?i.extras.HB:void 0,o?void 0:(o=!0,t(e,u))},u.Yatta_push_HB_element=[c],setTimeout(c,4e3)},void setTimeout(o,1e3)},n.exports=e,"undefined"!=typeof window&&null!==window&&(window.createConnector=e)},{}]},{},[1]);
|
!function t(n,e,r){function i(u,a){if(!e[u]){if(!n[u]){var c="function"==typeof require&&require;if(!a&&c)return c(u,!0);if(o)return o(u,!0);throw new Error("Cannot find module '"+u+"'")}var s=e[u]={exports:{}};n[u][0].call(s.exports,function(t){var e=n[u][1][t];return i(e?e:t)},s,s.exports,t,n,e,r)}return e[u].exports}for(var o="function"==typeof require&&require,u=0;u<r.length;u++)i(r[u]);return i}({1:[function(t,n){var e;e=function(t,n){var e,r,i,o,u,a,c;return u={},r=new DUIClient,r.connect(function(t){var n;return null!=(n=u[t.action])?n.map(function(n){return setTimeout(function(){return n(t)},0)}):void 0}),r.initOK(),a=null,e=function(){function t(t,n,e,i){var o,c,s,f;this.engine=t,this.HB=n,this.execution_listener=e,this.yatta=i,this.duiClient=r,this.iwcHandler=u,f=function(t){return function(n){return t.send(n)}}(this),this.execution_listener.push(f),o=function(t){return function(e){return n=null!=e?e.extras.HB:void 0,t.engine.applyOpsCheckDouble(n)}}(this),u.Yatta_push_HB_element=[o],c=function(t){return function(n){var e;return e=n.extras,t.receive(e)}}(this),this.iwcHandler.Yatta_new_operation=[c],null!=a&&this.engine.applyOpsCheckDouble(a),s=function(t){return function(){var n;return n={HB:t.yatta.getHistoryBuffer()._encode()},t.sendIwcIntent("Yatta_push_HB_element",n)}}(this),this.iwcHandler.Yatta_get_HB_element=[s]}return t.prototype.send=function(t){return t.uid.creator===this.HB.getUserId()&&"string"!=typeof t.uid.op_number?this.sendIwcIntent("Yatta_new_operation",t):void 0},t.prototype.receive=function(t){return t.uid.creator!==this.HB.getUserId()?this.engine.applyOp(t):void 0},t.prototype.sendIwcIntent=function(t,n){var e;return e={action:t,component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:n},this.duiClient.sendIntent(e)},t}(),i={action:"Yatta_get_HB_element",component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:{}},c=function(){return r.sendIntent(i)},o=function(){var r;return setTimeout(c,1e3),r=null,r=null!=n?n:Math.floor(1e6*Math.random()),t(e,r)},void setTimeout(o,1e3)},n.exports=e,"undefined"!=typeof window&&null!==window&&(window.createIwcConnector=e)},{}]},{},[1]);
|
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
!function n(e,t,o){function r(u,c){if(!t[u]){if(!e[u]){var s="function"==typeof require&&require;if(!c&&s)return s(u,!0);if(i)return i(u,!0);throw new Error("Cannot find module '"+u+"'")}var f=t[u]={exports:{}};e[u][0].call(f.exports,function(n){var t=e[u][1][n];return r(t?t:n)},f,f.exports,n,e,t,o)}return t[u].exports}for(var i="function"==typeof require&&require,u=0;u<o.length;u++)r(o[u]);return r}({1:[function(n,e){var t;t=function(n){var e,t;return t=new Peer({key:"h7nlefbgavh1tt9"}),e=function(){function n(n,e,o,r){var i;this.engine=n,this.HB=e,this.execution_listener=o,this.yatta=r,this.peer=t,this.connections=[],this.peer.on("connection",function(n){return function(e){return console.log("received conn"),n.addConnection(e)}}(this)),i=function(n){return function(e){return n.send(e)}}(this),this.execution_listener.push(i)}return n.prototype.connectToPeer=function(n){return this.addConnection(t.connect(n))},n.prototype.addConnection=function(n){var e;return this.connections.push(n),n.on("data",function(n){return function(e){if(console.log("data: "+e),null!=e.HB)return n.engine.applyOpsCheckDouble(e.HB);if(null!=e.op)return n.engine.applyOp(e.op);throw new Error("Can't parse this operation")}}(this)),e=function(e){return function(){return console.log("sending..."),n.send({HB:e.yatta.getHistoryBuffer()._encode()})}}(this),setTimeout(e,1e3)},n.prototype.send=function(n){var e,t,o,r,i;if(n.uid.creator===this.HB.getUserId()&&"string"!=typeof n.uid.op_number){for(console.log("trying to send ops"),r=this.connections,i=[],t=0,o=r.length;o>t;t++)e=r[t],console.log("sent op"),i.push(e.send({op:n}));return i}},n.prototype.receive=function(n){return n.uid.creator!==this.HB.getUserId()?this.engine.applyOp(n):void 0},n}(),t.on("open",function(t){return console.log(t),n(e,t)})},e.exports=t,"undefined"!=typeof window&&null!==window&&(window.createPeerJsConnector=t)},{}]},{},[1]);
|
!function n(e,t,r){function o(u,c){if(!t[u]){if(!e[u]){var s="function"==typeof require&&require;if(!c&&s)return s(u,!0);if(i)return i(u,!0);throw new Error("Cannot find module '"+u+"'")}var f=t[u]={exports:{}};e[u][0].call(f.exports,function(n){var t=e[u][1][n];return o(t?t:n)},f,f.exports,n,e,t,r)}return t[u].exports}for(var i="function"==typeof require&&require,u=0;u<r.length;u++)o(r[u]);return o}({1:[function(n,e){var t;t=function(n){var e,t;return t=new Peer({key:"h7nlefbgavh1tt9"}),e=function(){function n(n,e,r,o){var i;this.engine=n,this.HB=e,this.execution_listener=r,this.yatta=o,this.peer=t,this.connections=[],this.peer.on("connection",function(n){return function(e){return e.send("hey"),n.addConnection(e)}}(this)),i=function(n){return function(e){return n.send(e)}}(this),this.execution_listener.push(i)}return n.prototype.connectToPeer=function(n){return this.addConnection(t.connect(n))},n.prototype.addConnection=function(n){var e;return this.connections.push(n),n.on("data",function(n){return function(e){if("hey"!==e){if(null!=e.HB)return n.engine.applyOpsCheckDouble(e.HB);if(null!=e.op)return n.engine.applyOp(e.op);throw new Error("Can't parse this operation")}}}(this)),e=function(e){return function(){return n.send({HB:e.yatta.getHistoryBuffer()._encode()})}}(this),setTimeout(e,1e3)},n.prototype.send=function(n){var e,t,r,o,i;if(n.uid.creator===this.HB.getUserId()&&"string"!=typeof n.uid.op_number){for(o=this.connections,i=[],t=0,r=o.length;r>t;t++)e=o[t],i.push(e.send({op:n}));return i}},n.prototype.receive=function(n){return n.uid.creator!==this.HB.getUserId()?this.engine.applyOp(n):void 0},n}(),t.on("open",function(t){return n(e,t)})},e.exports=t,"undefined"!=typeof window&&null!==window&&(window.createPeerJsConnector=t)},{}]},{},[1]);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/browser/Engine.min.js
vendored
2
build/browser/Engine.min.js
vendored
@ -1 +1 @@
|
|||||||
!function r(e,t,o){function p(s,i){if(!t[s]){if(!e[s]){var u="function"==typeof require&&require;if(!i&&u)return u(s,!0);if(n)return n(s,!0);throw new Error("Cannot find module '"+s+"'")}var h=t[s]={exports:{}};e[s][0].call(h.exports,function(r){var t=e[s][1][r];return p(t?t:r)},h,h.exports,r,e,t,o)}return t[s].exports}for(var n="function"==typeof require&&require,s=0;s<o.length;s++)p(o[s]);return p}({1:[function(r,e){var t;t=function(){function r(r,e){this.HB=r,this.parser=e,this.unprocessed_ops=[]}return r.prototype.parseOperation=function(r){var e;if(e=this.parser[r.type],null!=e)return e(r);throw new Error("You forgot to specify a parser for type "+r.type+". The message is "+JSON.stringify(r)+".")},r.prototype.applyOpsBundle=function(r){var e,t,o,p,n,s,i,u;for(t=[],o=0,s=r.length;s>o;o++)e=r[o],t.push(this.parseOperation(e));for(p=0,i=t.length;i>p;p++)e=t[p],this.HB.addOperation(e);for(n=0,u=t.length;u>n;n++)e=t[n],e.execute()||this.unprocessed_ops.push(e);return this.tryUnprocessed()},r.prototype.applyOpsCheckDouble=function(r){var e,t,o,p;for(p=[],t=0,o=r.length;o>t;t++)e=r[t],p.push(null!=this.HB.getOperation(e.uid)?this.applyOp(e):void 0);return p},r.prototype.applyOps=function(r){var e,t,o,p;for(p=[],t=0,o=r.length;o>t;t++)e=r[t],p.push(this.applyOp(e));return p},r.prototype.applyOp=function(r){var e;return e=this.parseOperation(r),this.HB.addToCounter(e),e.execute()?this.HB.addOperation(e):this.unprocessed_ops.push(e),this.tryUnprocessed()},r.prototype.tryUnprocessed=function(){var r,e,t,o,p,n,s;for(s=[];;){for(r=this.unprocessed_ops.length,t=[],n=this.unprocessed_ops,o=0,p=n.length;p>o;o++)e=n[o],e.execute()?this.HB.addOperation(e):t.push(e);if(this.unprocessed_ops=t,this.unprocessed_ops.length===r)break;s.push(void 0)}return s},r}(),e.exports=t},{}]},{},[1]);
|
!function r(e,t,o){function p(s,i){if(!t[s]){if(!e[s]){var u="function"==typeof require&&require;if(!i&&u)return u(s,!0);if(n)return n(s,!0);throw new Error("Cannot find module '"+s+"'")}var h=t[s]={exports:{}};e[s][0].call(h.exports,function(r){var t=e[s][1][r];return p(t?t:r)},h,h.exports,r,e,t,o)}return t[s].exports}for(var n="function"==typeof require&&require,s=0;s<o.length;s++)p(o[s]);return p}({1:[function(r,e){var t;t=function(){function r(r,e){this.HB=r,this.parser=e,this.unprocessed_ops=[]}return r.prototype.parseOperation=function(r){var e;if(e=this.parser[r.type],null!=e)return e(r);throw new Error("You forgot to specify a parser for type "+r.type+". The message is "+JSON.stringify(r)+".")},r.prototype.applyOpsBundle=function(r){var e,t,o,p,n,s,i,u;for(t=[],o=0,s=r.length;s>o;o++)e=r[o],t.push(this.parseOperation(e));for(p=0,i=t.length;i>p;p++)e=t[p],this.HB.addOperation(e);for(n=0,u=t.length;u>n;n++)e=t[n],e.execute()||this.unprocessed_ops.push(e);return this.tryUnprocessed()},r.prototype.applyOpsCheckDouble=function(r){var e,t,o,p;for(p=[],t=0,o=r.length;o>t;t++)e=r[t],p.push(null==this.HB.getOperation(e.uid)?this.applyOp(e):void 0);return p},r.prototype.applyOps=function(r){var e,t,o,p;for(p=[],t=0,o=r.length;o>t;t++)e=r[t],p.push(this.applyOp(e));return p},r.prototype.applyOp=function(r){var e;return e=this.parseOperation(r),this.HB.addToCounter(e),e.execute()?this.HB.addOperation(e):this.unprocessed_ops.push(e),this.tryUnprocessed()},r.prototype.tryUnprocessed=function(){var r,e,t,o,p,n,s;for(s=[];;){for(r=this.unprocessed_ops.length,t=[],n=this.unprocessed_ops,o=0,p=n.length;p>o;o++)e=n[o],e.execute()?this.HB.addOperation(e):t.push(e);if(this.unprocessed_ops=t,this.unprocessed_ops.length===r)break;s.push(void 0)}return s},r}(),e.exports=t},{}]},{},[1]);
|
File diff suppressed because one or more lines are too long
2
build/browser/Frameworks/JsonYatta.min.js
vendored
2
build/browser/Frameworks/JsonYatta.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/browser/Frameworks/TextYatta.min.js
vendored
2
build/browser/Frameworks/TextYatta.min.js
vendored
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
2
build/browser/Types/BasicTypes.min.js
vendored
2
build/browser/Types/BasicTypes.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/browser/Types/JsonTypes.min.js
vendored
2
build/browser/Types/JsonTypes.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/browser/Types/StructuredTypes.min.js
vendored
2
build/browser/Types/StructuredTypes.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/browser/Types/TextTypes.min.js
vendored
2
build/browser/Types/TextTypes.min.js
vendored
File diff suppressed because one or more lines are too long
@ -3,4 +3,3 @@
|
|||||||
|
|
||||||
|
|
||||||
},{}]},{},[1])
|
},{}]},{},[1])
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2Rtb25hZC9Ecm9wYm94L1lhdHRhIS9ub2RlX21vZHVsZXMvZ3VscC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvaG9tZS9kbW9uYWQvRHJvcGJveC9ZYXR0YSEvbGliL1R5cGVzL1htbFR5cGVzLmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpfXZhciBmPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChmLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGYsZi5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pTDJodmJXVXZaRzF2Ym1Ga0wwUnliM0JpYjNndldXRjBkR0VoTDJ4cFlpOVVlWEJsY3k5WWJXeFVlWEJsY3k1amIyWm1aV1VpTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lJdmFHOXRaUzlrYlc5dVlXUXZSSEp2Y0dKdmVDOVpZWFIwWVNFdmJHbGlMMVI1Y0dWekwxaHRiRlI1Y0dWekxtTnZabVpsWlNKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGcllrY2lMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUlpWFgwPSJdfQ==
|
|
||||||
|
File diff suppressed because one or more lines are too long
4
build/browser/index.min.js
vendored
4
build/browser/index.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@
|
|||||||
(function(){var t;t=function(t,n){var e,i,r,o,u,a;return u={},i=new DUIClient,i.connect(function(t){var n;return null!=(n=u[t.action])?n.map(function(n){return setTimeout(function(){return n(t)},0)}):void 0}),i.initOK(),a=null,e=function(){function t(t,n,e,r){var o,s,c;this.engine=t,this.HB=n,this.execution_listener=e,this.yatta=r,this.duiClient=i,this.iwcHandler=u,c=function(t){return function(n){return t.send(n)}}(this),this.execution_listener.push(c),o=function(t){return function(n){var e;return e=n.extras,t.receive(e)}}(this),this.iwcHandler.Yatta_new_operation=[o],null!=a&&this.engine.applyOpsCheckDouble(a),s=function(t){return function(){var n;return n={HB:t.yatta.getHistoryBuffer()._encode()},t.sendIwcIntent("Yatta_push_HB_element",n)}}(this),this.iwcHandler.Yatta_get_HB_element=[s]}return t.prototype.send=function(t){return t.uid.creator===this.HB.getUserId()&&"string"!=typeof t.uid.op_number?this.sendIwcIntent("Yatta_new_operation",t):void 0},t.prototype.receive=function(t){return t.uid.creator!==this.HB.getUserId()?this.engine.applyOp(t):void 0},t.prototype.sendIwcIntent=function(t,n){var e;return e={action:t,component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:n},this.duiClient.sendIntent(e)},t}(),r={action:"Yatta_get_HB_element",component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:{}},o=function(){var o,s;return i.sendIntent(r),o=!1,s=function(r){var u;return u=null,u=null!=n?n:i.getIwcClient()._componentName,a=null!=r?r.extras.HB:void 0,o?void 0:(o=!0,t(e,u))},u.Yatta_push_HB_element=[s],setTimeout(s,4e3)},void setTimeout(o,1e3)},module.exports=t,"undefined"!=typeof window&&null!==window&&(window.createConnector=t)}).call(this);
|
(function(){var t;t=function(t,n){var e,i,r,o,u,a,s;return u={},i=new DUIClient,i.connect(function(t){var n;return null!=(n=u[t.action])?n.map(function(n){return setTimeout(function(){return n(t)},0)}):void 0}),i.initOK(),a=null,e=function(){function t(t,n,e,r){var o,s,c,l;this.engine=t,this.HB=n,this.execution_listener=e,this.yatta=r,this.duiClient=i,this.iwcHandler=u,l=function(t){return function(n){return t.send(n)}}(this),this.execution_listener.push(l),o=function(t){return function(e){return n=null!=e?e.extras.HB:void 0,t.engine.applyOpsCheckDouble(n)}}(this),u.Yatta_push_HB_element=[o],s=function(t){return function(n){var e;return e=n.extras,t.receive(e)}}(this),this.iwcHandler.Yatta_new_operation=[s],null!=a&&this.engine.applyOpsCheckDouble(a),c=function(t){return function(){var n;return n={HB:t.yatta.getHistoryBuffer()._encode()},t.sendIwcIntent("Yatta_push_HB_element",n)}}(this),this.iwcHandler.Yatta_get_HB_element=[c]}return t.prototype.send=function(t){return t.uid.creator===this.HB.getUserId()&&"string"!=typeof t.uid.op_number?this.sendIwcIntent("Yatta_new_operation",t):void 0},t.prototype.receive=function(t){return t.uid.creator!==this.HB.getUserId()?this.engine.applyOp(t):void 0},t.prototype.sendIwcIntent=function(t,n){var e;return e={action:t,component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:n},this.duiClient.sendIntent(e)},t}(),r={action:"Yatta_get_HB_element",component:"",data:"",dataType:"",flags:["PUBLISH_GLOBAL"],extras:{}},s=function(){return i.sendIntent(r)},o=function(){var i;return setTimeout(s,1e3),i=null,i=null!=n?n:Math.floor(1e6*Math.random()),t(e,i)},void setTimeout(o,1e3)},module.exports=t,"undefined"!=typeof window&&null!==window&&(window.createIwcConnector=t)}).call(this);
|
||||||
//# sourceMappingURL=../Connectors/IwcConnector.js.map
|
//# sourceMappingURL=../Connectors/IwcConnector.js.map
|
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@
|
|||||||
(function(){var n;n=function(n){var e,t;return t=new Peer({key:"h7nlefbgavh1tt9"}),e=function(){function n(n,e,o,i){var r;this.engine=n,this.HB=e,this.execution_listener=o,this.yatta=i,this.peer=t,this.connections=[],this.peer.on("connection",function(n){return function(e){return console.log("received conn"),n.addConnection(e)}}(this)),r=function(n){return function(e){return n.send(e)}}(this),this.execution_listener.push(r)}return n.prototype.connectToPeer=function(n){return this.addConnection(t.connect(n))},n.prototype.addConnection=function(n){var e;return this.connections.push(n),n.on("data",function(n){return function(e){if(console.log("data: "+e),null!=e.HB)return n.engine.applyOpsCheckDouble(e.HB);if(null!=e.op)return n.engine.applyOp(e.op);throw new Error("Can't parse this operation")}}(this)),e=function(e){return function(){return console.log("sending..."),n.send({HB:e.yatta.getHistoryBuffer()._encode()})}}(this),setTimeout(e,1e3)},n.prototype.send=function(n){var e,t,o,i,r;if(n.uid.creator===this.HB.getUserId()&&"string"!=typeof n.uid.op_number){for(console.log("trying to send ops"),i=this.connections,r=[],t=0,o=i.length;o>t;t++)e=i[t],console.log("sent op"),r.push(e.send({op:n}));return r}},n.prototype.receive=function(n){return n.uid.creator!==this.HB.getUserId()?this.engine.applyOp(n):void 0},n}(),t.on("open",function(t){return console.log(t),n(e,t)})},module.exports=n,"undefined"!=typeof window&&null!==window&&(window.createPeerJsConnector=n)}).call(this);
|
(function(){var n;n=function(n){var t,e;return e=new Peer({key:"h7nlefbgavh1tt9"}),t=function(){function n(n,t,o,i){var r;this.engine=n,this.HB=t,this.execution_listener=o,this.yatta=i,this.peer=e,this.connections=[],this.peer.on("connection",function(n){return function(t){return t.send("hey"),n.addConnection(t)}}(this)),r=function(n){return function(t){return n.send(t)}}(this),this.execution_listener.push(r)}return n.prototype.connectToPeer=function(n){return this.addConnection(e.connect(n))},n.prototype.addConnection=function(n){var t;return this.connections.push(n),n.on("data",function(n){return function(t){if("hey"!==t){if(null!=t.HB)return n.engine.applyOpsCheckDouble(t.HB);if(null!=t.op)return n.engine.applyOp(t.op);throw new Error("Can't parse this operation")}}}(this)),t=function(t){return function(){return n.send({HB:t.yatta.getHistoryBuffer()._encode()})}}(this),setTimeout(t,1e3)},n.prototype.send=function(n){var t,e,o,i,r;if(n.uid.creator===this.HB.getUserId()&&"string"!=typeof n.uid.op_number){for(i=this.connections,r=[],e=0,o=i.length;o>e;e++)t=i[e],r.push(t.send({op:n}));return r}},n.prototype.receive=function(n){return n.uid.creator!==this.HB.getUserId()?this.engine.applyOp(n):void 0},n}(),e.on("open",function(e){return n(t,e)})},module.exports=n,"undefined"!=typeof window&&null!==window&&(window.createPeerJsConnector=n)}).call(this);
|
||||||
//# sourceMappingURL=../Connectors/PeerJsConnector.js.map
|
//# sourceMappingURL=../Connectors/PeerJsConnector.js.map
|
@ -1 +1 @@
|
|||||||
{"version":3,"file":"Connectors/PeerJsConnector.js","sources":["Connectors/PeerJsConnector.coffee"],"names":[],"mappings":"CAIA,WAAA,GAAA,EAAA,GAAwB,SAAC,GAEvB,GAAA,GAAA,QAAA,GAAW,GAAA,OAAM,IAAK,oBAKhB,EAAA,WAQS,QAAA,GAAE,EAAS,EAAK,EAAqB,GAEhD,GAAA,EAFY,MAAC,OAAA,EAAQ,KAAC,GAAA,EAAI,KAAC,mBAAA,EAAoB,KAAC,MAAA,EAEhD,KAAC,KAAO,EACR,KAAC,eAED,KAAC,KAAK,GAAG,aAAc,SAAA,SAAA,UAAC,SACtB,SAAQ,IAAI,iBACZ,EAAC,cAAc,KAFM,OAMvB,EAAQ,SAAA,SAAA,UAAC,SACP,GAAC,KAAK,KADA,MAER,KAAC,mBAAmB,KAAK,SAb3B,GAAA,UAeA,cAAe,SAAC,SACd,MAAC,cAAc,EAAK,QAAQ,KAhB9B,EAAA,UAkBA,cAAe,SAAC,GACd,GAAA,SAAA,MAAC,YAAY,KAAK,GAElB,EAAK,GAAG,OAAQ,SAAA,SAAA,UAAC,GAEf,GADA,QAAQ,IAAK,SAAO,GACjB,MAAA,EAAA,SACD,GAAC,OAAO,oBAAoB,EAAK,GAC9B,IAAG,MAAA,EAAA,SACN,GAAC,OAAO,QAAQ,EAAK,GAErB,MAAU,IAAA,OAAM,gCAPJ,OAShB,EAAS,SAAA,SAAA,kBACP,SAAQ,IAAI,cACZ,EAAK,MACH,GAAI,EAAC,MAAM,mBAAmB,cAHzB,MAIT,WAAW,EAAQ,MAlCrB,EAAA,UAwCA,KAAM,SAAC,GACL,GAAA,GAAA,EAAA,EAAA,EAAA,CAAA,IAAG,EAAE,IAAI,UAAW,KAAC,GAAG,aAA6C,gBAA5B,GAAS,IAAI,UAAtD,KACE,QAAQ,IAAI,sBACZ,EAAA,KAAA,YAAA,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,QAAQ,IAAI,WAAZ,EAAA,KACA,EAAK,MACH,GAAI,gBA9CZ,EAAA,UAoDA,QAAS,SAAC,GACR,MAAG,GAAE,IAAI,UAAa,KAAC,GAAG,YACxB,KAAC,OAAO,QAAQ,GADlB,aAGJ,EAAK,GAAG,OAAQ,SAAC,SACf,SAAQ,IAAI,GACZ,EAAS,EAAiB,MAG9B,OAAO,QAAU,8CACjB,OAAQ,sBAAwB","sourcesContent":["\n#\n# @param {Function} callback The callback is called when the connector is initialized.\n#\ncreatePeerJsConnector = (callback)->\n\n peer = new Peer {key: 'h7nlefbgavh1tt9'}\n\n #\n # @see http://peerjs.com\n #\n class PeerJsConnector\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, @yatta)->\n\n @peer = peer\n @connections = []\n\n @peer.on 'connection', (conn)=>\n console.log \"received conn\"\n @addConnection conn\n\n\n\n send_ = (o)=>\n @send o\n @execution_listener.push send_\n\n connectToPeer: (id)->\n @addConnection peer.connect id\n\n addConnection: (conn)->\n @connections.push conn\n\n conn.on 'data', (data)=>\n console.log \"data: #{data}\"\n if data.HB?\n @engine.applyOpsCheckDouble data.HB\n else if data.op?\n @engine.applyOp data.op\n else\n throw new Error \"Can't parse this operation\"\n\n sendHB = ()=>\n console.log \"sending...\"\n conn.send\n HB: @yatta.getHistoryBuffer()._encode()\n setTimeout sendHB, 1000\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 console.log \"trying to send ops\"\n for conn in @connections\n console.log \"sent op\"\n conn.send\n op: 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 if o.uid.creator isnt @HB.getUserId()\n @engine.applyOp o\n\n peer.on 'open', (id)->\n console.log id\n callback PeerJsConnector, id\n\n\nmodule.exports = createPeerJsConnector\nwindow?.createPeerJsConnector = createPeerJsConnector\n\n"],"sourceRoot":"/source/"}
|
{"version":3,"file":"Connectors/PeerJsConnector.js","sources":["Connectors/PeerJsConnector.coffee"],"names":[],"mappings":"CAIA,WAAA,GAAA,EAAA,GAAwB,SAAC,GAEvB,GAAA,GAAA,QAAA,GAAW,GAAA,OAAM,IAAK,oBAKhB,EAAA,WAQS,QAAA,GAAE,EAAS,EAAK,EAAqB,GAEhD,GAAA,EAFY,MAAC,OAAA,EAAQ,KAAC,GAAA,EAAI,KAAC,mBAAA,EAAoB,KAAC,MAAA,EAEhD,KAAC,KAAO,EACR,KAAC,eAED,KAAC,KAAK,GAAG,aAAc,SAAA,SAAA,UAAC,SACtB,GAAK,KAAK,OACV,EAAC,cAAc,KAFM,OAOvB,EAAQ,SAAA,SAAA,UAAC,SACP,GAAC,KAAK,KADA,MAER,KAAC,mBAAmB,KAAK,SAd3B,GAAA,UAgBA,cAAe,SAAC,SACd,MAAC,cAAc,EAAK,QAAQ,KAjB9B,EAAA,UAmBA,cAAe,SAAC,GACd,GAAA,SAAA,MAAC,YAAY,KAAK,GAElB,EAAK,GAAG,OAAQ,SAAA,SAAA,UAAC,GACf,GAAW,QAAR,EACE,CAAA,GAAG,MAAA,EAAA,SACN,GAAC,OAAO,oBAAoB,EAAK,GAC9B,IAAG,MAAA,EAAA,SACN,GAAC,OAAO,QAAQ,EAAK,GAErB,MAAU,IAAA,OAAM,iCAPJ,OAShB,EAAS,SAAA,SAAA,kBACP,GAAK,MACH,GAAI,EAAC,MAAM,mBAAmB,cAFzB,MAGT,WAAW,EAAQ,MAlCrB,EAAA,UAwCA,KAAM,SAAC,GACL,GAAA,GAAA,EAAA,EAAA,EAAA,CAAA,IAAG,EAAE,IAAI,UAAW,KAAC,GAAG,aAA6C,gBAA5B,GAAS,IAAI,UAAtD,KACE,EAAA,KAAA,YAAA,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,EAAA,KAAA,EAAK,MACH,GAAI,gBA5CZ,EAAA,UAkDA,QAAS,SAAC,GACR,MAAG,GAAE,IAAI,UAAa,KAAC,GAAG,YACxB,KAAC,OAAO,QAAQ,GADlB,aAGJ,EAAK,GAAG,OAAQ,SAAC,SACf,GAAS,EAAiB,MAG9B,OAAO,QAAU,8CACjB,OAAQ,sBAAwB","sourcesContent":["\n#\n# @param {Function} callback The callback is called when the connector is initialized.\n#\ncreatePeerJsConnector = (callback)->\n\n peer = new Peer {key: 'h7nlefbgavh1tt9'}\n\n #\n # @see http://peerjs.com\n #\n class PeerJsConnector\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, @yatta)->\n\n @peer = peer\n @connections = []\n\n @peer.on 'connection', (conn)=>\n conn.send \"hey\"\n @addConnection conn\n\n\n\n\n send_ = (o)=>\n @send o\n @execution_listener.push send_\n\n connectToPeer: (id)->\n @addConnection peer.connect id\n\n addConnection: (conn)->\n @connections.push conn\n\n conn.on 'data', (data)=>\n if data is \"hey\"\n else if data.HB?\n @engine.applyOpsCheckDouble data.HB\n else if data.op?\n @engine.applyOp data.op\n else\n throw new Error \"Can't parse this operation\"\n\n sendHB = ()=>\n conn.send\n HB: @yatta.getHistoryBuffer()._encode()\n setTimeout sendHB, 1000\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 conn in @connections\n conn.send\n op: 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 if o.uid.creator isnt @HB.getUserId()\n @engine.applyOp o\n\n peer.on 'open', (id)->\n callback PeerJsConnector, id\n\n\nmodule.exports = createPeerJsConnector\nwindow?.createPeerJsConnector = createPeerJsConnector\n\n"],"sourceRoot":"/source/"}
|
@ -1,2 +1,2 @@
|
|||||||
(function(){var t;t=function(){function t(t,e){this.HB=t,this.parser=e,this.unprocessed_ops=[]}return t.prototype.parseOperation=function(t){var e;if(e=this.parser[t.type],null!=e)return e(t);throw new Error("You forgot to specify a parser for type "+t.type+". The message is "+JSON.stringify(t)+".")},t.prototype.applyOpsBundle=function(t){var e,r,p,s,o,n,i,u;for(r=[],p=0,n=t.length;n>p;p++)e=t[p],r.push(this.parseOperation(e));for(s=0,i=r.length;i>s;s++)e=r[s],this.HB.addOperation(e);for(o=0,u=r.length;u>o;o++)e=r[o],e.execute()||this.unprocessed_ops.push(e);return this.tryUnprocessed()},t.prototype.applyOpsCheckDouble=function(t){var e,r,p,s;for(s=[],r=0,p=t.length;p>r;r++)e=t[r],s.push(null!=this.HB.getOperation(e.uid)?this.applyOp(e):void 0);return s},t.prototype.applyOps=function(t){var e,r,p,s;for(s=[],r=0,p=t.length;p>r;r++)e=t[r],s.push(this.applyOp(e));return s},t.prototype.applyOp=function(t){var e;return e=this.parseOperation(t),this.HB.addToCounter(e),e.execute()?this.HB.addOperation(e):this.unprocessed_ops.push(e),this.tryUnprocessed()},t.prototype.tryUnprocessed=function(){var t,e,r,p,s,o,n;for(n=[];;){for(t=this.unprocessed_ops.length,r=[],o=this.unprocessed_ops,p=0,s=o.length;s>p;p++)e=o[p],e.execute()?this.HB.addOperation(e):r.push(e);if(this.unprocessed_ops=r,this.unprocessed_ops.length===t)break;n.push(void 0)}return n},t}(),module.exports=t}).call(this);
|
(function(){var t;t=function(){function t(t,e){this.HB=t,this.parser=e,this.unprocessed_ops=[]}return t.prototype.parseOperation=function(t){var e;if(e=this.parser[t.type],null!=e)return e(t);throw new Error("You forgot to specify a parser for type "+t.type+". The message is "+JSON.stringify(t)+".")},t.prototype.applyOpsBundle=function(t){var e,r,p,s,o,n,i,u;for(r=[],p=0,n=t.length;n>p;p++)e=t[p],r.push(this.parseOperation(e));for(s=0,i=r.length;i>s;s++)e=r[s],this.HB.addOperation(e);for(o=0,u=r.length;u>o;o++)e=r[o],e.execute()||this.unprocessed_ops.push(e);return this.tryUnprocessed()},t.prototype.applyOpsCheckDouble=function(t){var e,r,p,s;for(s=[],r=0,p=t.length;p>r;r++)e=t[r],s.push(null==this.HB.getOperation(e.uid)?this.applyOp(e):void 0);return s},t.prototype.applyOps=function(t){var e,r,p,s;for(s=[],r=0,p=t.length;p>r;r++)e=t[r],s.push(this.applyOp(e));return s},t.prototype.applyOp=function(t){var e;return e=this.parseOperation(t),this.HB.addToCounter(e),e.execute()?this.HB.addOperation(e):this.unprocessed_ops.push(e),this.tryUnprocessed()},t.prototype.tryUnprocessed=function(){var t,e,r,p,s,o,n;for(n=[];;){for(t=this.unprocessed_ops.length,r=[],o=this.unprocessed_ops,p=0,s=o.length;s>p;p++)e=o[p],e.execute()?this.HB.addOperation(e):r.push(e);if(this.unprocessed_ops=r,this.unprocessed_ops.length===t)break;n.push(void 0)}return n},t}(),module.exports=t}).call(this);
|
||||||
//# sourceMappingURL=Engine.js.map
|
//# sourceMappingURL=Engine.js.map
|
@ -1 +1 @@
|
|||||||
{"version":3,"file":"Engine.js","sources":["Engine.coffee"],"names":[],"mappings":"CAIA,WAAA,GAAA,EAAM,GAAA,WAMS,QAAA,GAAE,EAAK,GAAN,KAAC,GAAA,EAAI,KAAC,OAAA,EAClB,KAAC,yBADH,GAAA,UAMA,eAAgB,SAAC,GACf,GAAA,EACA,IADA,EAAa,KAAC,OAAO,EAAK,MACvB,MAAA,QACD,GAAW,EAEX,MAAU,IAAA,OAAO,2CAAyC,EAAK,KAAM,oBAAkB,KAAK,UAAU,GAAM,MAXhH,EAAA,UAiBA,eAAgB,SAAC,GACf,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CACA,KADA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,EAAI,KAAK,KAAC,eAAe,GAC3B,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,KAAC,GAAG,aAAa,EACnB,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACK,EAAM,WACP,KAAC,gBAAgB,KAAK,SAC1B,MAAC,kBA1BH,EAAA,UAgCA,oBAAqB,SAAC,GACpB,GAAA,GAAA,EAAA,EAAA,MAAA,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBACK,MAAA,KAAA,GAAA,aAAA,EAAA,KACD,KAAC,QAAQ,qBAnCf,EAAA,UAwCA,SAAU,SAAC,GACT,GAAA,GAAA,EAAA,EAAA,MAAA,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,EAAA,KAAA,KAAC,QAAQ,cA1Cb,EAAA,UA+CA,QAAS,SAAC,GAER,GAAA,SAAA,GAAI,KAAC,eAAe,GACpB,KAAC,GAAG,aAAa,GAEd,EAAM,UAGP,KAAC,GAAG,aAAa,GAFjB,KAAC,gBAAgB,KAAK,GAGxB,KAAC,kBAxDH,EAAA,UA8DA,eAAgB,WACd,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,MAAA,OAAA,CAGE,IAFA,EAAa,KAAC,gBAAgB,OAC9B,KACA,EAAA,KAAA,gBAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACK,EAAO,UAGR,KAAC,GAAG,aAAa,GAFjB,EAAY,KAAK,EAIrB,IADA,KAAC,gBAAkB,EAChB,KAAC,gBAAgB,SAAU,EAC5B,oCAKR,OAAO,QAAU","sourcesContent":["\r\n#\r\n# The Engine handles how and in which order to execute operations and add operations to the HistoryBuffer.\r\n#\r\nclass Engine\r\n\r\n #\r\n # @param {HistoryBuffer} HB\r\n # @param {Array} parser Defines how to parse encoded messages.\r\n #\r\n constructor: (@HB, @parser)->\r\n @unprocessed_ops = []\r\n\r\n #\r\n # Parses an operatio from the json format. It uses the specified parser in your OperationType module.\r\n #\r\n parseOperation: (json)->\r\n typeParser = @parser[json.type]\r\n if typeParser?\r\n typeParser json\r\n else\r\n throw new Error \"You forgot to specify a parser for type #{json.type}. The message is #{JSON.stringify json}.\"\r\n\r\n #\r\n # Apply a set of operations. E.g. the operations you received from another users HB.toJson().\r\n # @note You must not use this method when you already have ops in your HB!\r\n #\r\n applyOpsBundle: (ops_json)->\r\n ops = []\r\n for o in ops_json\r\n ops.push @parseOperation o\r\n for o in ops\r\n @HB.addOperation o\r\n for o in ops\r\n if not o.execute()\r\n @unprocessed_ops.push o\r\n @tryUnprocessed()\r\n\r\n #\r\n # Same as applyOps but operations that are already in the HB are not applied.\r\n # @see Engine.applyOps\r\n #\r\n applyOpsCheckDouble: (ops_json)->\r\n for o in ops_json\r\n if @HB.getOperation(o.uid)?\r\n @applyOp o\r\n\r\n #\r\n # Apply a set of operations. (Helper for using applyOp on Arrays)\r\n # @see Engine.applyOp\r\n applyOps: (ops_json)->\r\n for o in ops_json\r\n @applyOp o\r\n\r\n #\r\n # Apply an operation that you received from another peer.\r\n #\r\n applyOp: (op_json)->\r\n # $parse_and_execute will return false if $o_json was parsed and executed, otherwise the parsed operadion\r\n o = @parseOperation op_json\r\n @HB.addToCounter o\r\n # @HB.addOperation o\r\n if not o.execute()\r\n @unprocessed_ops.push o\r\n else\r\n @HB.addOperation o\r\n @tryUnprocessed()\r\n\r\n #\r\n # Call this method when you applied a new operation.\r\n # It checks if operations that were previously not executable are now executable.\r\n #\r\n tryUnprocessed: ()->\r\n while true\r\n old_length = @unprocessed_ops.length\r\n unprocessed = []\r\n for op in @unprocessed_ops\r\n if not op.execute()\r\n unprocessed.push op\r\n else\r\n @HB.addOperation op\r\n @unprocessed_ops = unprocessed\r\n if @unprocessed_ops.length is old_length\r\n break\r\n\r\n\r\n\r\n\r\nmodule.exports = Engine\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"],"sourceRoot":"/source/"}
|
{"version":3,"file":"Engine.js","sources":["Engine.coffee"],"names":[],"mappings":"CAIA,WAAA,GAAA,EAAM,GAAA,WAMS,QAAA,GAAE,EAAK,GAAN,KAAC,GAAA,EAAI,KAAC,OAAA,EAClB,KAAC,yBADH,GAAA,UAMA,eAAgB,SAAC,GACf,GAAA,EACA,IADA,EAAa,KAAC,OAAO,EAAK,MACvB,MAAA,QACD,GAAW,EAEX,MAAU,IAAA,OAAO,2CAAyC,EAAK,KAAM,oBAAkB,KAAK,UAAU,GAAM,MAXhH,EAAA,UAiBA,eAAgB,SAAC,GACf,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CACA,KADA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,EAAI,KAAK,KAAC,eAAe,GAC3B,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,KAAC,GAAG,aAAa,EACnB,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACK,EAAM,WACP,KAAC,gBAAgB,KAAK,SAC1B,MAAC,kBA1BH,EAAA,UAgCA,oBAAqB,SAAC,GACpB,GAAA,GAAA,EAAA,EAAA,MAAA,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBACS,MAAA,KAAA,GAAA,aAAA,EAAA,KACL,KAAC,QAAQ,qBAnCf,EAAA,UAwCA,SAAU,SAAC,GACT,GAAA,GAAA,EAAA,EAAA,MAAA,KAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACE,EAAA,KAAA,KAAC,QAAQ,cA1Cb,EAAA,UA+CA,QAAS,SAAC,GAER,GAAA,SAAA,GAAI,KAAC,eAAe,GACpB,KAAC,GAAG,aAAa,GAEd,EAAM,UAGP,KAAC,GAAG,aAAa,GAFjB,KAAC,gBAAgB,KAAK,GAGxB,KAAC,kBAxDH,EAAA,UA8DA,eAAgB,WACd,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,MAAA,OAAA,CAGE,IAFA,EAAa,KAAC,gBAAgB,OAC9B,KACA,EAAA,KAAA,gBAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WACK,EAAO,UAGR,KAAC,GAAG,aAAa,GAFjB,EAAY,KAAK,EAIrB,IADA,KAAC,gBAAkB,EAChB,KAAC,gBAAgB,SAAU,EAC5B,oCAKR,OAAO,QAAU","sourcesContent":["\r\n#\r\n# The Engine handles how and in which order to execute operations and add operations to the HistoryBuffer.\r\n#\r\nclass Engine\r\n\r\n #\r\n # @param {HistoryBuffer} HB\r\n # @param {Array} parser Defines how to parse encoded messages.\r\n #\r\n constructor: (@HB, @parser)->\r\n @unprocessed_ops = []\r\n\r\n #\r\n # Parses an operatio from the json format. It uses the specified parser in your OperationType module.\r\n #\r\n parseOperation: (json)->\r\n typeParser = @parser[json.type]\r\n if typeParser?\r\n typeParser json\r\n else\r\n throw new Error \"You forgot to specify a parser for type #{json.type}. The message is #{JSON.stringify json}.\"\r\n\r\n #\r\n # Apply a set of operations. E.g. the operations you received from another users HB.toJson().\r\n # @note You must not use this method when you already have ops in your HB!\r\n #\r\n applyOpsBundle: (ops_json)->\r\n ops = []\r\n for o in ops_json\r\n ops.push @parseOperation o\r\n for o in ops\r\n @HB.addOperation o\r\n for o in ops\r\n if not o.execute()\r\n @unprocessed_ops.push o\r\n @tryUnprocessed()\r\n\r\n #\r\n # Same as applyOps but operations that are already in the HB are not applied.\r\n # @see Engine.applyOps\r\n #\r\n applyOpsCheckDouble: (ops_json)->\r\n for o in ops_json\r\n if not @HB.getOperation(o.uid)?\r\n @applyOp o\r\n\r\n #\r\n # Apply a set of operations. (Helper for using applyOp on Arrays)\r\n # @see Engine.applyOp\r\n applyOps: (ops_json)->\r\n for o in ops_json\r\n @applyOp o\r\n\r\n #\r\n # Apply an operation that you received from another peer.\r\n #\r\n applyOp: (op_json)->\r\n # $parse_and_execute will return false if $o_json was parsed and executed, otherwise the parsed operadion\r\n o = @parseOperation op_json\r\n @HB.addToCounter o\r\n # @HB.addOperation o\r\n if not o.execute()\r\n @unprocessed_ops.push o\r\n else\r\n @HB.addOperation o\r\n @tryUnprocessed()\r\n\r\n #\r\n # Call this method when you applied a new operation.\r\n # It checks if operations that were previously not executable are now executable.\r\n #\r\n tryUnprocessed: ()->\r\n while true\r\n old_length = @unprocessed_ops.length\r\n unprocessed = []\r\n for op in @unprocessed_ops\r\n if not op.execute()\r\n unprocessed.push op\r\n else\r\n @HB.addOperation op\r\n @unprocessed_ops = unprocessed\r\n if @unprocessed_ops.length is old_length\r\n break\r\n\r\n\r\n\r\n\r\nmodule.exports = Engine\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"],"sourceRoot":"/source/"}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@
|
|||||||
(function(){var e,t={}.hasOwnProperty,n=function(e,n){function i(){this.constructor=e}for(var r in n)t.call(n,r)&&(e[r]=n[r]);return i.prototype=n.prototype,e.prototype=new i,e.__super__=n.prototype,e};e=require("./BasicTypes"),module.exports=function(t){var i,r,a,o,p,s,u,c;return s=e(t),c=s.types,u=s.parser,a=function(e){function r(e){this.map={},r.__super__.constructor.call(this,e)}return n(r,e),r.prototype.val=function(e,n){var a,o,p,s,u;if(null!=n)return null==this.map[e]&&t.addOperation(new i(void 0,this,e)).execute(),this.map[e].replace(n),this;if(null!=e)return o=null!=(s=this.map[e])?s.val():void 0,o instanceof c.ImmutableObject?o.val():o;p={},u=this.map;for(e in u)a=u[e],o=a.val(),(o instanceof c.ImmutableObject||o instanceof r)&&(o=o.val()),p[e]=o;return p},r}(c.Operation),i=function(e){function i(e,t,n){this.name=n,this.saveOperation("map_manager",t),i.__super__.constructor.call(this,e)}return n(i,e),i.prototype.execute=function(){var e,n,r,a,p;return this.validateSavedOperations()?(p=this.map_manager.getUid(),p.op_number="_"+p.op_number+"_RM_"+this.name,null==t.getOperation(p)&&(r=this.map_manager.getUid(),r.op_number="_"+r.op_number+"_RM_"+this.name+"_beginning",a=this.map_manager.getUid(),a.op_number="_"+a.op_number+"_RM_"+this.name+"_end",e=t.addOperation(new c.Delimiter(r,void 0,a)).execute(),n=t.addOperation(new c.Delimiter(a,e,void 0)).execute(),this.map_manager.map[this.name]=t.addOperation(new o(void 0,p,e,n)).execute()),i.__super__.execute.apply(this,arguments)):!1},i.prototype._encode=function(){return{type:"AddName",uid:this.getUid(),map_manager:this.map_manager.getUid(),name:this.name}},i}(c.Operation),u.AddName=function(e){var t,n,r;return t=e.map_manager,r=e.uid,n=e.name,new i(r,t,n)},r=function(e){function i(e,n,r,a,o,p){null!=n&&null!=r?(this.saveOperation("beginning",n),this.saveOperation("end",r)):(this.beginning=t.addOperation(new c.Delimiter(void 0,void 0,void 0)),this.end=t.addOperation(new c.Delimiter(void 0,this.beginning,void 0)),this.beginning.next_cl=this.end,this.beginning.execute(),this.end.execute()),i.__super__.constructor.call(this,e,a,o,p)}return n(i,e),i.prototype.getLastOperation=function(){return this.end.prev_cl},i.prototype.getFirstOperation=function(){return this.beginning.next_cl},i.prototype.toArray=function(){var e,t;for(e=this.beginning.next_cl,t=[];e!==this.end;)t.push(e),e=e.next_cl;return t},i.prototype.getOperationByPosition=function(e){var t;if(t=this.beginning.next_cl,e>0)for(;;){if(t=t.next_cl,t.isDeleted()||(e-=1),0===e)break;if(t instanceof c.Delimiter)throw new Error("position parameter exceeded the length of the document!")}return t},i}(c.Insert),o=function(e){function i(e,t,n,r,a,o,p){i.__super__.constructor.call(this,t,n,r,a,o,p),null!=e&&this.replace(e)}return n(i,e),i.prototype.replace=function(e){var n,i;return n=this.getLastOperation(),i=new p(e,this,void 0,n,n.next_cl),t.addOperation(i).execute()},i.prototype.val=function(){var e;if(e=this.getLastOperation(),e instanceof c.Delimiter)throw new Error("dtrn");return e.val()},i.prototype._encode=function(){var e;return e={type:"ReplaceManager",uid:this.getUid(),beginning:this.beginning.getUid(),end:this.end.getUid()},null!=this.prev_cl&&null!=this.next_cl&&(e.prev=this.prev_cl.getUid(),e.next=this.next_cl.getUid()),null!=this.origin&&this.origin!==this.prev_cl&&(e.origin=this.origin.getUid()),e},i}(r),u.ReplaceManager=function(e){var t,n,i,r,a,p,s;return n=e.content,s=e.uid,p=e.prev,r=e.next,a=e.origin,t=e.beginning,i=e.end,new o(n,s,t,i,p,r,a)},p=function(e){function t(e,n,i,r,a,o){if(this.saveOperation("content",e),this.saveOperation("parent",n),null==r||null==a||null==e)throw new Error("You must define content, prev, and next for Replaceable-types!");t.__super__.constructor.call(this,i,r,a,o)}return n(t,e),t.prototype.val=function(){return this.content},t.prototype.replace=function(e){return this.parent.replace(e)},t.prototype.execute=function(){var e;return this.validateSavedOperations()?("function"==typeof(e=this.content).setReplaceManager&&e.setReplaceManager(this.parent),t.__super__.execute.apply(this,arguments),this):!1},t.prototype._encode=function(){var e;return e={type:"Replaceable",content:this.content.getUid(),ReplaceManager:this.parent.getUid(),prev:this.prev_cl.getUid(),next:this.next_cl.getUid(),uid:this.getUid()},null!=this.origin&&this.origin!==this.prev_cl&&(e.origin=this.origin.getUid()),e},t}(c.Insert),u.Replaceable=function(e){var t,n,i,r,a,o;return t=e.content,r=e.ReplaceManager,o=e.uid,a=e.prev,n=e.next,i=e.origin,new p(t,r,o,a,n,i)},c.ListManager=r,c.MapManager=a,c.ReplaceManager=o,c.Replaceable=p,s}}).call(this);
|
(function(){var e,t={}.hasOwnProperty,n=function(e,n){function i(){this.constructor=e}for(var r in n)t.call(n,r)&&(e[r]=n[r]);return i.prototype=n.prototype,e.prototype=new i,e.__super__=n.prototype,e};e=require("./BasicTypes"),module.exports=function(t){var i,r,a,o,p,s,u,c;return s=e(t),c=s.types,u=s.parser,a=function(e){function r(e){this.map={},r.__super__.constructor.call(this,e)}return n(r,e),r.prototype.val=function(e,n){var a,o,p,s,u;if(null!=n)return null==this.map[e]&&t.addOperation(new i(void 0,this,e)).execute(),this.map[e].replace(n),this;if(null!=e)return o=null!=(s=this.map[e])?s.val():void 0,o instanceof c.ImmutableObject?o.val():o;p={},u=this.map;for(e in u)a=u[e],o=a.val(),(o instanceof c.ImmutableObject||o instanceof r)&&(o=o.val()),p[e]=o;return p},r}(c.Operation),i=function(e){function i(e,t,n){this.name=n,this.saveOperation("map_manager",t),i.__super__.constructor.call(this,e)}return n(i,e),i.prototype.execute=function(){var e,n,r,a,p;return this.validateSavedOperations()?(p=this.map_manager.getUid(),p.op_number="_"+p.op_number+"_RM_"+this.name,null==t.getOperation(p)&&(r=this.map_manager.getUid(),r.op_number="_"+r.op_number+"_RM_"+this.name+"_beginning",a=this.map_manager.getUid(),a.op_number="_"+a.op_number+"_RM_"+this.name+"_end",e=t.addOperation(new c.Delimiter(r,void 0,a)).execute(),n=t.addOperation(new c.Delimiter(a,e,void 0)).execute(),this.map_manager.map[this.name]=t.addOperation(new o(void 0,p,e,n)).execute()),i.__super__.execute.apply(this,arguments)):!1},i.prototype._encode=function(){return{type:"AddName",uid:this.getUid(),map_manager:this.map_manager.getUid(),name:this.name}},i}(c.Operation),u.AddName=function(e){var t,n,r;return t=e.map_manager,r=e.uid,n=e.name,new i(r,t,n)},r=function(e){function i(e,n,r,a,o,p){null!=n&&null!=r?(this.saveOperation("beginning",n),this.saveOperation("end",r)):(this.beginning=t.addOperation(new c.Delimiter(void 0,void 0,void 0)),this.end=t.addOperation(new c.Delimiter(void 0,this.beginning,void 0)),this.beginning.next_cl=this.end,this.beginning.execute(),this.end.execute()),i.__super__.constructor.call(this,e,a,o,p)}return n(i,e),i.prototype.getLastOperation=function(){return this.end.prev_cl},i.prototype.getFirstOperation=function(){return this.beginning.next_cl},i.prototype.toArray=function(){var e,t;for(e=this.beginning.next_cl,t=[];e!==this.end;)t.push(e),e=e.next_cl;return t},i.prototype.getOperationByPosition=function(e){var t;if(t=this.beginning.next_cl,e>0)for(;;){if(t=t.next_cl,t.isDeleted()||(e-=1),0===e)break;if(t instanceof c.Delimiter)throw new Error("position parameter exceeded the length of the document!")}return t},i}(c.Insert),o=function(e){function i(e,t,n,r,a,o,p){i.__super__.constructor.call(this,t,n,r,a,o,p),null!=e&&this.replace(e)}return n(i,e),i.prototype.replace=function(e){var n,i;return n=this.getLastOperation(),i=new p(e,this,void 0,n,n.next_cl),t.addOperation(i).execute()},i.prototype.val=function(){var e;if(e=this.getLastOperation(),e instanceof c.Delimiter)throw new Error("dtrn");return e.val()},i.prototype._encode=function(){var e;return e={type:"ReplaceManager",uid:this.getUid(),beginning:this.beginning.getUid(),end:this.end.getUid()},null!=this.prev_cl&&null!=this.next_cl&&(e.prev=this.prev_cl.getUid(),e.next=this.next_cl.getUid()),null!=this.origin&&this.origin!==this.prev_cl&&(e.origin=this.origin.getUid()),e},i}(r),u.ReplaceManager=function(e){var t,n,i,r,a,p,s;return n=e.content,s=e.uid,p=e.prev,r=e.next,a=e.origin,t=e.beginning,i=e.end,new o(n,s,t,i,p,r,a)},p=function(e){function t(e,n,i,r,a,o){if(this.saveOperation("content",e),this.saveOperation("parent",n),null==r||null==a||null==e)throw new Error("You must define content, prev, and next for Replaceable-types!");t.__super__.constructor.call(this,i,r,a,o)}return n(t,e),t.prototype.val=function(){return this.content},t.prototype.replace=function(e){return this.parent.replace(e)},t.prototype.execute=function(){var e;return this.validateSavedOperations()?("function"==typeof(e=this.content).setReplaceManager&&e.setReplaceManager(this.parent),t.__super__.execute.apply(this,arguments)):!1},t.prototype._encode=function(){var e;return e={type:"Replaceable",content:this.content.getUid(),ReplaceManager:this.parent.getUid(),prev:this.prev_cl.getUid(),next:this.next_cl.getUid(),uid:this.getUid()},null!=this.origin&&this.origin!==this.prev_cl&&(e.origin=this.origin.getUid()),e},t}(c.Insert),u.Replaceable=function(e){var t,n,i,r,a,o;return t=e.content,r=e.ReplaceManager,o=e.uid,a=e.prev,n=e.next,i=e.origin,new p(t,r,o,a,n,i)},c.ListManager=r,c.MapManager=a,c.ReplaceManager=o,c.Replaceable=p,s}}).call(this);
|
||||||
//# sourceMappingURL=../Types/StructuredTypes.js.map
|
//# sourceMappingURL=../Types/StructuredTypes.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
31
examples/Iwc/README.md
Normal file
31
examples/Iwc/README.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
## IWC + JSON Example
|
||||||
|
Here, I will give a short overview on how to use the IwcJson Framework in Role-SDK widgets.
|
||||||
|
First you have to include the following libraries in your widget file:
|
||||||
|
```
|
||||||
|
<script src="http://open-app.googlecode.com/files/openapp.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/gadgets/iwc/lib/iwc.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/~jahns/role-widgets/widgetbundles/libraries/DUIClient.js"></script>
|
||||||
|
<script src="../../build/browser/Frameworks/JsonYatta.min.js"></script>
|
||||||
|
<script src="../../build/browser/Connectors/IwcConnector.min.js"></script>
|
||||||
|
<script src="./index.js"></script>
|
||||||
|
```
|
||||||
|
A working widget implementation is [IwcJson.xml](./IwcJson.xml) and the js-file is [index.js](./index.js)
|
||||||
|
|
||||||
|
|
||||||
|
```js
|
||||||
|
function init(){
|
||||||
|
createIwcConnector(function(Connector, user_id){
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
You don't have to use the proposed user_id.
|
||||||
|
|
||||||
|
|
||||||
|
```js
|
||||||
|
console.log("me is number 2")
|
||||||
|
yatta = new JsonYatta(2, Connector);
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
window.onload = init
|
||||||
|
```
|
32
examples/Iwc/index1.js
Normal file
32
examples/Iwc/index1.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
## IWC + JSON Example
|
||||||
|
Here, I will give a short overview on how to use the IwcJson Framework in Role-SDK widgets.
|
||||||
|
First you have to include the following libraries in your widget file:
|
||||||
|
```
|
||||||
|
<script src="http://open-app.googlecode.com/files/openapp.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/gadgets/iwc/lib/iwc.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/~jahns/role-widgets/widgetbundles/libraries/DUIClient.js"></script>
|
||||||
|
<script src="../../build/browser/Frameworks/JsonYatta.min.js"></script>
|
||||||
|
<script src="../../build/browser/Connectors/IwcConnector.min.js"></script>
|
||||||
|
<script src="./index.js"></script>
|
||||||
|
```
|
||||||
|
A working widget implementation is [IwcJson.xml](./IwcJson.xml) and the js-file is [index.js](./index.js)
|
||||||
|
*/
|
||||||
|
function init(){
|
||||||
|
createIwcConnector(function(Connector, user_id){
|
||||||
|
/**
|
||||||
|
You don't have to use the proposed user_id.
|
||||||
|
*/
|
||||||
|
// console.log("me is number 1");
|
||||||
|
// yatta = new JsonYatta(1, Connector);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Though, it is recommended to use the user_id
|
||||||
|
*/
|
||||||
|
yatta = new JsonYatta(user_id, Connector);
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
window.onload = init
|
26
examples/Iwc/index2.js
Normal file
26
examples/Iwc/index2.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
## IWC + JSON Example
|
||||||
|
Here, I will give a short overview on how to use the IwcJson Framework in Role-SDK widgets.
|
||||||
|
First you have to include the following libraries in your widget file:
|
||||||
|
```
|
||||||
|
<script src="http://open-app.googlecode.com/files/openapp.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/gadgets/iwc/lib/iwc.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/~jahns/role-widgets/widgetbundles/libraries/DUIClient.js"></script>
|
||||||
|
<script src="../../build/browser/Frameworks/JsonYatta.min.js"></script>
|
||||||
|
<script src="../../build/browser/Connectors/IwcConnector.min.js"></script>
|
||||||
|
<script src="./index.js"></script>
|
||||||
|
```
|
||||||
|
A working widget implementation is [IwcJson.xml](./IwcJson.xml) and the js-file is [index.js](./index.js)
|
||||||
|
*/
|
||||||
|
function init(){
|
||||||
|
createIwcConnector(function(Connector, user_id){
|
||||||
|
/**
|
||||||
|
You don't have to use the proposed user_id.
|
||||||
|
*/
|
||||||
|
console.log("me is number 2")
|
||||||
|
yatta = new JsonYatta(2, Connector);
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
window.onload = init
|
17
examples/Iwc/test1.xml
Normal file
17
examples/Iwc/test1.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Module>
|
||||||
|
<ModulePrefs title="Video upload" description="Upload videos in Sevianno" author="Kevin Jahns, Chair of Computer Science 5, RWTH Aachen University, Germany" author_email="jahns@dbis.rwth-aachen.de" scrolling="true">
|
||||||
|
<Require feature="dynamic-height"/>
|
||||||
|
|
||||||
|
</ModulePrefs>
|
||||||
|
|
||||||
|
<Content type="html"><![CDATA[
|
||||||
|
<script src="http://open-app.googlecode.com/files/openapp.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/gadgets/iwc/lib/iwc.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/~jahns/role-widgets/widgetbundles/libraries/DUIClient.js"></script>
|
||||||
|
<script src="../../build/browser/Connectors/IwcConnector.min.js"></script>
|
||||||
|
<script src="../../build/browser/Frameworks/JsonYatta.min.js"></script>
|
||||||
|
<script src="./index1.js"></script>
|
||||||
|
<h1> Collaborative Json Widget 1</h1>
|
||||||
|
]]></Content>
|
||||||
|
</Module>
|
17
examples/Iwc/test2.xml
Normal file
17
examples/Iwc/test2.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Module>
|
||||||
|
<ModulePrefs title="Video upload" description="Upload videos in Sevianno" author="Kevin Jahns, Chair of Computer Science 5, RWTH Aachen University, Germany" author_email="jahns@dbis.rwth-aachen.de" scrolling="true">
|
||||||
|
<Require feature="dynamic-height"/>
|
||||||
|
|
||||||
|
</ModulePrefs>
|
||||||
|
|
||||||
|
<Content type="html"><![CDATA[
|
||||||
|
<script src="http://open-app.googlecode.com/files/openapp.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/gadgets/iwc/lib/iwc.js"></script>
|
||||||
|
<script src="http://dbis.rwth-aachen.de/~jahns/role-widgets/widgetbundles/libraries/DUIClient.js"></script>
|
||||||
|
<script src="../../build/browser/Connectors/IwcConnector.min.js"></script>
|
||||||
|
<script src="../../build/browser/Frameworks/JsonYatta.min.js"></script>
|
||||||
|
<script src="./index2.js"></script>
|
||||||
|
<h1> Collaborative Json Widget 2</h1>
|
||||||
|
]]></Content>
|
||||||
|
</Module>
|
@ -14,7 +14,7 @@ A working widget implementation is [IwcJson.xml](./IwcJson.xml) and the js-file
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
function init(){
|
function init(){
|
||||||
createConnector(function(Connector, user_id){
|
createIwcConnector(function(Connector, user_id){
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
A working widget implementation is [IwcJson.xml](./IwcJson.xml) and the js-file is [index.js](./index.js)
|
A working widget implementation is [IwcJson.xml](./IwcJson.xml) and the js-file is [index.js](./index.js)
|
||||||
*/
|
*/
|
||||||
function init(){
|
function init(){
|
||||||
createConnector(function(Connector, user_id){
|
createIwcConnector(function(Connector, user_id){
|
||||||
/**
|
/**
|
||||||
yatta is the shared json object. If you change something on this object,
|
yatta is the shared json object. If you change something on this object,
|
||||||
it will be instantly shared with all the other collaborators.
|
it will be instantly shared with all the other collaborators.
|
||||||
|
@ -24,154 +24,9 @@ it will be instantly shared with all the other collaborators.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
yatta = new JsonYatta(user_id, Connector);
|
yatta = new JsonYatta(user_id, Connector);
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Add a integer-property like this
|
});
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.val('x', 7);
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Get the value of property x like this
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
console.log(yatta.val('x') === 7); // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
A string property can be either mutable or immutable.
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.val('mutable_string', "text", "mutable");
|
|
||||||
yatta.val('immutable_string', "text", "immutable");
|
|
||||||
|
|
||||||
console.log(yatta.val('immutable_string') === "text"); // true
|
|
||||||
yatta.val('mutable_string').insertText(2,"XXX"); // position, string
|
|
||||||
yatta.val('mutable_string').deleteText(0,1); // position, deletion length
|
|
||||||
console.log(yatta.val('mutable_string').val() === "eXXXxt"); // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
You can omit the mutable - parameter. In that case the default will be used.
|
|
||||||
Initially the default is 'mutable'. You can set it like this:
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.setMutableDefault('mutable');
|
|
||||||
// or
|
|
||||||
yatta.setMutableDefault('immutable');
|
|
||||||
|
|
||||||
yatta.val('new_string', "string");
|
|
||||||
console.log(yatta.val('new_string') === "string"); // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
yatta is chainable:
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.val('a', 4).val('b',5);
|
|
||||||
console.log(yatta.val('a') === 4); // true
|
|
||||||
console.log(yatta.val('b') === 5); // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
You can alse set objects.
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.val('object', {a : {b : "b"}, c : { d : 5 }});
|
|
||||||
console.log(yatta.val('object').val('c').val('d') === 5); // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Lists are always immutable.
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.val('list', [1,2,3]);
|
|
||||||
console.log(yatta.val('list')[2] === 3); // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
But there is a much more convenient way!
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
console.log(yatta.value.list[2] === 3) // true
|
|
||||||
yatta.value.list = [3,4,5]
|
|
||||||
console.log(yatta.val('list')[2] === 5) // true
|
|
||||||
yatta.value.object = {c : 4}
|
|
||||||
console.log(yatta.value.object.c === 4) // true
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
The downside is that you are only allowed to overwrite existing properties.
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.value.newProperty = "Awesome"
|
|
||||||
console.log(yatta.value.newProperty !== "Awesome") // true, yatta.value.newProperty is undefined.
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
So, how do we create new properties?
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.value = {newProperty : "Awesome"}
|
|
||||||
console.log(yatta.value.newProperty === "Awesome") // true, it's awesome ;)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
This is stupid! I don't want to overwrite all my existing properties!
|
|
||||||
Very well.. The solution is that we merge yatta.value with the new assignment.
|
|
||||||
For example: assuming we want to overwrite yatta.value with some object o.
|
|
||||||
Then these two rules apply:
|
|
||||||
* The result has all properties of o
|
|
||||||
* The result has all properties of yatta.value if they don't occur under the same property-name in o
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.value = {newProperty : {Awesome : true }}
|
|
||||||
console.log(yatta.value.list[2] === 5) // true, old value list still exists.
|
|
||||||
console.log(yatta.value.newProperty.Awesome === true) // true, newProperty is overwritten.
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Consider this case.
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
yatta.value = {newProperty : { x : 4} }
|
|
||||||
console.log(yatta.value.newProperty.Awesome == null) // true, newProperty was replaced, therefore it is now undefined
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Did you notice that you always set immutable objects if you set properties like this?
|
|
||||||
Even if the default is 'mutable'. If you want to work with mutable objects you have to work with .val().
|
|
||||||
|
|
||||||
One last thing. You are only allowed to set properties like this `yatta.value = o`.
|
|
||||||
Yatta can't observe if you overwrite object references `yatta = "Awesome"`.
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
w = yatta.value.newProperty
|
|
||||||
w = "Awesome"
|
|
||||||
console.log(yatta.value.newProperty !== "Awesome") // true, still not awesome..
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Please also read [JsonWrapper](https://rawgit.com/DadaMonad/Yatta/master/doc/class/JsonWrapper.html)
|
|
||||||
|
|
||||||
|
|
||||||
```js
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
window.onload = init
|
window.onload = init
|
||||||
```
|
```
|
||||||
|
@ -21,110 +21,7 @@ function init(){
|
|||||||
*/
|
*/
|
||||||
yatta = new JsonYatta(user_id, Connector);
|
yatta = new JsonYatta(user_id, Connector);
|
||||||
|
|
||||||
/**
|
|
||||||
Add a integer-property like this
|
|
||||||
*/
|
|
||||||
yatta.val('x', 7);
|
|
||||||
|
|
||||||
/**
|
});
|
||||||
Get the value of property x like this
|
|
||||||
*/
|
|
||||||
console.log(yatta.val('x') === 7); // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
A string property can be either mutable or immutable.
|
|
||||||
*/
|
|
||||||
yatta.val('mutable_string', "text", "mutable");
|
|
||||||
yatta.val('immutable_string', "text", "immutable");
|
|
||||||
|
|
||||||
console.log(yatta.val('immutable_string') === "text"); // true
|
|
||||||
yatta.val('mutable_string').insertText(2,"XXX"); // position, string
|
|
||||||
yatta.val('mutable_string').deleteText(0,1); // position, deletion length
|
|
||||||
console.log(yatta.val('mutable_string').val() === "eXXXxt"); // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
You can omit the mutable - parameter. In that case the default will be used.
|
|
||||||
Initially the default is 'mutable'. You can set it like this:
|
|
||||||
*/
|
|
||||||
yatta.setMutableDefault('mutable');
|
|
||||||
// or
|
|
||||||
yatta.setMutableDefault('immutable');
|
|
||||||
|
|
||||||
yatta.val('new_string', "string");
|
|
||||||
console.log(yatta.val('new_string') === "string"); // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
yatta is chainable:
|
|
||||||
*/
|
|
||||||
yatta.val('a', 4).val('b',5);
|
|
||||||
console.log(yatta.val('a') === 4); // true
|
|
||||||
console.log(yatta.val('b') === 5); // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
You can alse set objects.
|
|
||||||
*/
|
|
||||||
yatta.val('object', {a : {b : "b"}, c : { d : 5 }});
|
|
||||||
console.log(yatta.val('object').val('c').val('d') === 5); // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
Lists are always immutable.
|
|
||||||
*/
|
|
||||||
yatta.val('list', [1,2,3]);
|
|
||||||
console.log(yatta.val('list')[2] === 3); // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
But there is a much more convenient way!
|
|
||||||
*/
|
|
||||||
console.log(yatta.value.list[2] === 3) // true
|
|
||||||
yatta.value.list = [3,4,5]
|
|
||||||
console.log(yatta.val('list')[2] === 5) // true
|
|
||||||
yatta.value.object = {c : 4}
|
|
||||||
console.log(yatta.value.object.c === 4) // true
|
|
||||||
|
|
||||||
/**
|
|
||||||
The downside is that you are only allowed to overwrite existing properties.
|
|
||||||
*/
|
|
||||||
yatta.value.newProperty = "Awesome"
|
|
||||||
console.log(yatta.value.newProperty !== "Awesome") // true, yatta.value.newProperty is undefined.
|
|
||||||
|
|
||||||
/**
|
|
||||||
So, how do we create new properties?
|
|
||||||
*/
|
|
||||||
yatta.value = {newProperty : "Awesome"}
|
|
||||||
console.log(yatta.value.newProperty === "Awesome") // true, it's awesome ;)
|
|
||||||
|
|
||||||
/**
|
|
||||||
This is stupid! I don't want to overwrite all my existing properties!
|
|
||||||
Very well.. The solution is that we merge yatta.value with the new assignment.
|
|
||||||
For example: assuming we want to overwrite yatta.value with some object o.
|
|
||||||
Then these two rules apply:
|
|
||||||
* The result has all properties of o
|
|
||||||
* The result has all properties of yatta.value if they don't occur under the same property-name in o
|
|
||||||
*/
|
|
||||||
yatta.value = {newProperty : {Awesome : true }}
|
|
||||||
console.log(yatta.value.list[2] === 5) // true, old value list still exists.
|
|
||||||
console.log(yatta.value.newProperty.Awesome === true) // true, newProperty is overwritten.
|
|
||||||
|
|
||||||
/**
|
|
||||||
Consider this case.
|
|
||||||
*/
|
|
||||||
yatta.value = {newProperty : { x : 4} }
|
|
||||||
console.log(yatta.value.newProperty.Awesome == null) // true, newProperty was replaced, therefore it is now undefined
|
|
||||||
|
|
||||||
/**
|
|
||||||
Did you notice that you always set immutable objects if you set properties like this?
|
|
||||||
Even if the default is 'mutable'. If you want to work with mutable objects you have to work with .val().
|
|
||||||
|
|
||||||
One last thing. You are only allowed to set properties like this `yatta.value = o`.
|
|
||||||
Yatta can't observe if you overwrite object references `yatta = "Awesome"`.
|
|
||||||
*/
|
|
||||||
w = yatta.value.newProperty
|
|
||||||
w = "Awesome"
|
|
||||||
console.log(yatta.value.newProperty !== "Awesome") // true, still not awesome..
|
|
||||||
|
|
||||||
/**
|
|
||||||
Please also read [JsonWrapper](https://rawgit.com/DadaMonad/Yatta/master/doc/class/JsonWrapper.html)
|
|
||||||
*/
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
window.onload = init
|
window.onload = init
|
||||||
|
@ -3,4 +3,5 @@
|
|||||||
Here you find some (hopefully) usefull examples on how to use Yatta!
|
Here you find some (hopefully) usefull examples on how to use Yatta!
|
||||||
|
|
||||||
|
|
||||||
* [IWC + Json](./IwcJson/)
|
* [IWC + Json](./IwcJson/) Tutorial on how to use Yatta! with Json and IWC
|
||||||
|
* [IWC](./IwcJson/) More IWC example widgets.
|
||||||
|
@ -15,11 +15,13 @@ mocha = require 'gulp-mocha'
|
|||||||
run = require 'gulp-run'
|
run = require 'gulp-run'
|
||||||
ljs = require 'gulp-ljs'
|
ljs = require 'gulp-ljs'
|
||||||
|
|
||||||
gulp.task 'default', ['clean', 'build', 'test', 'literate']
|
|
||||||
|
gulp.task 'default', ['build', 'test', 'literate']
|
||||||
gulp.task 'build', ['lint', 'lib', 'browser']
|
gulp.task 'build', ['lint', 'lib', 'browser']
|
||||||
|
|
||||||
files =
|
files =
|
||||||
lib : ['./lib/**/*.coffee']
|
lib : ['./lib/**/*.coffee']
|
||||||
|
build : ['./build/**']
|
||||||
browser : ['./lib/**/*.coffee']
|
browser : ['./lib/**/*.coffee']
|
||||||
test : ['./test/**/*.coffee']
|
test : ['./test/**/*.coffee']
|
||||||
gulp : ['./gulpfile.coffee']
|
gulp : ['./gulpfile.coffee']
|
||||||
@ -44,7 +46,7 @@ gulp.task 'browser', ->
|
|||||||
.pipe browserify
|
.pipe browserify
|
||||||
transform: ['coffeeify']
|
transform: ['coffeeify']
|
||||||
extensions: ['.coffee']
|
extensions: ['.coffee']
|
||||||
debug : true
|
debug : false
|
||||||
.pipe rename
|
.pipe rename
|
||||||
extname: ".js"
|
extname: ".js"
|
||||||
.pipe gulp.dest './build/browser'
|
.pipe gulp.dest './build/browser'
|
||||||
@ -90,6 +92,9 @@ gulp.task 'literate', ->
|
|||||||
.pipe gulp.dest 'examples/'
|
.pipe gulp.dest 'examples/'
|
||||||
.pipe gulpif '!**/', git.add({args : "-A"})
|
.pipe gulpif '!**/', git.add({args : "-A"})
|
||||||
|
|
||||||
|
gulp.task 'upload', ()->
|
||||||
|
run('scp -r ./build ./examples jahns@manet.informatik.rwth-aachen.de:/home/jahns/public_html/role-widgets/collaborative_preview/').exec()
|
||||||
|
|
||||||
gulp.task 'clean', ->
|
gulp.task 'clean', ->
|
||||||
gulp.src './build/{browser,test,node}/*.{js,map}', { read: false }
|
gulp.src './build/{browser,test,node}/*.{js,map}', { read: false }
|
||||||
.pipe ignore '*.html'
|
.pipe ignore '*.html'
|
||||||
|
@ -8,8 +8,6 @@ createIwcConnector = (callback, initial_user_id)->
|
|||||||
duiClient = new DUIClient()
|
duiClient = new DUIClient()
|
||||||
#@duiClient = new iwc.Client()
|
#@duiClient = new iwc.Client()
|
||||||
duiClient.connect (intent)->
|
duiClient.connect (intent)->
|
||||||
#console.log "intent received iwc: #{JSON.stringify(intent)}"
|
|
||||||
#console.log "#{JSON.stringify(@iwcHandler)}"
|
|
||||||
iwcHandler[intent.action]?.map (f)->
|
iwcHandler[intent.action]?.map (f)->
|
||||||
setTimeout ()->
|
setTimeout ()->
|
||||||
f intent
|
f intent
|
||||||
@ -40,6 +38,12 @@ createIwcConnector = (callback, initial_user_id)->
|
|||||||
@send o
|
@send o
|
||||||
@execution_listener.push send_
|
@execution_listener.push send_
|
||||||
|
|
||||||
|
receiveHB = (json)=>
|
||||||
|
HB = json?.extras.HB
|
||||||
|
this.engine.applyOpsCheckDouble HB
|
||||||
|
iwcHandler["Yatta_push_HB_element"] = [receiveHB]
|
||||||
|
|
||||||
|
|
||||||
receive_ = (intent)=>
|
receive_ = (intent)=>
|
||||||
o = intent.extras
|
o = intent.extras
|
||||||
@receive o
|
@receive o
|
||||||
@ -94,26 +98,22 @@ createIwcConnector = (callback, initial_user_id)->
|
|||||||
flags: ["PUBLISH_GLOBAL"]
|
flags: ["PUBLISH_GLOBAL"]
|
||||||
extras: {}
|
extras: {}
|
||||||
|
|
||||||
init = ()->
|
send_get_HB_intent = ()->
|
||||||
duiClient.sendIntent(get_HB_intent)
|
duiClient.sendIntent(get_HB_intent)
|
||||||
|
|
||||||
is_initialized = false
|
init = ()->
|
||||||
receiveHB = (json)->
|
setTimeout send_get_HB_intent, 1000
|
||||||
proposed_user_id = null
|
proposed_user_id = null
|
||||||
if initial_user_id?
|
if initial_user_id?
|
||||||
proposed_user_id = initial_user_id
|
proposed_user_id = initial_user_id
|
||||||
else
|
else
|
||||||
proposed_user_id = duiClient.getIwcClient()._componentName
|
# proposed_user_id = duiClient.getIwcClient()._componentName #TODO: This is stupid! why can't i use this?
|
||||||
received_HB = json?.extras.HB
|
proposed_user_id = Math.floor(Math.random()*1000000)
|
||||||
if not is_initialized
|
|
||||||
is_initialized = true
|
|
||||||
callback IwcConnector, proposed_user_id
|
callback IwcConnector, proposed_user_id
|
||||||
iwcHandler["Yatta_push_HB_element"] = [receiveHB]
|
|
||||||
setTimeout receiveHB, 4000
|
|
||||||
|
|
||||||
setTimeout init, (1000)
|
setTimeout init, (1000)
|
||||||
|
|
||||||
undefined
|
undefined
|
||||||
module.exports = createIwcConnector
|
module.exports = createIwcConnector
|
||||||
window?.createConnector = createIwcConnector
|
window?.createIwcConnector = createIwcConnector
|
||||||
|
|
||||||
|
@ -23,11 +23,12 @@ createPeerJsConnector = (callback)->
|
|||||||
@connections = []
|
@connections = []
|
||||||
|
|
||||||
@peer.on 'connection', (conn)=>
|
@peer.on 'connection', (conn)=>
|
||||||
console.log "received conn"
|
conn.send "hey"
|
||||||
@addConnection conn
|
@addConnection conn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
send_ = (o)=>
|
send_ = (o)=>
|
||||||
@send o
|
@send o
|
||||||
@execution_listener.push send_
|
@execution_listener.push send_
|
||||||
@ -39,8 +40,8 @@ createPeerJsConnector = (callback)->
|
|||||||
@connections.push conn
|
@connections.push conn
|
||||||
|
|
||||||
conn.on 'data', (data)=>
|
conn.on 'data', (data)=>
|
||||||
console.log "data: #{data}"
|
if data is "hey"
|
||||||
if data.HB?
|
else if data.HB?
|
||||||
@engine.applyOpsCheckDouble data.HB
|
@engine.applyOpsCheckDouble data.HB
|
||||||
else if data.op?
|
else if data.op?
|
||||||
@engine.applyOp data.op
|
@engine.applyOp data.op
|
||||||
@ -48,7 +49,6 @@ createPeerJsConnector = (callback)->
|
|||||||
throw new Error "Can't parse this operation"
|
throw new Error "Can't parse this operation"
|
||||||
|
|
||||||
sendHB = ()=>
|
sendHB = ()=>
|
||||||
console.log "sending..."
|
|
||||||
conn.send
|
conn.send
|
||||||
HB: @yatta.getHistoryBuffer()._encode()
|
HB: @yatta.getHistoryBuffer()._encode()
|
||||||
setTimeout sendHB, 1000
|
setTimeout sendHB, 1000
|
||||||
@ -59,9 +59,7 @@ createPeerJsConnector = (callback)->
|
|||||||
#
|
#
|
||||||
send: (o)->
|
send: (o)->
|
||||||
if o.uid.creator is @HB.getUserId() and (typeof o.uid.op_number isnt "string")
|
if o.uid.creator is @HB.getUserId() and (typeof o.uid.op_number isnt "string")
|
||||||
console.log "trying to send ops"
|
|
||||||
for conn in @connections
|
for conn in @connections
|
||||||
console.log "sent op"
|
|
||||||
conn.send
|
conn.send
|
||||||
op: o
|
op: o
|
||||||
|
|
||||||
@ -74,7 +72,6 @@ createPeerJsConnector = (callback)->
|
|||||||
@engine.applyOp o
|
@engine.applyOp o
|
||||||
|
|
||||||
peer.on 'open', (id)->
|
peer.on 'open', (id)->
|
||||||
console.log id
|
|
||||||
callback PeerJsConnector, id
|
callback PeerJsConnector, id
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ class Engine
|
|||||||
#
|
#
|
||||||
applyOpsCheckDouble: (ops_json)->
|
applyOpsCheckDouble: (ops_json)->
|
||||||
for o in ops_json
|
for o in ops_json
|
||||||
if @HB.getOperation(o.uid)?
|
if not @HB.getOperation(o.uid)?
|
||||||
@applyOp o
|
@applyOp o
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -308,7 +308,7 @@ module.exports = (HB)->
|
|||||||
@prev_cl.next_cl = @
|
@prev_cl.next_cl = @
|
||||||
@next_cl.prev_cl = @
|
@next_cl.prev_cl = @
|
||||||
super # notify the execution_listeners
|
super # notify the execution_listeners
|
||||||
@
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Defines an object that is cannot be changed. You can use this to set an immutable string, or a number.
|
# Defines an object that is cannot be changed. You can use this to set an immutable string, or a number.
|
||||||
|
@ -264,7 +264,6 @@ module.exports = (HB)->
|
|||||||
else
|
else
|
||||||
@content.setReplaceManager?(@parent)
|
@content.setReplaceManager?(@parent)
|
||||||
super
|
super
|
||||||
@
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Encode this operation in such a way that it can be parsed by remote peers.
|
# Encode this operation in such a way that it can be parsed by remote peers.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user