diff --git a/.eslintrc b/.eslintrc index cc6c0079..e02423bf 100644 --- a/.eslintrc +++ b/.eslintrc @@ -23,6 +23,7 @@ "GeneratorFunction": true, "Y": true, "setTimeout": true, - "setInterval": true + "setInterval": true, + "Operation": true } } diff --git a/src/Connectors/Test.js b/src/Connectors/Test.js index ba7f2168..047f8480 100644 --- a/src/Connectors/Test.js +++ b/src/Connectors/Test.js @@ -69,11 +69,11 @@ class Test extends AbstractConnector { this.globalRoom = globalRoom; } send (userId, message) { - globalRoom.buffers[userId].push([this.userId, message]); + globalRoom.buffers[userId].push(JSON.parse(JSON.stringify([this.userId, message]))); } broadcast (message) { for (var key in globalRoom.buffers) { - globalRoom.buffers[key].push([this.userId, message]); + globalRoom.buffers[key].push(JSON.parse(JSON.stringify([this.userId, message]))); } } disconnect () { diff --git a/src/OperationStore.js b/src/OperationStore.js index 384f5353..4ebbc252 100644 --- a/src/OperationStore.js +++ b/src/OperationStore.js @@ -12,8 +12,10 @@ class AbstractTransaction { //eslint-disable-line no-unused-vars yield* this.setOperation(op); this.store.operationAdded(op); return true; - } else { + } else if (op.id[1] < state.clock) { return false; + } else { + throw new Error("Operations must arrive in order!"); } } } @@ -45,7 +47,7 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars * sid : String (converted from id via JSON.stringify so we can use it as a property name) - Always remember to first overwrite over + Always remember to first overwrite a property before you iterate over it! */ } @@ -56,16 +58,15 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars for (var key in ops) { var o = ops[key]; var required = Y.Struct[o.struct].requiredOps(o); - this.whenOperationsExist(required, Y.Struct[o.struct].execute, o); + this.whenOperationsExist(required, o); } } - // f is called as soon as every operation requested is available. + // op is executed as soon as every operation requested is available. // Note that Transaction can (and should) buffer requests. - whenOperationsExist (ids : Array, f : GeneratorFunction, args : Array) { + whenOperationsExist (ids : Array, op : Operation) { if (ids.length > 0) { let listener : Listener = { - f: f, - args: args || [], + op: op, missing: ids.length }; @@ -81,8 +82,7 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars } } else { this.listenersByIdExecuteNow.push({ - f: f, - args: args || [] + op: op }); } @@ -103,8 +103,8 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars store.listenersByIdRequestPending = false; for (let key in exeNow) { - let listener = exeNow[key]; - yield* listener.f.call(this, listener.args); + let o = exeNow[key].op; + yield* Struct[o.struct].execute.call(this, o); } for (var sid in ls){ @@ -115,8 +115,9 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars } else { for (let key in l) { let listener = l[key]; + let o = listener.op; if (--listener.missing === 0){ - yield* listener.f.call(this, listener.args); + yield* Struct[o.struct].execute.call(this, o); } } } @@ -125,13 +126,16 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars } // called by a transaction when an operation is added operationAdded (op) { + var sid = JSON.stringify(op.id); + var l = this.listenersById[sid]; + delete this.listenersById[sid]; + // notify whenOperation listeners (by id) - var l = this.listenersById[JSON.stringify(op.id)]; if (l != null) { for (var key in l){ var listener = l[key]; if (--listener.missing === 0){ - this.whenOperationsExist([], listener.f, listener.args); + this.whenOperationsExist([], listener.op); } } } diff --git a/src/OperationStore.spec.js b/src/OperationStore.spec.js index 0edac40d..48739ae3 100644 --- a/src/OperationStore.spec.js +++ b/src/OperationStore.spec.js @@ -2,49 +2,4 @@ /*eslint-env browser,jasmine,console */ describe("OperationStore", function() { - - class OperationStore extends AbstractOperationStore { - constructor (){ - super(); - } - requestTransaction (makeGen) { - var gen = makeGen.apply({ - getOperation: function*(){ - return true; - } - }); - - function handle(res : any){ - if (res.done){ - return; - } else { - handle(gen.next(res.value)); - } - } - handle(gen.next()); - } - } - - var os = new OperationStore(); - - it("calls when operation added", function(done) { - var id = ["u1", 1]; - os.whenOperationsExist([id], function*(){ - expect(true).toEqual(true); - done(); - }); - os.operationAdded({id: id}); - }); - it("calls when no requirements", function(done) { - os.whenOperationsExist([], function*(){ - expect(true).toEqual(true); - done(); - }); - }); - it("calls when no requirements with arguments", function(done) { - os.whenOperationsExist([], function*(arg){ - expect(arg).toBeTruthy(); - done(); - }, [true]); - }); }); diff --git a/src/OperationStores/Memory.js b/src/OperationStores/Memory.js index 5e0748f9..550c9ce3 100644 --- a/src/OperationStores/Memory.js +++ b/src/OperationStores/Memory.js @@ -84,6 +84,7 @@ Y.Memory = (function(){ //eslint-disable-line no-unused-vars for (var clock = startPos; clock <= endPos; clock++) { var op = yield* this.getOperation([user, clock]); if (op != null) { + op = Struct[op.struct].encode(op); ops.push(yield* this.makeOperationReady.call(this, startSS, op)); } } @@ -91,6 +92,7 @@ Y.Memory = (function(){ //eslint-disable-line no-unused-vars return ops; } *makeOperationReady (ss, op) { + // instead of ss, you could use currSS (a ss that increments when you add an operation) var clock; var o = op; while (true){ diff --git a/src/Struct.js b/src/Struct.js index bd472ee6..0270ff7d 100644 --- a/src/Struct.js +++ b/src/Struct.js @@ -40,10 +40,12 @@ var Struct = { var user = this.store.y.connector.userId; var state = yield* this.getState(user); op.id = [user, state.clock]; - yield* this.addOperation(op); + if ((yield* this.addOperation(op)) === false) { + throw new Error("This is highly unexpected :("); + } this.store.y.connector.broadcast({ type: "update", - ops: [op] + ops: [Struct[op.struct].encode(op)] }); } }, @@ -67,16 +69,18 @@ var Struct = { yield* Struct.Operation.create.call(this, op); if (op.left != null) { - op.left.right = op.id; - yield* this.setOperation(op.left); + var left = yield* this.getOperation(op.left); + left.right = op.id; + yield* this.setOperation(left); } if (op.right != null) { - op.right.left = op.id; - yield* this.setOperation(op.right); + var right = yield* this.getOperation(op.right); + right.left = op.id; + yield* this.setOperation(right); } var parent = yield* this.getOperation(op.parent); if (op.parentSub != null){ - if (compareIds(parent.map[op.parentSub], op.left)) { + if (compareIds(parent.map[op.parentSub], op.right)) { parent.map[op.parentSub] = op.id; yield* this.setOperation(parent); } @@ -95,6 +99,22 @@ var Struct = { } return op; }, + encode: function(op){ + /*var e = { + id: op.id, + left: op.left, + right: op.right, + origin: op.origin, + parent: op.parent, + content: op.content, + struct: "Insert" + }; + if (op.parentSub != null){ + e.parentSub = op.parentSub; + } + return e;*/ + return op; + }, requiredOps: function(op){ var ids = []; if(op.left != null){ @@ -133,39 +153,11 @@ var Struct = { # $this insert_position is to the left of $o (forever!) */ execute: function*(op){ - var distanceToOrigin = yield* Struct.Insert.getDistanceToOrigin.call(this, op); // most cases: 0 (starts from 0) - var i = distanceToOrigin; // loop counter - var o, tmp; - if (op.right == null && op.left == null) { - var p = yield* this.getOperation(op.parent); - if (op.parentSub != null) { - tmp = p.map[op.parentSub]; - if (!compareIds(tmp, op.id)) { - op.right = tmp; - } - if (op.right == null) { - // this is the first ins in parent - p.map[op.parentSub] = op.id; - yield* this.setOperation(p); - yield* this.setOperation(op); - return; - } - } else { - tmp = p.start; - if (!compareIds(tmp, op.id)) { - op.left = tmp; - } - if (op.left == null) { - // this is the first ins in parent - p.start = op.id; - p.end = op.id; - yield* this.setOperation(p); - yield* this.setOperation(op); - return; - } - } - } + var i; // loop counter + var distanceToOrigin = i = yield* Struct.Insert.getDistanceToOrigin.call(this, op); // most cases: 0 (starts from 0) + var o; + // find o. o is the first conflicting operation if (op.left != null) { o = yield* this.getOperation(op.left); o = yield* this.getOperation(o.right); @@ -174,18 +166,28 @@ var Struct = { while (o.left != null){ o = yield* this.getOperation(o.left); } + } else { // left & right are null + var p = yield* this.getOperation(op.parent); + if (op.parentSub != null) { + o = yield* this.getOperation(p.map[op.parentSub]); + } else { + o = yield* this.getOperation(p.start); + } } + + // handle conflicts while (true) { if (o != null && o.id !== op.right){ - if (Struct.Insert.getDistanceToOrigin(o) === i) { + var oOriginDistance = yield* Struct.Insert.getDistanceToOrigin.call(this, o); + if (oOriginDistance === i) { // case 1 if (o.id[0] < op.id[0]) { op.left = o.id; distanceToOrigin = i + 1; } - } else if ((tmp = Struct.Insert.getDistanceToOrigin(o)) < i) { + } else if (oOriginDistance < i) { // case 2 - if (i - distanceToOrigin <= tmp) { + if (i - distanceToOrigin <= oOriginDistance) { op.left = o.id; distanceToOrigin = i + 1; } @@ -202,22 +204,41 @@ var Struct = { // reconnect.. var left = null; var right = null; + var parent = yield* this.getOperation(op.parent); + + // NOTE: You you have to call addOperation before you set any other operation! + + // reconnect left and set right of op if (op.left != null) { left = yield* this.getOperation(op.left); + op.right = left.right; left.right = op.id; + if ((yield* this.addOperation(op)) === false) { // add here + return; + } yield* this.setOperation(left); + } else { + if ((yield* this.addOperation(op)) === false) { // or here + return; + } + // only set right, if possible + if (op.parentSub != null) { + var sub = parent[op.parentSub]; + op.right = sub != null ? sub : null; + } else { + op.right = parent.start; + } } + // reconnect right if (op.right != null) { right = yield* this.getOperation(op.right); right.left = op.id; yield* this.setOperation(right); } - yield* this.setOperation(op); // notify parent - var parent = yield* this.getOperation(op.parent); if (op.parentSub != null) { - if (right == null) { + if (left == null) { parent.map[op.parentSub] = op.id; yield* this.setOperation(parent); } @@ -232,7 +253,6 @@ var Struct = { yield* this.setOperation(parent); } } - yield* this.setOperation(op); } }, List: { @@ -242,6 +262,12 @@ var Struct = { op.struct = "List"; return yield* Struct.Operation.create.call(this, op); }, + encode: function(op){ + return { + struct: "List", + id: op.id + }; + }, requiredOps: function(op){ var ids = []; if (op.start != null) { @@ -253,7 +279,9 @@ var Struct = { return ids; }, execute: function* (op) { - yield* this.setOperation(op); + if ((yield* this.addOperation(op)) === false) { + return; + } }, ref: function* (op : Op, pos : number) : Insert { var o = op.start; @@ -298,6 +326,12 @@ var Struct = { op.struct = "Map"; return yield* Struct.Operation.create.call(this, op); }, + encode: function(op){ + return { + struct: "Map", + id: op.id + }; + }, requiredOps: function(op){ var ids = []; for (var end in op.map) { @@ -306,21 +340,18 @@ var Struct = { return ids; }, execute: function* (op) { - yield* this.setOperation(op); + if ((yield* this.addOperation(op)) === false) { + return; + } }, get: function* (op, name) { var res = yield* this.getOperation(op.map[name]); return (res != null) ? res.content : void 0; }, set: function* (op, name, value) { - var end = op.map[name]; - if (end == null) { - end = null; - op.map[name] = end; - } var insert = { - left: end, - right: null, + left: null, + right: op.map[name] || null, content: value, parent: op.id, parentSub: name diff --git a/src/y.spec.js b/src/y.spec.js index 9c09e0f0..3a96b191 100644 --- a/src/y.spec.js +++ b/src/y.spec.js @@ -75,7 +75,7 @@ describe("Yjs (basic)", function(){ }); var transaction = function*(root){ - expect(yield* root.val("stuff")).toEqual("c1"); + expect(yield* root.val("stuff")).toEqual("c0"); }; y.connector.flushAll(); diff --git a/y.js b/y.js index 91915830..877109db 100644 --- a/y.js +++ b/y.js @@ -1,3 +1,3 @@ -"use strict";function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function compareIds(e,t){return null==e?null==t?!0:!1:e[0]===t[0]&&e[1]===t[1]?!0:!1}function getRandom(e){if(e instanceof Array)return e[Math.floor(Math.random()*e.length)];if(e.constructor===Object){var t=[];for(var r in e)t.push(r);return e[getRandom(t)]}}function flushOne(){var e=[];for(var t in globalRoom.buffers)globalRoom.buffers[t].length>0&&e.push(t);if(e.length>0){var r=getRandom(e),n=globalRoom.buffers[r].shift(),a=globalRoom.users[r];return a.receiveMessage(n[0],n[1]),!0}return!1}function copyObject(e){var t={};for(var r in e)t[r]=e[r];return t}!function(e){function t(e,t,r,a){var i=Object.create((t||n).prototype);return i._invoke=c(e,r||null,new f(a||[])),i}function r(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(n){return{type:"throw",arg:n}}}function n(){}function a(){}function i(){}function s(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function o(e){this.arg=e}function u(e){function t(t,r){var n=e[t](r),s=n.value;return s instanceof o?Promise.resolve(s.arg).then(a,i):Promise.resolve(s).then(function(e){return n.value=e,n},i)}function r(e,r){var a=n?n.then(function(){return t(e,r)}):new Promise(function(n){n(t(e,r))});return n=a["catch"](s),a}"object"==typeof process&&process.domain&&(t=process.domain.bind(t));var n,a=t.bind(e,"next"),i=t.bind(e,"throw"),s=t.bind(e,"return");this._invoke=r}function c(e,t,n){var a=x;return function(i,s){if(a===k)throw new Error("Generator is already running");if(a===R)return d();for(;;){var o=n.delegate;if(o){if("return"===i||"throw"===i&&o.iterator[i]===g){n.delegate=null;var u=o.iterator["return"];if(u){var c=r(u,o.iterator,s);if("throw"===c.type){i="throw",s=c.arg;continue}}if("return"===i)continue}var c=r(o.iterator[i],o.iterator,s);if("throw"===c.type){n.delegate=null,i="throw",s=c.arg;continue}i="next",s=g;var l=c.arg;if(!l.done)return a=w,l;n[o.resultName]=l.value,n.next=o.nextLoc,n.delegate=null}if("next"===i)a===w?n.sent=s:delete n.sent;else if("throw"===i){if(a===x)throw a=R,s;n.dispatchException(s)&&(i="next",s=g)}else"return"===i&&n.abrupt("return",s);a=k;var c=r(e,t,n);if("normal"===c.type){a=n.done?R:w;var l={value:c.arg,done:n.done};if(c.arg!==S)return l;n.delegate&&"next"===i&&(s=g)}else"throw"===c.type&&(a=R,i="throw",s=c.arg)}}}function l(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function p(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function f(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(l,this),this.reset()}function h(e){if(e){var t=e[y];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function a(){for(;++rt;++t)this[e]=null},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,n){return i.type="throw",i.arg=e,r.next=t,!!n}if(this.done)throw e;for(var r=this,n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n],i=a.completion;if("root"===a.tryLoc)return t("end");if(a.tryLoc<=this.prev){var s=b.call(a,"catchLoc"),o=b.call(a,"finallyLoc");if(s&&o){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&b.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),p(r),S}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;p(r)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:h(e),resultName:t,nextLoc:r},S}}}("object"==typeof global?global:"object"==typeof window?window:"object"==typeof self?self:void 0);var GeneratorFunction=regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}},e,this)}).constructor,Y=function(){function e(t){_classCallCheck(this,e),this.db=new e[t.db.name](this,t.db),this.connector=new e[t.connector.name](this,t.connector),this.db.requestTransaction(regeneratorRuntime.mark(function r(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.delegateYield(this.addOperation({id:["_",0],struct:"Map",map:{}}),"t0",1);case 1:case"end":return e.stop()}},r,this)}))}return e.prototype.transact=function(e){if(e.constructor!==GeneratorFunction)throw new Error("y.transact requires a Generator function! E.g. function*(){/*..*/}");this.db.requestTransaction(e)},e.prototype.destroy=function(){this.connector.disconnect(),this.db.removeDatabase(),this.connector=null,this.db=null,this.transact=function(){throw new Error("Remember?, you destroyed this type ;)")}},e}(),AbstractConnector=function(){function e(t,r){if(_classCallCheck(this,e),this.y=t,null==r&&(r={}),null==r.role||"master"===r.role)this.role="master";else{if("slave"!==r.role)throw new Error("Role must be either 'master' or 'slave'!");this.role="slave"}this.role=r.role,this.connections={},this.userEventListeners=[],this.whenSyncedListeners=[],this.currentSyncTarget=null,this.syncingClients=[],this.forwardToSyncingClients=r.forwardToSyncingClients===!1?!1:!0,this.debug=r.debug?!0:!1}return e.prototype.setUserId=function(e){this.userId=e,this.y.db.setUserId(e)},e.prototype.onUserEvent=function(e){this.userEventListeners.push(e)},e.prototype.userLeft=function(e){delete this.connections[e],e===this.currentSyncTarget&&(this.currentSyncTarget=null,this.findNextSyncTarget());for(var t=this.userEventListeners,r=Array.isArray(t),n=0,t=r?t:t[Symbol.iterator]();;){var a;if(r){if(n>=t.length)break;a=t[n++]}else{if(n=t.next(),n.done)break;a=n.value}var i=a;i({action:"userLeft",user:e})}},e.prototype.userJoined=function(e,t){if(null==t)throw new Error("You must specify the role of the joined user!");if(null!=this.connections[e])throw new Error("This user already joined!");this.connections[e]={isSynced:!1,role:t};for(var r=this.userEventListeners,n=Array.isArray(r),a=0,r=n?r:r[Symbol.iterator]();;){var i;if(n){if(a>=r.length)break;i=r[a++]}else{if(a=r.next(),a.done)break;i=a.value}var s=i;s({action:"userJoined",user:e,role:t})}null==this.currentSyncTarget&&this.findNextSyncTarget()},e.prototype.whenSynced=function(e){this.isSynced===!0?e():this.whenSyncedListeners.push(e)},e.prototype.findNextSyncTarget=function(){if(null!=this.currentSyncTarget&&this.connections[this.currentSyncTarget].isSynced===!1)throw new Error("The current sync has not finished!");var e=null;for(var t in this.connections)if(e=this.connections[t],!e.isSynced)break;if(null!=e){var r=this;this.y.db.requestTransaction(regeneratorRuntime.mark(function u(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r.currentSyncTarget=t,e.t0=r,e.t1=t,e.delegateYield(this.getStateVector(),"t2",4);case 4:e.t3=e.t2,e.t4={type:"sync step 1",stateVector:e.t3},e.t0.send.call(e.t0,e.t1,e.t4);case 7:case"end":return e.stop()}},u,this)}))}if(!this.isSynced){this.isSynced=!0;for(var n=this.whenSyncedListeners,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var s;if(a){if(i>=n.length)break;s=n[i++]}else{if(i=n.next(),i.done)break;s=i.value}var o=s;o()}this.whenSyncedListeners=null}return!1},e.prototype.receiveMessage=function(e,t){var r=this;if(this.debug&&console.log(e+" -> "+this.userId+": "+JSON.stringify(t)),"sync step 1"===t.type)!function(){var n=r;r.y.db.requestTransaction(regeneratorRuntime.mark(function a(){var r,i;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.delegateYield(this.getOperations(t.stateVector),"t0",1);case 1:return r=a.t0,a.delegateYield(this.getStateVector(),"t1",3);case 3:i=a.t1,n.send(e,{type:"sync step 2",os:r,stateVector:i}),this.forwardToSyncingClients&&(n.syncingClients.push(e),setTimeout(function(){n.syncingClients=n.syncingClients.filter(function(t){return t!==e}),n.send(e,{type:"sync done"})},n.syncingClientDuration));case 6:case"end":return a.stop()}},a,this)}))}();else if("sync step 2"===t.type)!function(){r.y.db.apply(t.os);var e=r;r.y.db.requestTransaction(regeneratorRuntime.mark(function n(){var r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.delegateYield(this.getOperations(t.stateVector),"t0",1);case 1:r=n.t0,r.length>0&&e.broadcast({type:"update",ops:r});case 3:case"end":return n.stop()}},n,this)}))}();else if("sync done"===t.type)this.connections[e].isSynced=!0,this.findNextSyncTarget();else if("update"===t.type){if(this.forwardToSyncingClients)for(var n=this.syncingClients,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var s;if(a){if(i>=n.length)break;s=n[i++]}else{if(i=n.next(),i.done)break;s=i.value}var o=s;this.send(o,t)}this.y.db.apply(t.ops)}},e.prototype.parseMessageFromXml=function(e){function t(e){var t=!0;e:for(;t;){var n=e;a=i=s=a=o=u=void 0,t=!1;for(var a=n.children,i=Array.isArray(a),s=0,a=i?a:a[Symbol.iterator]();;){var o;if(i){if(s>=a.length)break;o=a[s++]}else{if(s=a.next(),s.done)break;o=s.value}var u=o;if("true"===u.getAttribute("isArray")){e=u,t=!0;continue e}return r(u)}}}function r(e){var n={};for(var a in e.attrs){var i=e.attrs[a],s=parseInt(i);n[a]=isNaN(s)||""+s!==i?i:s}for(var o in e.children){var u=o.name;n[u]="true"===o.getAttribute("isArray")?t(o):r(o)}return n}r(e)},e.prototype.encodeMessageToXml=function(e,t){function r(e,t){for(var a in t){var i=t[a];null==a||(i.constructor===Object?r(e.c(a),i):i.constructor===Array?n(e.c(a),i):e.setAttribute(a,i))}}function n(e,t){e.setAttribute("isArray","true");for(var a=t,i=Array.isArray(a),s=0,a=i?a:a[Symbol.iterator]();;){var o;if(i){if(s>=a.length)break;o=a[s++]}else{if(s=a.next(),s.done)break;o=s.value}var u=o;u.constructor===Object?r(e.c("array-element"),u):n(e.c("array-element"),u)}}if(t.constructor===Object)r(e.c("y",{xmlns:"http://y.ninja/connector-stanza"}),t);else{if(t.constructor!==Array)throw new Error("I can't encode this json!");n(e.c("y",{xmlns:"http://y.ninja/connector-stanza"}),t)}},e}(),AbstractTransaction=function(){function e(t){_classCallCheck(this,e),this.store=t}return e.prototype.addOperation=regeneratorRuntime.mark(function t(e){var r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.delegateYield(this.getState(e.id[0]),"t0",1);case 1:if(r=t.t0,e.id[1]!==r.clock){t.next=10;break}return r.clock++,t.delegateYield(this.setState(r),"t1",5);case 5:return t.delegateYield(this.setOperation(e),"t2",6);case 6:return this.store.operationAdded(e),t.abrupt("return",!0);case 10:return t.abrupt("return",!1);case 11:case"end":return t.stop()}},t,this)}),e}();Y.AbstractTransaction=AbstractTransaction;var AbstractOperationStore=function(){function e(t){_classCallCheck(this,e),this.y=t,this.parentListeners={},this.parentListenersRequestPending=!1,this.parentListenersActivated={},this.listenersById={},this.listenersByIdExecuteNow=[],this.listenersByIdRequestPending=!1}return e.prototype.setUserId=function(e){this.userId=e},e.prototype.apply=function(e){for(var t in e){var r=e[t],n=Y.Struct[r.struct].requiredOps(r);this.whenOperationsExist(n,Y.Struct[r.struct].execute,r)}},e.prototype.whenOperationsExist=function(e,t,r){if(e.length>0){var n={f:t,args:r||[],missing:e.length};for(var a in e){var i=e[a],s=JSON.stringify(i),o=this.listenersById[s];null==o&&(o=[],this.listenersById[s]=o),o.push(n)}}else this.listenersByIdExecuteNow.push({f:t,args:r||[]});if(!this.listenersByIdRequestPending){this.listenersByIdRequestPending=!0;var u=this;this.requestTransaction(regeneratorRuntime.mark(function c(){var e,t,r,n,a,i,s;return regeneratorRuntime.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:e=u.listenersByIdExecuteNow,u.listenersByIdExecuteNow=[],t=u.listenersById,u.listenersById={},u.listenersByIdRequestPending=!1,o.t0=regeneratorRuntime.keys(e);case 6:if((o.t1=o.t0()).done){o.next=12;break}return r=o.t1.value,n=e[r],o.delegateYield(n.f.call(this,n.args),"t2",10);case 10:o.next=6;break;case 12:o.t3=regeneratorRuntime.keys(t);case 13:if((o.t4=o.t3()).done){o.next=33;break}return a=o.t4.value,i=t[a],s=JSON.parse(a),o.delegateYield(this.getOperation(s),"t5",18);case 18:if(o.t6=o.t5,null!=o.t6){o.next=23;break}u.listenersById[a]=i,o.next=31;break;case 23:o.t7=regeneratorRuntime.keys(i);case 24:if((o.t8=o.t7()).done){o.next=31;break}if(r=o.t8.value,n=i[r],0!==--n.missing){o.next=29;break}return o.delegateYield(n.f.call(this,n.args),"t9",29);case 29:o.next=24;break;case 31:o.next=13;break;case 33:case"end":return o.stop()}},c,this)}))}},e.prototype.operationAdded=function(e){var t=this.listenersById[JSON.stringify(e.id)];if(null!=t)for(var r in t){var n=t[r];0===--n.missing&&this.whenOperationsExist([],n.f,n.args)}var a=this.parentListeners[e.parent];if(!this.parentListenersRequestPending&&null!=a&&0!==a.length){var i=this.parentListenersActivated[JSON.stringify(e.parent)];null==i&&(i=[],this.parentListenersActivated[JSON.stringify(e.parent)]=i),i.push(e),this.parentListenersRequestPending=!0;var s=this;this.requestTransaction(regeneratorRuntime.mark(function o(){var e,t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:s.parentListenersRequestPending=!1,e=s.parentListenersActivated,s.parentListenersActivated={},n.t0=regeneratorRuntime.keys(e);case 4:if((n.t1=n.t0()).done){n.next=11;break}return t=n.t1.value,n.delegateYield(this.getOperation(t),"t2",7);case 7:r=n.t2,Struct[r.struct].notifyObservers(e[t]),n.next=4;break;case 11:case"end":return n.stop()}},o,this)}))}},e.prototype.removeParentListener=function(e,t){var r=this.parentListeners[e];null!=r&&(this.parentListeners[e]=r.filter(function(e){return t!==e}))},e.prototype.addParentListener=function(e,t){var r=this.parentListeners[JSON.stringify(e)];null==r&&(r=[],this.parentListeners[JSON.stringify(e)]=r),r.push(t)},e}();Y.AbstractOperationStore=AbstractOperationStore;var Struct={Operation:{create:regeneratorRuntime.mark(function t(e){var r,n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return r=this.store.y.connector.userId,t.delegateYield(this.getState(r),"t0",2);case 2:return n=t.t0,e.id=[r,n.clock],t.delegateYield(this.addOperation(e),"t1",5);case 5:this.store.y.connector.broadcast({type:"update",ops:[e]});case 6:case"end":return t.stop()}},t,this)})},Insert:{create:regeneratorRuntime.mark(function r(e){var t,n,a;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:if(void 0!==e.left&&void 0!==e.right&&void 0!==e.parent){r.next=2;break}throw new Error("You must define left, right, and parent!");case 2:return e.origin=e.left,e.struct="Insert",r.delegateYield(Struct.Operation.create.call(this,e),"t0",5);case 5:if(null==e.left){r.next=8;break}return e.left.right=e.id,r.delegateYield(this.setOperation(e.left),"t1",8);case 8:if(null==e.right){r.next=11;break}return e.right.left=e.id,r.delegateYield(this.setOperation(e.right),"t2",11);case 11:return r.delegateYield(this.getOperation(e.parent),"t3",12);case 12:if(t=r.t3,null==e.parentSub){r.next=19;break}if(!compareIds(t.map[e.parentSub],e.left)){r.next=17;break}return t.map[e.parentSub]=e.id,r.delegateYield(this.setOperation(t),"t4",17);case 17:r.next=25;break;case 19:if(n=compareIds(t.start,e.right),a=compareIds(t.end,e.left),!n&&!a){r.next=25;break}return n&&(t.start=e.id),a&&(t.end=e.id),r.delegateYield(this.setOperation(t),"t5",25);case 25:return r.abrupt("return",e);case 26:case"end":return r.stop()}},r,this)}),requiredOps:function(e){var t=[];return null!=e.left&&t.push(e.left),null!=e.right&&t.push(e.right),null==e.right&&null==e.left&&t.push(e.parent),t},getDistanceToOrigin:regeneratorRuntime.mark(function n(e){var t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return t=0,n.delegateYield(this.getOperation(e.left),"t0",2);case 2:r=n.t0;case 3:if(e.origin===(r?r.id:null)){n.next=9;break}return t++,n.delegateYield(this.getOperation(r.left),"t1",6);case 6:r=n.t1,n.next=3;break;case 9:return n.abrupt("return",t);case 10:case"end":return n.stop()}},n,this)}),execute:regeneratorRuntime.mark(function a(e){var t,r,n,i,s,o,u,c;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.delegateYield(Struct.Insert.getDistanceToOrigin.call(this,e),"t0",1);case 1:if(t=a.t0,r=t,null!=e.right||null!=e.left){a.next=24;break}return a.delegateYield(this.getOperation(e.parent),"t1",5);case 5:if(s=a.t1,null==e.parentSub){a.next=16;break}if(i=s.map[e.parentSub],compareIds(i,e.id)||(e.right=i),null!=e.right){a.next=14;break}return s.map[e.parentSub]=e.id,a.delegateYield(this.setOperation(s),"t2",12);case 12:return a.delegateYield(this.setOperation(e),"t3",13);case 13:return a.abrupt("return");case 14:a.next=24;break;case 16:if(i=s.start,compareIds(i,e.id)||(e.left=i),null!=e.left){a.next=24;break}return s.start=e.id,s.end=e.id,a.delegateYield(this.setOperation(s),"t4",22);case 22:return a.delegateYield(this.setOperation(e),"t5",23);case 23:return a.abrupt("return");case 24:if(null==e.left){a.next=31;break}return a.delegateYield(this.getOperation(e.left),"t6",26);case 26:return n=a.t6,a.delegateYield(this.getOperation(n.right),"t7",28);case 28:n=a.t7,a.next=39;break;case 31:if(null==e.right){a.next=39;break}return a.delegateYield(this.getOperation(e.right),"t8",33);case 33:n=a.t8;case 34:if(null==n.left){a.next=39;break}return a.delegateYield(this.getOperation(n.left),"t9",36);case 36:n=a.t9,a.next=34;break;case 39:if(null==n||n.id===e.right){a.next=55;break}if(Struct.Insert.getDistanceToOrigin(n)!==r){a.next=45;break}n.id[0]=r-t&&(e.left=n.id,t=r+1),a.next=50;break;case 49:return a.abrupt("break",58);case 50:return r++,a.delegateYield(this.getOperation(n.next_cl),"t10",52);case 52:n=a.t10,a.next=56;break;case 55:return a.abrupt("break",58);case 56:a.next=39;break;case 58:if(o=null,u=null,null==e.left){a.next=65;break}return a.delegateYield(this.getOperation(e.left),"t11",62);case 62:return o=a.t11,o.right=e.id,a.delegateYield(this.setOperation(o),"t12",65);case 65:if(null==e.right){a.next=70;break}return a.delegateYield(this.getOperation(e.right),"t13",67);case 67:return u=a.t13,u.left=e.id,a.delegateYield(this.setOperation(u),"t14",70);case 70:return a.delegateYield(this.setOperation(e),"t15",71);case 71:return a.delegateYield(this.getOperation(e.parent),"t16",72);case 72:if(c=a.t16,null==e.parentSub){a.next=79;break}if(null!=u){a.next=77;break}return c.map[e.parentSub]=e.id,a.delegateYield(this.setOperation(c),"t17",77);case 77:a.next=83;break;case 79:if(null!=u&&null!=o){a.next=83;break}return null==u&&(c.end=e.id),null==o&&(c.start=e.id),a.delegateYield(this.setOperation(c),"t18",83);case 83:return a.delegateYield(this.setOperation(e),"t19",84);case 84:case"end":return a.stop()}},a,this)})},List:{create:regeneratorRuntime.mark(function i(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.start=null,e.end=null,e.struct="List",t.delegateYield(Struct.Operation.create.call(this,e),"t0",4);case 4:return t.abrupt("return",t.t0);case 5:case"end":return t.stop()}},i,this)}),requiredOps:function(e){var t=[];return null!=e.start&&t.push(e.start),null!=e.end&&t.push(e.end),t},execute:regeneratorRuntime.mark(function s(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.delegateYield(this.setOperation(e),"t0",1);case 1:case"end":return t.stop()}},s,this)}),ref:regeneratorRuntime.mark(function o(e,t){var r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:r=e.start;case 1:if(0===t&&null==r){n.next=7;break}return n.delegateYield(this.getOperation(r),"t0",3);case 3:r=n.t0.right,t--,n.next=1;break;case 7:if(null!=r){n.next=11;break}n.t1=null,n.next=13;break;case 11:return n.delegateYield(this.getOperation(r),"t2",12);case 12:n.t1=n.t2;case 13:return n.abrupt("return",n.t1);case 14:case"end":return n.stop()}},o,this)}),map:regeneratorRuntime.mark(function u(e,t){var r,n;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:e=e.start,r=[];case 2:if(null==e){a.next=9;break}return a.delegateYield(this.getOperation(e),"t0",4);case 4:n=a.t0,r.push(t(n.content)),e=n.right,a.next=2;break;case 9:return a.abrupt("return",r);case 10:case"end":return a.stop()}},u,this)}),insert:regeneratorRuntime.mark(function c(e,t,r){var n,a,i,c;return regeneratorRuntime.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return s.delegateYield(Struct.List.ref.call(this,e,t),"t0",1);case 1:return n=s.t0,s.delegateYield(this.getOperation(n.right),"t1",3);case 3:a=s.t1,s.t2=regeneratorRuntime.keys(r);case 5:if((s.t3=s.t2()).done){s.next=12;break}return i=s.t3.value,c={left:n,right:a,content:r[i],parent:e},s.delegateYield(Struct.Insert.create.call(this,c),"t4",9);case 9:n=s.t4,s.next=5;break;case 12:case"end":return s.stop()}},c,this)})},Map:{create:regeneratorRuntime.mark(function l(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.map={},e.struct="Map",t.delegateYield(Struct.Operation.create.call(this,e),"t0",3);case 3:return t.abrupt("return",t.t0);case 4:case"end":return t.stop()}},l,this)}),requiredOps:function(e){var t=[];for(var r in e.map)t.push(e.map[r]);return t},execute:regeneratorRuntime.mark(function p(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.delegateYield(this.setOperation(e),"t0",1);case 1:case"end":return t.stop()}},p,this)}),get:regeneratorRuntime.mark(function f(e,t){var r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.delegateYield(this.getOperation(e.map[t]),"t0",1);case 1:return r=n.t0,n.abrupt("return",null!=r?r.content:void 0);case 3:case"end":return n.stop()}},f,this)}),set:regeneratorRuntime.mark(function h(e,t,r){var n,a;return regeneratorRuntime.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:return n=e.map[t],null==n&&(n=null,e.map[t]=n),a={left:n,right:null,content:r,parent:e.id,parentSub:t},i.delegateYield(Struct.Insert.create.call(this,a),"t0",4);case 4:case"end":return i.stop()}},h,this)})}};Y.Struct=Struct;var globalRoom={users:{},buffers:{},removeUser:function(e){for(var t in this.users)this.users[t].userLeft(e);delete this.users[e],delete this.buffers[e]},addUser:function(e){this.users[e.userId]=e,this.buffers[e.userId]=[];for(var t in this.users)if(t!==e.userId){var r=this.users[t];r.userJoined(e.userId,"master"),e.userJoined(r.userId,"master")}}};setInterval(flushOne,10);var userIdCounter=0,Test=function(e){function t(r,n){if(_classCallCheck(this,t),void 0===n)throw new Error("Options must not be undefined!");n.role="master",n.forwardToSyncingClients=!1,e.call(this,r,n),this.setUserId(userIdCounter++ +""),globalRoom.addUser(this),this.globalRoom=globalRoom}return _inherits(t,e),t.prototype.send=function(e,t){globalRoom.buffers[e].push([this.userId,t])},t.prototype.broadcast=function(e){for(var t in globalRoom.buffers)globalRoom.buffers[t].push([this.userId,e])},t.prototype.disconnect=function(){globalRoom.removeUser(this.userId)},t.prototype.flushAll=function(){for(var e=!0;e;)e=flushOne()},t}(AbstractConnector);Y.Test=Test;var WebRTC=function(e){function t(r){if(_classCallCheck(this,t),void 0===r)throw new Error("Options must not be undefined!");e.call(this,{role:"slave"});var n=r.room;null==r.url&&(r.url="https://yatta.ninja:8888");var a=new SimpleWebRTC(r);this.swr=a;var i=this;a.once("connectionReady",function(e){a.joinRoom(n),a.once("joinedRoom",function(){i.setUserId(e);var t;for(t in i.swr.webrtc.peers)i.userJoined(i.swr.webrtc.peers[t].id,"master");a.on("channelMessage",function(e,t,r){null!=r.type&&i.receiveMessage(e.id,r.payload)})}),a.on("createdPeer",function(e){i.userJoined(e.id,"master")}),a.on("peerStreamRemoved",function(e){i.userLeft(e.id)})})}return _inherits(t,e),t.prototype.send=function r(e,t){var n=this,r=function a(){var r,i=n.swr.webrtc.getPeers(e)[0];i&&(r=i.sendDirectly("simplewebrtc","yjs",t)),r||setTimeout(a,500)};r()},t.prototype.broadcast=function(e){this.swr.sendDirectlyToAll("simplewebrtc","yjs",e)},t}(AbstractConnector);Y.WebRTC=WebRTC,Y.IndexedDB=function(){var e=function(e){function t(r){_classCallCheck(this,t),e.call(this,r),this.transaction=r.db.transaction(["OperationStore","StateVector"],"readwrite"),this.sv=this.transaction.objectStore("StateVector"),this.os=this.transaction.objectStore("OperationStore"),this.buffer={}}return _inherits(t,e),t.prototype.setOperation=regeneratorRuntime.mark(function r(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.os.put(e);case 2:return this.buffer[JSON.stringify(e.id)]=e,t.abrupt("return",e);case 4:case"end":return t.stop()}},r,this)}),t.prototype.getOperation=regeneratorRuntime.mark(function n(e){var t;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:if(t=this.buffer[JSON.stringify(e)],null!=t){r.next=6;break}return r.next=4,this.os.get(e);case 4:t=r.sent,this.buffer[JSON.stringify(e)]=t;case 6:return r.abrupt("return",t);case 7:case"end":return r.stop()}},n,this)}),t.prototype.removeOperation=regeneratorRuntime.mark(function a(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return this.buffer[JSON.stringify(e)]=null,t.next=3,this.os["delete"](e);case 3:return t.abrupt("return",t.sent);case 4:case"end":return t.stop()}},a,this)}),t.prototype.setState=regeneratorRuntime.mark(function i(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.sv.put(e);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}},i,this)}),t.prototype.getState=regeneratorRuntime.mark(function s(e){var t;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,this.sv.get(e);case 2:if(r.t0=t=r.sent,null==r.t0){r.next=7;break}return r.abrupt("return",t);case 7:return r.abrupt("return",{user:e,clock:0});case 8:case"end":return r.stop()}},s,this)}),t.prototype.getStateVector=regeneratorRuntime.mark(function o(){var e,t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:e=[],t=this.sv.openCursor();case 2:return n.next=4,t;case 4:if(n.t0=r=n.sent,null==n.t0){n.next=10;break}e.push(r.value),r["continue"](),n.next=2;break;case 10:return n.abrupt("return",e);case 11:case"end":return n.stop()}},o,this)}),t.prototype.getStateSet=regeneratorRuntime.mark(function u(){var e,t,r,n,a,i,s;return regeneratorRuntime.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return o.delegateYield(this.getStateVector(),"t0",1);case 1:e=o.t0,t={},r=e,n=Array.isArray(r),a=0,r=n?r:r[Symbol.iterator]();case 4:if(!n){o.next=10;break}if(!(a>=r.length)){o.next=7;break}return o.abrupt("break",18);case 7:i=r[a++],o.next=14;break;case 10:if(a=r.next(),!a.done){o.next=13;break}return o.abrupt("break",18);case 13:i=a.value;case 14:s=i,t[s.user]=s.clock;case 16:o.next=4;break;case 18:return o.abrupt("return",t);case 19:case"end":return o.stop()}},u,this)}),t.prototype.getOperations=regeneratorRuntime.mark(function c(e){var t,r,n,a,i,s,o,u,l,p,f,h,d;return regeneratorRuntime.wrap(function(c){for(;;)switch(c.prev=c.next){case 0:return null==e&&(e={}),t=[],c.delegateYield(this.getStateVector(),"t0",3);case 3:r=c.t0,n=r,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();case 5:if(!a){c.next=11;break}if(!(i>=n.length)){c.next=8;break}return c.abrupt("break",31);case 8:s=n[i++],c.next=15;break;case 11:if(i=n.next(),!i.done){c.next=14;break}return c.abrupt("break",31);case 14:s=i.value;case 15:o=s,u=o.user,l=e[u]||0,p=o.clock,f=IDBKeyRange.bound([u,l],[u,p]),h=this.os.openCursor(f);case 21:return c.next=23,h;case 23:if(c.t1=d=c.sent,null==c.t1){c.next=29;break}t.push(d.value),d["continue"](),c.next=21;break;case 29:c.next=5;break;case 31:return c.abrupt("return",t);case 32:case"end":return c.stop()}},c,this)}),t}(AbstractTransaction),t=function(t){function r(n,a){function i(e){var t=e.value;e.done||(t.constructor===IDBRequest||t.constructor===IDBCursor?(t.onsuccess=function(){i(o.next(t.result))},t.onerror=function(e){o["throw"](e)}):t===s.transactionQueue?t.queue.length>0?i(o.next(t.queue.shift())):t.onRequest=function(){t.onRequest=null,i(o.next(t.queue.shift()))}:t.constructor===IDBOpenDBRequest?(t.onsuccess=function(e){var t=e.target.result;i(o.next(t))},t.onerror=function(){o["throw"]("Couldn't open IndexedDB database!")},t.onupgradeneeded=function(e){var t=e.target.result;try{t.createObjectStore("OperationStore",{keyPath:"id"}),t.createObjectStore("StateVector",{keyPath:"user"})}catch(r){}}):o["throw"]("You can not yield this type!"))}if(_classCallCheck(this,r),t.call(this,n),null==a&&(a={}),null==a.namespace||"string"!=typeof a.namespace)throw new Error("IndexedDB: expect a string (opts.namespace)!");this.namespace=a.namespace,this.idbVersion=null!=a.idbVersion?a.idbVersion:5,this.transactionQueue={queue:[],onRequest:null};var s=this,o=regeneratorRuntime.mark(function u(){var t,r,n,i;return regeneratorRuntime.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,indexedDB.open(a.namespace,s.idbVersion);case 2:s.db=o.sent,t=s.transactionQueue,r=null,n=!0;case 6:if(!n){o.next=14;break}return o.next=9,t;case 9:return i=o.sent, -r=new e(s),o.delegateYield(i.call(r,i),"t0",12);case 12:o.next=6;break;case 14:case"end":return o.stop()}},u,this)})();i(o.next())}return _inherits(r,t),r.prototype.requestTransaction=function(e){this.transactionQueue.queue.push(e),null!=this.transactionQueue.onRequest&&this.transactionQueue.onRequest()},r.prototype.removeDatabase=regeneratorRuntime.mark(function n(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return this.db.close(),e.next=3,indexedDB.deleteDatabase(this.namespace);case 3:case"end":return e.stop()}},n,this)}),r}(AbstractOperationStore);return t}(),Y.Memory=function(){var e=function(e){function t(r){_classCallCheck(this,t),e.call(this,r),this.ss=r.ss,this.os=r.os}return _inherits(t,e),t.prototype.setOperation=regeneratorRuntime.mark(function r(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return this.os[JSON.stringify(e.id)]=e,t.abrupt("return",e);case 2:case"end":return t.stop()}},r,this)}),t.prototype.getOperation=regeneratorRuntime.mark(function n(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this.os[JSON.stringify(e)]);case 1:case"end":return t.stop()}},n,this)}),t.prototype.removeOperation=regeneratorRuntime.mark(function a(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:delete this.os[JSON.stringify(e)];case 1:case"end":return t.stop()}},a,this)}),t.prototype.setState=regeneratorRuntime.mark(function i(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:this.ss[e.user]=e.clock;case 1:case"end":return t.stop()}},i,this)}),t.prototype.getState=regeneratorRuntime.mark(function s(e){var t;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:return t=this.ss[e],null==t&&(t=0),r.abrupt("return",{user:e,clock:t});case 3:case"end":return r.stop()}},s,this)}),t.prototype.getStateVector=regeneratorRuntime.mark(function o(){var e,t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:e=[];for(t in this.ss)r=this.ss[t],e.push({user:t,clock:r});return n.abrupt("return",e);case 3:case"end":return n.stop()}},o,this)}),t.prototype.getStateSet=regeneratorRuntime.mark(function u(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",this.ss);case 1:case"end":return e.stop()}},u,this)}),t.prototype.getOperations=regeneratorRuntime.mark(function c(e){var t,r,n,a,i,s,o,u,l,p,f,h;return regeneratorRuntime.wrap(function(c){for(;;)switch(c.prev=c.next){case 0:return null==e&&(e={}),t=[],c.delegateYield(this.getStateVector(),"t0",3);case 3:r=c.t0,n=r,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();case 5:if(!a){c.next=11;break}if(!(i>=n.length)){c.next=8;break}return c.abrupt("break",35);case 8:s=n[i++],c.next=15;break;case 11:if(i=n.next(),!i.done){c.next=14;break}return c.abrupt("break",35);case 14:s=i.value;case 15:if(o=s,u=o.user,"_"!==u){c.next=19;break}return c.abrupt("continue",33);case 19:l=e[u]||0,p=o.clock,f=l;case 22:if(!(p>=f)){c.next=33;break}return c.delegateYield(this.getOperation([u,f]),"t1",24);case 24:if(h=c.t1,null==h){c.next=30;break}return c.t2=t,c.delegateYield(this.makeOperationReady.call(this,e,h),"t3",28);case 28:c.t4=c.t3,c.t2.push.call(c.t2,c.t4);case 30:f++,c.next=22;break;case 33:c.next=5;break;case 35:return c.abrupt("return",t);case 36:case"end":return c.stop()}},c,this)}),t.prototype.makeOperationReady=regeneratorRuntime.mark(function l(e,t){var r,n;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:n=t;case 1:return a.delegateYield(this.getOperation(n.right),"t0",3);case 3:if(n=a.t0,null!=n){a.next=6;break}return a.abrupt("break",11);case 6:if(r=e[n.id[0]],!(null!=r&&n.id[1]0&&e.push(t);if(e.length>0){var r=getRandom(e),n=globalRoom.buffers[r].shift(),a=globalRoom.users[r];return a.receiveMessage(n[0],n[1]),!0}return!1}function copyObject(e){var t={};for(var r in e)t[r]=e[r];return t}!function(e){function t(e,t,r,a){var i=Object.create((t||n).prototype);return i._invoke=c(e,r||null,new f(a||[])),i}function r(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(n){return{type:"throw",arg:n}}}function n(){}function a(){}function i(){}function s(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function o(e){this.arg=e}function u(e){function t(t,r){var n=e[t](r),s=n.value;return s instanceof o?Promise.resolve(s.arg).then(a,i):Promise.resolve(s).then(function(e){return n.value=e,n},i)}function r(e,r){var a=n?n.then(function(){return t(e,r)}):new Promise(function(n){n(t(e,r))});return n=a["catch"](s),a}"object"==typeof process&&process.domain&&(t=process.domain.bind(t));var n,a=t.bind(e,"next"),i=t.bind(e,"throw"),s=t.bind(e,"return");this._invoke=r}function c(e,t,n){var a=x;return function(i,s){if(a===k)throw new Error("Generator is already running");if(a===R)return d();for(;;){var o=n.delegate;if(o){if("return"===i||"throw"===i&&o.iterator[i]===g){n.delegate=null;var u=o.iterator["return"];if(u){var c=r(u,o.iterator,s);if("throw"===c.type){i="throw",s=c.arg;continue}}if("return"===i)continue}var c=r(o.iterator[i],o.iterator,s);if("throw"===c.type){n.delegate=null,i="throw",s=c.arg;continue}i="next",s=g;var l=c.arg;if(!l.done)return a=w,l;n[o.resultName]=l.value,n.next=o.nextLoc,n.delegate=null}if("next"===i)a===w?n.sent=s:delete n.sent;else if("throw"===i){if(a===x)throw a=R,s;n.dispatchException(s)&&(i="next",s=g)}else"return"===i&&n.abrupt("return",s);a=k;var c=r(e,t,n);if("normal"===c.type){a=n.done?R:w;var l={value:c.arg,done:n.done};if(c.arg!==S)return l;n.delegate&&"next"===i&&(s=g)}else"throw"===c.type&&(a=R,i="throw",s=c.arg)}}}function l(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function p(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function f(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(l,this),this.reset()}function h(e){if(e){var t=e[y];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function a(){for(;++rt;++t)this[e]=null},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,n){return i.type="throw",i.arg=e,r.next=t,!!n}if(this.done)throw e;for(var r=this,n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n],i=a.completion;if("root"===a.tryLoc)return t("end");if(a.tryLoc<=this.prev){var s=b.call(a,"catchLoc"),o=b.call(a,"finallyLoc");if(s&&o){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&b.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),p(r),S}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;p(r)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:h(e),resultName:t,nextLoc:r},S}}}("object"==typeof global?global:"object"==typeof window?window:"object"==typeof self?self:void 0);var GeneratorFunction=regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}},e,this)}).constructor,Y=function(){function e(t){_classCallCheck(this,e),this.db=new e[t.db.name](this,t.db),this.connector=new e[t.connector.name](this,t.connector),this.db.requestTransaction(regeneratorRuntime.mark(function r(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.delegateYield(this.addOperation({id:["_",0],struct:"Map",map:{}}),"t0",1);case 1:case"end":return e.stop()}},r,this)}))}return e.prototype.transact=function(e){if(e.constructor!==GeneratorFunction)throw new Error("y.transact requires a Generator function! E.g. function*(){/*..*/}");this.db.requestTransaction(e)},e.prototype.destroy=function(){this.connector.disconnect(),this.db.removeDatabase(),this.connector=null,this.db=null,this.transact=function(){throw new Error("Remember?, you destroyed this type ;)")}},e}(),AbstractConnector=function(){function e(t,r){if(_classCallCheck(this,e),this.y=t,null==r&&(r={}),null==r.role||"master"===r.role)this.role="master";else{if("slave"!==r.role)throw new Error("Role must be either 'master' or 'slave'!");this.role="slave"}this.role=r.role,this.connections={},this.userEventListeners=[],this.whenSyncedListeners=[],this.currentSyncTarget=null,this.syncingClients=[],this.forwardToSyncingClients=r.forwardToSyncingClients===!1?!1:!0,this.debug=r.debug?!0:!1}return e.prototype.setUserId=function(e){this.userId=e,this.y.db.setUserId(e)},e.prototype.onUserEvent=function(e){this.userEventListeners.push(e)},e.prototype.userLeft=function(e){delete this.connections[e],e===this.currentSyncTarget&&(this.currentSyncTarget=null,this.findNextSyncTarget());for(var t=this.userEventListeners,r=Array.isArray(t),n=0,t=r?t:t[Symbol.iterator]();;){var a;if(r){if(n>=t.length)break;a=t[n++]}else{if(n=t.next(),n.done)break;a=n.value}var i=a;i({action:"userLeft",user:e})}},e.prototype.userJoined=function(e,t){if(null==t)throw new Error("You must specify the role of the joined user!");if(null!=this.connections[e])throw new Error("This user already joined!");this.connections[e]={isSynced:!1,role:t};for(var r=this.userEventListeners,n=Array.isArray(r),a=0,r=n?r:r[Symbol.iterator]();;){var i;if(n){if(a>=r.length)break;i=r[a++]}else{if(a=r.next(),a.done)break;i=a.value}var s=i;s({action:"userJoined",user:e,role:t})}null==this.currentSyncTarget&&this.findNextSyncTarget()},e.prototype.whenSynced=function(e){this.isSynced===!0?e():this.whenSyncedListeners.push(e)},e.prototype.findNextSyncTarget=function(){if(null!=this.currentSyncTarget&&this.connections[this.currentSyncTarget].isSynced===!1)throw new Error("The current sync has not finished!");var e=null;for(var t in this.connections)if(e=this.connections[t],!e.isSynced)break;if(null!=e){var r=this;this.y.db.requestTransaction(regeneratorRuntime.mark(function u(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r.currentSyncTarget=t,e.t0=r,e.t1=t,e.delegateYield(this.getStateVector(),"t2",4);case 4:e.t3=e.t2,e.t4={type:"sync step 1",stateVector:e.t3},e.t0.send.call(e.t0,e.t1,e.t4);case 7:case"end":return e.stop()}},u,this)}))}if(!this.isSynced){this.isSynced=!0;for(var n=this.whenSyncedListeners,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var s;if(a){if(i>=n.length)break;s=n[i++]}else{if(i=n.next(),i.done)break;s=i.value}var o=s;o()}this.whenSyncedListeners=null}return!1},e.prototype.receiveMessage=function(e,t){var r=this;if(this.debug&&console.log(e+" -> "+this.userId+": "+JSON.stringify(t)),"sync step 1"===t.type)!function(){var n=r;r.y.db.requestTransaction(regeneratorRuntime.mark(function a(){var r,i;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.delegateYield(this.getOperations(t.stateVector),"t0",1);case 1:return r=a.t0,a.delegateYield(this.getStateVector(),"t1",3);case 3:i=a.t1,n.send(e,{type:"sync step 2",os:r,stateVector:i}),this.forwardToSyncingClients&&(n.syncingClients.push(e),setTimeout(function(){n.syncingClients=n.syncingClients.filter(function(t){return t!==e}),n.send(e,{type:"sync done"})},n.syncingClientDuration));case 6:case"end":return a.stop()}},a,this)}))}();else if("sync step 2"===t.type)!function(){r.y.db.apply(t.os);var e=r;r.y.db.requestTransaction(regeneratorRuntime.mark(function n(){var r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.delegateYield(this.getOperations(t.stateVector),"t0",1);case 1:r=n.t0,r.length>0&&e.broadcast({type:"update",ops:r});case 3:case"end":return n.stop()}},n,this)}))}();else if("sync done"===t.type)this.connections[e].isSynced=!0,this.findNextSyncTarget();else if("update"===t.type){if(this.forwardToSyncingClients)for(var n=this.syncingClients,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var s;if(a){if(i>=n.length)break;s=n[i++]}else{if(i=n.next(),i.done)break;s=i.value}var o=s;this.send(o,t)}this.y.db.apply(t.ops)}},e.prototype.parseMessageFromXml=function(e){function t(e){var t=!0;e:for(;t;){var n=e;a=i=s=a=o=u=void 0,t=!1;for(var a=n.children,i=Array.isArray(a),s=0,a=i?a:a[Symbol.iterator]();;){var o;if(i){if(s>=a.length)break;o=a[s++]}else{if(s=a.next(),s.done)break;o=s.value}var u=o;if("true"===u.getAttribute("isArray")){e=u,t=!0;continue e}return r(u)}}}function r(e){var n={};for(var a in e.attrs){var i=e.attrs[a],s=parseInt(i);n[a]=isNaN(s)||""+s!==i?i:s}for(var o in e.children){var u=o.name;n[u]="true"===o.getAttribute("isArray")?t(o):r(o)}return n}r(e)},e.prototype.encodeMessageToXml=function(e,t){function r(e,t){for(var a in t){var i=t[a];null==a||(i.constructor===Object?r(e.c(a),i):i.constructor===Array?n(e.c(a),i):e.setAttribute(a,i))}}function n(e,t){e.setAttribute("isArray","true");for(var a=t,i=Array.isArray(a),s=0,a=i?a:a[Symbol.iterator]();;){var o;if(i){if(s>=a.length)break;o=a[s++]}else{if(s=a.next(),s.done)break;o=s.value}var u=o;u.constructor===Object?r(e.c("array-element"),u):n(e.c("array-element"),u)}}if(t.constructor===Object)r(e.c("y",{xmlns:"http://y.ninja/connector-stanza"}),t);else{if(t.constructor!==Array)throw new Error("I can't encode this json!");n(e.c("y",{xmlns:"http://y.ninja/connector-stanza"}),t)}},e}(),AbstractTransaction=function(){function e(t){_classCallCheck(this,e),this.store=t}return e.prototype.addOperation=regeneratorRuntime.mark(function t(e){var r;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.delegateYield(this.getState(e.id[0]),"t0",1);case 1:if(r=t.t0,e.id[1]!==r.clock){t.next=10;break}return r.clock++,t.delegateYield(this.setState(r),"t1",5);case 5:return t.delegateYield(this.setOperation(e),"t2",6);case 6:return this.store.operationAdded(e),t.abrupt("return",!0);case 10:if(!(e.id[1]0){var r={op:t,missing:e.length};for(var n in e){var a=e[n],i=JSON.stringify(a),s=this.listenersById[i];null==s&&(s=[],this.listenersById[i]=s),s.push(r)}}else this.listenersByIdExecuteNow.push({op:t});if(!this.listenersByIdRequestPending){this.listenersByIdRequestPending=!0;var o=this;this.requestTransaction(regeneratorRuntime.mark(function u(){var e,t,r,n,a,i,s,c;return regeneratorRuntime.wrap(function(u){for(;;)switch(u.prev=u.next){case 0:e=o.listenersByIdExecuteNow,o.listenersByIdExecuteNow=[],t=o.listenersById,o.listenersById={},o.listenersByIdRequestPending=!1,u.t0=regeneratorRuntime.keys(e);case 6:if((u.t1=u.t0()).done){u.next=12;break}return r=u.t1.value,n=e[r].op,u.delegateYield(Struct[n.struct].execute.call(this,n),"t2",10);case 10:u.next=6;break;case 12:u.t3=regeneratorRuntime.keys(t);case 13:if((u.t4=u.t3()).done){u.next=34;break}return a=u.t4.value,i=t[a],s=JSON.parse(a),u.delegateYield(this.getOperation(s),"t5",18);case 18:if(u.t6=u.t5,null!=u.t6){u.next=23;break}o.listenersById[a]=i,u.next=32;break;case 23:u.t7=regeneratorRuntime.keys(i);case 24:if((u.t8=u.t7()).done){u.next=32;break}if(r=u.t8.value,c=i[r],n=c.op,0!==--c.missing){u.next=30;break}return u.delegateYield(Struct[n.struct].execute.call(this,n),"t9",30);case 30:u.next=24;break;case 32:u.next=13;break;case 34:case"end":return u.stop()}},u,this)}))}},e.prototype.operationAdded=function(e){var t=JSON.stringify(e.id),r=this.listenersById[t];if(delete this.listenersById[t],null!=r)for(var n in r){var a=r[n];0===--a.missing&&this.whenOperationsExist([],a.op)}var i=this.parentListeners[e.parent];if(!this.parentListenersRequestPending&&null!=i&&0!==i.length){var s=this.parentListenersActivated[JSON.stringify(e.parent)];null==s&&(s=[],this.parentListenersActivated[JSON.stringify(e.parent)]=s),s.push(e),this.parentListenersRequestPending=!0;var o=this;this.requestTransaction(regeneratorRuntime.mark(function u(){var e,t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:o.parentListenersRequestPending=!1,e=o.parentListenersActivated,o.parentListenersActivated={},n.t0=regeneratorRuntime.keys(e);case 4:if((n.t1=n.t0()).done){n.next=11;break}return t=n.t1.value,n.delegateYield(this.getOperation(t),"t2",7);case 7:r=n.t2,Struct[r.struct].notifyObservers(e[t]),n.next=4;break;case 11:case"end":return n.stop()}},u,this)}))}},e.prototype.removeParentListener=function(e,t){var r=this.parentListeners[e];null!=r&&(this.parentListeners[e]=r.filter(function(e){return t!==e}))},e.prototype.addParentListener=function(e,t){var r=this.parentListeners[JSON.stringify(e)];null==r&&(r=[],this.parentListeners[JSON.stringify(e)]=r),r.push(t)},e}();Y.AbstractOperationStore=AbstractOperationStore;var Struct={Operation:{create:regeneratorRuntime.mark(function t(e){var r,n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return r=this.store.y.connector.userId,t.delegateYield(this.getState(r),"t0",2);case 2:return n=t.t0,e.id=[r,n.clock],t.delegateYield(this.addOperation(e),"t1",5);case 5:if(t.t2=t.t1,t.t2!==!1){t.next=8;break}throw new Error("This is highly unexpected :(");case 8:this.store.y.connector.broadcast({type:"update",ops:[Struct[e.struct].encode(e)]});case 9:case"end":return t.stop()}},t,this)})},Insert:{create:regeneratorRuntime.mark(function r(e){var t,n,a,i,s;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:if(void 0!==e.left&&void 0!==e.right&&void 0!==e.parent){r.next=2;break}throw new Error("You must define left, right, and parent!");case 2:return e.origin=e.left,e.struct="Insert",r.delegateYield(Struct.Operation.create.call(this,e),"t0",5);case 5:if(null==e.left){r.next=10;break}return r.delegateYield(this.getOperation(e.left),"t1",7);case 7:return t=r.t1,t.right=e.id,r.delegateYield(this.setOperation(t),"t2",10);case 10:if(null==e.right){r.next=15;break}return r.delegateYield(this.getOperation(e.right),"t3",12);case 12:return n=r.t3,n.left=e.id,r.delegateYield(this.setOperation(n),"t4",15);case 15:return r.delegateYield(this.getOperation(e.parent),"t5",16);case 16:if(a=r.t5,null==e.parentSub){r.next=23;break}if(!compareIds(a.map[e.parentSub],e.right)){r.next=21;break}return a.map[e.parentSub]=e.id,r.delegateYield(this.setOperation(a),"t6",21);case 21:r.next=29;break;case 23:if(i=compareIds(a.start,e.right),s=compareIds(a.end,e.left),!i&&!s){r.next=29;break}return i&&(a.start=e.id),s&&(a.end=e.id),r.delegateYield(this.setOperation(a),"t7",29);case 29:return r.abrupt("return",e);case 30:case"end":return r.stop()}},r,this)}),encode:function(e){return e},requiredOps:function(e){var t=[];return null!=e.left&&t.push(e.left),null!=e.right&&t.push(e.right),null==e.right&&null==e.left&&t.push(e.parent),t},getDistanceToOrigin:regeneratorRuntime.mark(function n(e){var t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return t=0,n.delegateYield(this.getOperation(e.left),"t0",2);case 2:r=n.t0;case 3:if(e.origin===(r?r.id:null)){n.next=9;break}return t++,n.delegateYield(this.getOperation(r.left),"t1",6);case 6:r=n.t1,n.next=3;break;case 9:return n.abrupt("return",t);case 10:case"end":return n.stop()}},n,this)}),execute:regeneratorRuntime.mark(function a(e){var t,r,n,i,s,o,u,c,l;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.delegateYield(Struct.Insert.getDistanceToOrigin.call(this,e),"t0",1);case 1:if(r=t=a.t0,null==e.left){a.next=9;break}return a.delegateYield(this.getOperation(e.left),"t1",4);case 4:return n=a.t1,a.delegateYield(this.getOperation(n.right),"t2",6);case 6:n=a.t2,a.next=28;break;case 9:if(null==e.right){a.next=19;break}return a.delegateYield(this.getOperation(e.right),"t3",11);case 11:n=a.t3;case 12:if(null==n.left){a.next=17;break}return a.delegateYield(this.getOperation(n.left),"t4",14);case 14:n=a.t4,a.next=12;break;case 17:a.next=28;break;case 19:return a.delegateYield(this.getOperation(e.parent),"t5",20);case 20:if(i=a.t5,null==e.parentSub){a.next=26;break}return a.delegateYield(this.getOperation(i.map[e.parentSub]),"t6",23);case 23:n=a.t6,a.next=28;break;case 26:return a.delegateYield(this.getOperation(i.start),"t7",27);case 27:n=a.t7;case 28:if(null==n||n.id===e.right){a.next=46;break}return a.delegateYield(Struct.Insert.getDistanceToOrigin.call(this,n),"t8",31);case 31:if(s=a.t8,s!==t){a.next=36;break}n.id[0]s)){a.next=40;break}s>=t-r&&(e.left=n.id,r=t+1),a.next=41;break;case 40:return a.abrupt("break",49);case 41:return t++,a.delegateYield(this.getOperation(n.next_cl),"t9",43);case 43:n=a.t9,a.next=47;break;case 46:return a.abrupt("break",49);case 47:a.next=28;break;case 49:return o=null,u=null,a.delegateYield(this.getOperation(e.parent),"t10",52);case 52:if(c=a.t10,null==e.left){a.next=65;break}return a.delegateYield(this.getOperation(e.left),"t11",55);case 55:return o=a.t11,e.right=o.right,o.right=e.id,a.delegateYield(this.addOperation(e),"t12",59);case 59:if(a.t13=a.t12,a.t13!==!1){a.next=62;break}return a.abrupt("return");case 62:return a.delegateYield(this.setOperation(o),"t14",63);case 63:a.next=70;break;case 65:return a.delegateYield(this.addOperation(e),"t15",66);case 66:if(a.t16=a.t15,a.t16!==!1){a.next=69;break}return a.abrupt("return");case 69:null!=e.parentSub?(l=c[e.parentSub],e.right=null!=l?l:null):e.right=c.start;case 70:if(null==e.right){a.next=75;break}return a.delegateYield(this.getOperation(e.right),"t17",72);case 72:return u=a.t17,u.left=e.id,a.delegateYield(this.setOperation(u),"t18",75);case 75:if(null==e.parentSub){a.next=81;break}if(null!=o){a.next=79;break}return c.map[e.parentSub]=e.id,a.delegateYield(this.setOperation(c),"t19",79);case 79:a.next=85;break;case 81:if(null!=u&&null!=o){a.next=85;break}return null==u&&(c.end=e.id),null==o&&(c.start=e.id),a.delegateYield(this.setOperation(c),"t20",85);case 85:case"end":return a.stop()}},a,this)})},List:{create:regeneratorRuntime.mark(function i(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.start=null,e.end=null,e.struct="List",t.delegateYield(Struct.Operation.create.call(this,e),"t0",4);case 4:return t.abrupt("return",t.t0);case 5:case"end":return t.stop()}},i,this)}),encode:function(e){return{struct:"List",id:e.id}},requiredOps:function(e){var t=[];return null!=e.start&&t.push(e.start),null!=e.end&&t.push(e.end),t},execute:regeneratorRuntime.mark(function s(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.delegateYield(this.addOperation(e),"t0",1);case 1:if(t.t1=t.t0,t.t1!==!1){t.next=4;break}return t.abrupt("return");case 4:case"end":return t.stop()}},s,this)}),ref:regeneratorRuntime.mark(function o(e,t){var r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:r=e.start;case 1:if(0===t&&null==r){n.next=7;break}return n.delegateYield(this.getOperation(r),"t0",3);case 3:r=n.t0.right,t--,n.next=1;break;case 7:if(null!=r){n.next=11;break}n.t1=null,n.next=13;break;case 11:return n.delegateYield(this.getOperation(r),"t2",12);case 12:n.t1=n.t2;case 13:return n.abrupt("return",n.t1);case 14:case"end":return n.stop()}},o,this)}),map:regeneratorRuntime.mark(function u(e,t){var r,n;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:e=e.start,r=[];case 2:if(null==e){a.next=9;break}return a.delegateYield(this.getOperation(e),"t0",4);case 4:n=a.t0,r.push(t(n.content)),e=n.right,a.next=2;break;case 9:return a.abrupt("return",r);case 10:case"end":return a.stop()}},u,this)}),insert:regeneratorRuntime.mark(function c(e,t,r){var n,a,i,c;return regeneratorRuntime.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return s.delegateYield(Struct.List.ref.call(this,e,t),"t0",1);case 1:return n=s.t0,s.delegateYield(this.getOperation(n.right),"t1",3);case 3:a=s.t1,s.t2=regeneratorRuntime.keys(r);case 5:if((s.t3=s.t2()).done){s.next=12;break}return i=s.t3.value,c={left:n,right:a,content:r[i],parent:e},s.delegateYield(Struct.Insert.create.call(this,c),"t4",9);case 9:n=s.t4,s.next=5;break;case 12:case"end":return s.stop()}},c,this)})},Map:{create:regeneratorRuntime.mark(function l(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.map={},e.struct="Map",t.delegateYield(Struct.Operation.create.call(this,e),"t0",3);case 3:return t.abrupt("return",t.t0);case 4:case"end":return t.stop()}},l,this)}),encode:function(e){return{struct:"Map",id:e.id}},requiredOps:function(e){var t=[];for(var r in e.map)t.push(e.map[r]);return t},execute:regeneratorRuntime.mark(function p(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.delegateYield(this.addOperation(e),"t0",1);case 1:if(t.t1=t.t0,t.t1!==!1){t.next=4;break}return t.abrupt("return");case 4:case"end":return t.stop()}},p,this)}),get:regeneratorRuntime.mark(function f(e,t){var r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.delegateYield(this.getOperation(e.map[t]),"t0",1);case 1:return r=n.t0,n.abrupt("return",null!=r?r.content:void 0);case 3:case"end":return n.stop()}},f,this)}),set:regeneratorRuntime.mark(function h(e,t,r){var n;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return n={left:null,right:e.map[t]||null,content:r,parent:e.id,parentSub:t},a.delegateYield(Struct.Insert.create.call(this,n),"t0",2);case 2:case"end":return a.stop()}},h,this)})}};Y.Struct=Struct;var globalRoom={users:{},buffers:{},removeUser:function(e){for(var t in this.users)this.users[t].userLeft(e);delete this.users[e],delete this.buffers[e]},addUser:function(e){this.users[e.userId]=e,this.buffers[e.userId]=[];for(var t in this.users)if(t!==e.userId){var r=this.users[t];r.userJoined(e.userId,"master"),e.userJoined(r.userId,"master")}}};setInterval(flushOne,10);var userIdCounter=0,Test=function(e){function t(r,n){if(_classCallCheck(this,t),void 0===n)throw new Error("Options must not be undefined!");n.role="master",n.forwardToSyncingClients=!1,e.call(this,r,n),this.setUserId(userIdCounter++ +""),globalRoom.addUser(this),this.globalRoom=globalRoom}return _inherits(t,e),t.prototype.send=function(e,t){globalRoom.buffers[e].push(JSON.parse(JSON.stringify([this.userId,t])))},t.prototype.broadcast=function(e){for(var t in globalRoom.buffers)globalRoom.buffers[t].push(JSON.parse(JSON.stringify([this.userId,e])))},t.prototype.disconnect=function(){globalRoom.removeUser(this.userId)},t.prototype.flushAll=function(){for(var e=!0;e;)e=flushOne()},t}(AbstractConnector);Y.Test=Test;var WebRTC=function(e){function t(r){if(_classCallCheck(this,t),void 0===r)throw new Error("Options must not be undefined!");e.call(this,{role:"slave"});var n=r.room;null==r.url&&(r.url="https://yatta.ninja:8888");var a=new SimpleWebRTC(r);this.swr=a;var i=this;a.once("connectionReady",function(e){a.joinRoom(n),a.once("joinedRoom",function(){i.setUserId(e);var t;for(t in i.swr.webrtc.peers)i.userJoined(i.swr.webrtc.peers[t].id,"master");a.on("channelMessage",function(e,t,r){null!=r.type&&i.receiveMessage(e.id,r.payload)})}),a.on("createdPeer",function(e){i.userJoined(e.id,"master")}),a.on("peerStreamRemoved",function(e){i.userLeft(e.id)})})}return _inherits(t,e),t.prototype.send=function r(e,t){var n=this,r=function a(){var r,i=n.swr.webrtc.getPeers(e)[0];i&&(r=i.sendDirectly("simplewebrtc","yjs",t)),r||setTimeout(a,500)};r()},t.prototype.broadcast=function(e){this.swr.sendDirectlyToAll("simplewebrtc","yjs",e)},t}(AbstractConnector);Y.WebRTC=WebRTC,Y.IndexedDB=function(){var e=function(e){function t(r){_classCallCheck(this,t),e.call(this,r),this.transaction=r.db.transaction(["OperationStore","StateVector"],"readwrite"),this.sv=this.transaction.objectStore("StateVector"),this.os=this.transaction.objectStore("OperationStore"),this.buffer={}}return _inherits(t,e),t.prototype.setOperation=regeneratorRuntime.mark(function r(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.os.put(e);case 2:return this.buffer[JSON.stringify(e.id)]=e,t.abrupt("return",e);case 4:case"end":return t.stop()}},r,this)}),t.prototype.getOperation=regeneratorRuntime.mark(function n(e){var t;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:if(t=this.buffer[JSON.stringify(e)],null!=t){r.next=6;break}return r.next=4,this.os.get(e);case 4:t=r.sent,this.buffer[JSON.stringify(e)]=t;case 6:return r.abrupt("return",t);case 7:case"end":return r.stop()}},n,this)}),t.prototype.removeOperation=regeneratorRuntime.mark(function a(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return this.buffer[JSON.stringify(e)]=null,t.next=3,this.os["delete"](e);case 3:return t.abrupt("return",t.sent);case 4:case"end":return t.stop()}},a,this)}),t.prototype.setState=regeneratorRuntime.mark(function i(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.sv.put(e);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}},i,this)}),t.prototype.getState=regeneratorRuntime.mark(function s(e){var t;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,this.sv.get(e);case 2:if(r.t0=t=r.sent,null==r.t0){r.next=7;break}return r.abrupt("return",t);case 7:return r.abrupt("return",{user:e,clock:0});case 8:case"end":return r.stop()}},s,this)}),t.prototype.getStateVector=regeneratorRuntime.mark(function o(){var e,t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:e=[],t=this.sv.openCursor();case 2:return n.next=4,t;case 4:if(n.t0=r=n.sent,null==n.t0){n.next=10;break}e.push(r.value),r["continue"](),n.next=2;break;case 10:return n.abrupt("return",e);case 11:case"end":return n.stop()}},o,this)}),t.prototype.getStateSet=regeneratorRuntime.mark(function u(){var e,t,r,n,a,i,s;return regeneratorRuntime.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return o.delegateYield(this.getStateVector(),"t0",1);case 1:e=o.t0,t={},r=e,n=Array.isArray(r),a=0,r=n?r:r[Symbol.iterator]();case 4:if(!n){o.next=10;break}if(!(a>=r.length)){o.next=7;break}return o.abrupt("break",18);case 7:i=r[a++],o.next=14;break;case 10:if(a=r.next(),!a.done){o.next=13;break}return o.abrupt("break",18);case 13:i=a.value;case 14:s=i,t[s.user]=s.clock;case 16:o.next=4;break;case 18:return o.abrupt("return",t);case 19:case"end":return o.stop()}},u,this)}),t.prototype.getOperations=regeneratorRuntime.mark(function c(e){var t,r,n,a,i,s,o,u,l,p,f,h,d;return regeneratorRuntime.wrap(function(c){for(;;)switch(c.prev=c.next){case 0:return null==e&&(e={}),t=[],c.delegateYield(this.getStateVector(),"t0",3);case 3:r=c.t0,n=r,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();case 5:if(!a){c.next=11;break}if(!(i>=n.length)){c.next=8;break}return c.abrupt("break",31);case 8:s=n[i++],c.next=15;break;case 11:if(i=n.next(),!i.done){c.next=14;break}return c.abrupt("break",31);case 14:s=i.value;case 15:o=s,u=o.user,l=e[u]||0,p=o.clock,f=IDBKeyRange.bound([u,l],[u,p]),h=this.os.openCursor(f);case 21:return c.next=23,h;case 23:if(c.t1=d=c.sent,null==c.t1){c.next=29;break}t.push(d.value),d["continue"](),c.next=21;break;case 29:c.next=5;break;case 31:return c.abrupt("return",t);case 32:case"end":return c.stop()}},c,this)}),t}(AbstractTransaction),t=function(t){function r(n,a){function i(e){var t=e.value;e.done||(t.constructor===IDBRequest||t.constructor===IDBCursor?(t.onsuccess=function(){i(o.next(t.result))},t.onerror=function(e){o["throw"](e)}):t===s.transactionQueue?t.queue.length>0?i(o.next(t.queue.shift())):t.onRequest=function(){t.onRequest=null,i(o.next(t.queue.shift()))}:t.constructor===IDBOpenDBRequest?(t.onsuccess=function(e){var t=e.target.result;i(o.next(t))},t.onerror=function(){o["throw"]("Couldn't open IndexedDB database!")},t.onupgradeneeded=function(e){var t=e.target.result;try{t.createObjectStore("OperationStore",{keyPath:"id"}),t.createObjectStore("StateVector",{keyPath:"user"})}catch(r){}}):o["throw"]("You can not yield this type!"))}if(_classCallCheck(this,r),t.call(this,n), +null==a&&(a={}),null==a.namespace||"string"!=typeof a.namespace)throw new Error("IndexedDB: expect a string (opts.namespace)!");this.namespace=a.namespace,this.idbVersion=null!=a.idbVersion?a.idbVersion:5,this.transactionQueue={queue:[],onRequest:null};var s=this,o=regeneratorRuntime.mark(function u(){var t,r,n,i;return regeneratorRuntime.wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,indexedDB.open(a.namespace,s.idbVersion);case 2:s.db=o.sent,t=s.transactionQueue,r=null,n=!0;case 6:if(!n){o.next=14;break}return o.next=9,t;case 9:return i=o.sent,r=new e(s),o.delegateYield(i.call(r,i),"t0",12);case 12:o.next=6;break;case 14:case"end":return o.stop()}},u,this)})();i(o.next())}return _inherits(r,t),r.prototype.requestTransaction=function(e){this.transactionQueue.queue.push(e),null!=this.transactionQueue.onRequest&&this.transactionQueue.onRequest()},r.prototype.removeDatabase=regeneratorRuntime.mark(function n(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return this.db.close(),e.next=3,indexedDB.deleteDatabase(this.namespace);case 3:case"end":return e.stop()}},n,this)}),r}(AbstractOperationStore);return t}(),Y.Memory=function(){var e=function(e){function t(r){_classCallCheck(this,t),e.call(this,r),this.ss=r.ss,this.os=r.os}return _inherits(t,e),t.prototype.setOperation=regeneratorRuntime.mark(function r(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return this.os[JSON.stringify(e.id)]=e,t.abrupt("return",e);case 2:case"end":return t.stop()}},r,this)}),t.prototype.getOperation=regeneratorRuntime.mark(function n(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this.os[JSON.stringify(e)]);case 1:case"end":return t.stop()}},n,this)}),t.prototype.removeOperation=regeneratorRuntime.mark(function a(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:delete this.os[JSON.stringify(e)];case 1:case"end":return t.stop()}},a,this)}),t.prototype.setState=regeneratorRuntime.mark(function i(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:this.ss[e.user]=e.clock;case 1:case"end":return t.stop()}},i,this)}),t.prototype.getState=regeneratorRuntime.mark(function s(e){var t;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:return t=this.ss[e],null==t&&(t=0),r.abrupt("return",{user:e,clock:t});case 3:case"end":return r.stop()}},s,this)}),t.prototype.getStateVector=regeneratorRuntime.mark(function o(){var e,t,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:e=[];for(t in this.ss)r=this.ss[t],e.push({user:t,clock:r});return n.abrupt("return",e);case 3:case"end":return n.stop()}},o,this)}),t.prototype.getStateSet=regeneratorRuntime.mark(function u(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",this.ss);case 1:case"end":return e.stop()}},u,this)}),t.prototype.getOperations=regeneratorRuntime.mark(function c(e){var t,r,n,a,i,s,o,u,l,p,f,h;return regeneratorRuntime.wrap(function(c){for(;;)switch(c.prev=c.next){case 0:return null==e&&(e={}),t=[],c.delegateYield(this.getStateVector(),"t0",3);case 3:r=c.t0,n=r,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();case 5:if(!a){c.next=11;break}if(!(i>=n.length)){c.next=8;break}return c.abrupt("break",36);case 8:s=n[i++],c.next=15;break;case 11:if(i=n.next(),!i.done){c.next=14;break}return c.abrupt("break",36);case 14:s=i.value;case 15:if(o=s,u=o.user,"_"!==u){c.next=19;break}return c.abrupt("continue",34);case 19:l=e[u]||0,p=o.clock,f=l;case 22:if(!(p>=f)){c.next=34;break}return c.delegateYield(this.getOperation([u,f]),"t1",24);case 24:if(h=c.t1,null==h){c.next=31;break}return h=Struct[h.struct].encode(h),c.t2=t,c.delegateYield(this.makeOperationReady.call(this,e,h),"t3",29);case 29:c.t4=c.t3,c.t2.push.call(c.t2,c.t4);case 31:f++,c.next=22;break;case 34:c.next=5;break;case 36:return c.abrupt("return",t);case 37:case"end":return c.stop()}},c,this)}),t.prototype.makeOperationReady=regeneratorRuntime.mark(function l(e,t){var r,n;return regeneratorRuntime.wrap(function(a){for(;;)switch(a.prev=a.next){case 0:n=t;case 1:return a.delegateYield(this.getOperation(n.right),"t0",3);case 3:if(n=a.t0,null!=n){a.next=6;break}return a.abrupt("break",11);case 6:if(r=e[n.id[0]],!(null!=r&&n.id[1] $o origin: $this ins\n # else $insert_position will not change\n # (maybe we encounter case 1 later, then this will be to the right of $o)\n # case 3: $origin > $o.origin\n # $this insert_position is to the left of $o (forever!)\n */\n execute: function*(op){\n var distanceToOrigin = yield* Struct.Insert.getDistanceToOrigin.call(this, op); // most cases: 0 (starts from 0)\n var i = distanceToOrigin; // loop counter\n var o, tmp;\n if (op.right == null && op.left == null) {\n var p = yield* this.getOperation(op.parent);\n if (op.parentSub != null) {\n tmp = p.map[op.parentSub];\n if (!compareIds(tmp, op.id)) {\n op.right = tmp;\n }\n if (op.right == null) {\n // this is the first ins in parent\n p.map[op.parentSub] = op.id;\n yield* this.setOperation(p);\n yield* this.setOperation(op);\n return;\n }\n } else {\n tmp = p.start;\n if (!compareIds(tmp, op.id)) {\n op.left = tmp;\n }\n if (op.left == null) {\n // this is the first ins in parent\n p.start = op.id;\n p.end = op.id;\n yield* this.setOperation(p);\n yield* this.setOperation(op);\n return;\n }\n }\n }\n\n if (op.left != null) {\n o = yield* this.getOperation(op.left);\n o = yield* this.getOperation(o.right);\n } else if (op.right != null) {\n o = yield* this.getOperation(op.right);\n while (o.left != null){\n o = yield* this.getOperation(o.left);\n }\n }\n while (true) {\n if (o != null && o.id !== op.right){\n if (Struct.Insert.getDistanceToOrigin(o) === i) {\n // case 1\n if (o.id[0] < op.id[0]) {\n op.left = o.id;\n distanceToOrigin = i + 1;\n }\n } else if ((tmp = Struct.Insert.getDistanceToOrigin(o)) < i) {\n // case 2\n if (i - distanceToOrigin <= tmp) {\n op.left = o.id;\n distanceToOrigin = i + 1;\n }\n } else {\n break;\n }\n i++;\n o = yield* this.getOperation(o.next_cl);\n } else {\n break;\n }\n }\n\n // reconnect..\n var left = null;\n var right = null;\n if (op.left != null) {\n left = yield* this.getOperation(op.left);\n left.right = op.id;\n yield* this.setOperation(left);\n }\n if (op.right != null) {\n right = yield* this.getOperation(op.right);\n right.left = op.id;\n yield* this.setOperation(right);\n }\n yield* this.setOperation(op);\n\n // notify parent\n var parent = yield* this.getOperation(op.parent);\n if (op.parentSub != null) {\n if (right == null) {\n parent.map[op.parentSub] = op.id;\n yield* this.setOperation(parent);\n }\n } else {\n if (right == null || left == null) {\n if (right == null) {\n parent.end = op.id;\n }\n if (left == null) {\n parent.start = op.id;\n }\n yield* this.setOperation(parent);\n }\n }\n yield* this.setOperation(op);\n }\n },\n List: {\n create: function*( op : Op){\n op.start = null;\n op.end = null;\n op.struct = \"List\";\n return yield* Struct.Operation.create.call(this, op);\n },\n requiredOps: function(op){\n var ids = [];\n if (op.start != null) {\n ids.push(op.start);\n }\n if (op.end != null){\n ids.push(op.end);\n }\n return ids;\n },\n execute: function* (op) {\n yield* this.setOperation(op);\n },\n ref: function* (op : Op, pos : number) : Insert {\n var o = op.start;\n while ( pos !== 0 || o != null) {\n o = (yield* this.getOperation(o)).right;\n pos--;\n }\n return (o == null) ? null : yield* this.getOperation(o);\n },\n map: function* (o : Op, f : Function) : Array {\n o = o.start;\n var res = [];\n while ( o != null) {\n var operation = yield* this.getOperation(o);\n res.push(f(operation.content));\n o = operation.right;\n }\n return res;\n },\n insert: function* (op, pos : number, contents : Array) {\n var o = yield* Struct.List.ref.call(this, op, pos);\n var or = yield* this.getOperation(o.right);\n for (var key in contents) {\n var insert = {\n left: o,\n right: or,\n content: contents[key],\n parent: op\n };\n o = yield* Struct.Insert.create.call(this, insert);\n }\n }\n },\n Map: {\n /*\n {\n // empty\n }\n */\n create: function*( op : Op ){\n op.map = {};\n op.struct = \"Map\";\n return yield* Struct.Operation.create.call(this, op);\n },\n requiredOps: function(op){\n var ids = [];\n for (var end in op.map) {\n ids.push(op.map[end]);\n }\n return ids;\n },\n execute: function* (op) {\n yield* this.setOperation(op);\n },\n get: function* (op, name) {\n var res = yield* this.getOperation(op.map[name]);\n return (res != null) ? res.content : void 0;\n },\n set: function* (op, name, value) {\n var end = op.map[name];\n if (end == null) {\n end = null;\n op.map[name] = end;\n }\n var insert = {\n left: end,\n right: null,\n content: value,\n parent: op.id,\n parentSub: name\n };\n yield* Struct.Insert.create.call(this, insert);\n }\n }\n};\n\nY.Struct = Struct;\n","// returns a random element of o\n// works on Object, and Array\nfunction getRandom (o) {\n if (o instanceof Array) {\n return o[Math.floor(Math.random() * o.length)];\n } else if (o.constructor === Object) {\n var keys = [];\n for (var key in o) {\n keys.push(key);\n }\n return o[getRandom(keys)];\n }\n}\n\nvar globalRoom = {\n users: {},\n buffers: {},\n removeUser: function(user : AbstractConnector){\n\n for (var i in this.users) {\n this.users[i].userLeft(user);\n }\n delete this.users[user];\n delete this.buffers[user];\n },\n addUser: function(connector){\n this.users[connector.userId] = connector;\n this.buffers[connector.userId] = [];\n for (var uname in this.users) {\n if (uname !== connector.userId) {\n var u = this.users[uname];\n u.userJoined(connector.userId, \"master\");\n connector.userJoined(u.userId, \"master\");\n }\n }\n }\n};\nfunction flushOne(){\n var bufs = [];\n for (var i in globalRoom.buffers) {\n if (globalRoom.buffers[i].length > 0) {\n bufs.push(i);\n }\n }\n if (bufs.length > 0) {\n var userId = getRandom(bufs);\n var m = globalRoom.buffers[userId].shift();\n var user = globalRoom.users[userId];\n user.receiveMessage(m[0], m[1]);\n return true;\n } else {\n return false;\n }\n}\nsetInterval(flushOne, 10);\n\nvar userIdCounter = 0;\n\nclass Test extends AbstractConnector {\n constructor (y, options) {\n if(options === undefined){\n throw new Error(\"Options must not be undefined!\");\n }\n options.role = \"master\";\n options.forwardToSyncingClients = false;\n super(y, options);\n this.setUserId((userIdCounter++) + \"\");\n globalRoom.addUser(this);\n this.globalRoom = globalRoom;\n }\n send (userId, message) {\n globalRoom.buffers[userId].push([this.userId, message]);\n }\n broadcast (message) {\n for (var key in globalRoom.buffers) {\n globalRoom.buffers[key].push([this.userId, message]);\n }\n }\n disconnect () {\n globalRoom.removeUser(this.userId);\n }\n flushAll () {\n var c = true;\n while (c) {\n c = flushOne();\n }\n }\n}\n\nY.Test = Test;\n","\ntype State = {\n user: string,\n clock: number\n};\n\n\nfunction copyObject (o) {\n var c = {};\n for (var key in o) {\n c[key] = o[key];\n }\n return c;\n}\n\ntype StateVector = Array;\ntype OperationSet = Object; // os[Id] = op\ntype StateSet = Object;\n\nY.Memory = (function(){ //eslint-disable-line no-unused-vars\n class Transaction extends AbstractTransaction { //eslint-disable-line\n ss: StateSet;\n os: OperationSet;\n store: OperationStore;\n\n constructor (store : OperationStore) {\n super(store);\n this.ss = store.ss;\n this.os = store.os;\n }\n *setOperation (op) {\n this.os[JSON.stringify(op.id)] = op;\n return op;\n }\n *getOperation (id) {\n return this.os[JSON.stringify(id)];\n }\n *removeOperation (id) {\n delete this.os[JSON.stringify(id)];\n }\n *setState (state : State) : State {\n this.ss[state.user] = state.clock;\n }\n *getState (user : string) : State {\n var clock = this.ss[user];\n if (clock == null){\n clock = 0;\n }\n return {\n user: user,\n clock: clock\n };\n }\n *getStateVector () : StateVector {\n var stateVector = [];\n\n for (var user in this.ss) {\n var clock = this.ss[user];\n stateVector.push({\n user: user,\n clock: clock\n });\n }\n return stateVector;\n }\n *getStateSet () : StateSet {\n return this.ss;\n }\n *getOperations (startSS : StateSet) {\n if (startSS == null){\n startSS = {};\n }\n var ops = [];\n\n var endSV : StateVector = yield* this.getStateVector();\n for (var endState of endSV) {\n var user = endState.user;\n if (user === \"_\") {\n continue;\n }\n var startPos = startSS[user] || 0;\n var endPos = endState.clock;\n\n for (var clock = startPos; clock <= endPos; clock++) {\n var op = yield* this.getOperation([user, clock]);\n if (op != null) {\n ops.push(yield* this.makeOperationReady.call(this, startSS, op));\n }\n }\n }\n return ops;\n }\n *makeOperationReady (ss, op) {\n var clock;\n var o = op;\n while (true){\n // while unknown, go to the right\n o = yield* this.getOperation(o.right);\n if (o == null) {\n break;\n }\n clock = ss[o.id[0]];\n if (clock != null && o.id[1] < clock ) {\n break;\n }\n }\n op = copyObject(op);\n op.right = (o == null) ? null : o.id;\n return op;\n }\n }\n class OperationStore extends AbstractOperationStore { //eslint-disable-line no-undef\n constructor (y) {\n super(y);\n this.os = {};\n this.ss = {};\n }\n requestTransaction (makeGen : Function) {\n var t = new Transaction(this);\n var gen = makeGen.call(t, new Y.Map.Create([\"_\", 0]));\n var res = gen.next();\n while(!res.done){\n if (res.value === \"transaction\") {\n res = gen.next(t);\n } else {\n throw new Error(\"You may not yield this type. (Maybe you meant to use 'yield*'?)\");\n }\n }\n }\n *removeDatabase () {\n delete this.os;\n }\n }\n return OperationStore;\n})();\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var hasOwn = Object.prototype.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var iteratorSymbol =\n typeof Symbol === \"function\" && Symbol.iterator || \"@@iterator\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided, then outerFn.prototype instanceof Generator.\n var generator = Object.create((outerFn || Generator).prototype);\n\n generator._invoke = makeInvokeMethod(\n innerFn, self || null,\n new Context(tryLocsList || [])\n );\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n genFun.__proto__ = GeneratorFunctionPrototype;\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `value instanceof AwaitArgument` to determine if the yielded value is\n // meant to be awaited. Some may consider the name of this method too\n // cutesy, but they are curmudgeons.\n runtime.awrap = function(arg) {\n return new AwaitArgument(arg);\n };\n\n function AwaitArgument(arg) {\n this.arg = arg;\n }\n\n function AsyncIterator(generator) {\n // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : Promise.resolve(value).then(function(unwrapped) {\n result.value = unwrapped;\n return result;\n }, invokeThrow);\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n var enqueueResult =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(function() {\n return invoke(method, arg);\n }) : new Promise(function(resolve) {\n resolve(invoke(method, arg));\n });\n\n // Avoid propagating enqueueResult failures to Promises returned by\n // later invocations of the iterator, and call generator.return() to\n // allow the generator a chance to clean up.\n previousPromise = enqueueResult[\"catch\"](invokeReturn);\n\n return enqueueResult;\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n if (method === \"return\" ||\n (method === \"throw\" && delegate.iterator[method] === undefined)) {\n // A return or throw (when the delegate iterator has no throw\n // method) always terminates the yield* loop.\n context.delegate = null;\n\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n var returnMethod = delegate.iterator[\"return\"];\n if (returnMethod) {\n var record = tryCatch(returnMethod, delegate.iterator, arg);\n if (record.type === \"throw\") {\n // If the return method threw an exception, let that\n // exception prevail over the original return or throw.\n method = \"throw\";\n arg = record.arg;\n continue;\n }\n }\n\n if (method === \"return\") {\n // Continue with the outer return, now that the delegate\n // iterator has been terminated.\n continue;\n }\n }\n\n var record = tryCatch(\n delegate.iterator[method],\n delegate.iterator,\n arg\n );\n\n if (record.type === \"throw\") {\n context.delegate = null;\n\n // Like returning generator.throw(uncaught), but without the\n // overhead of an extra function call.\n method = \"throw\";\n arg = record.arg;\n continue;\n }\n\n // Delegate generator ran and handled its own exceptions so\n // regardless of what the method was, we continue as if it is\n // \"next\" with an undefined arg.\n method = \"next\";\n arg = undefined;\n\n var info = record.arg;\n if (info.done) {\n context[delegate.resultName] = info.value;\n context.next = delegate.nextLoc;\n } else {\n state = GenStateSuspendedYield;\n return info;\n }\n\n context.delegate = null;\n }\n\n if (method === \"next\") {\n if (state === GenStateSuspendedYield) {\n context.sent = arg;\n } else {\n delete context.sent;\n }\n\n } else if (method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw arg;\n }\n\n if (context.dispatchException(arg)) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n method = \"next\";\n arg = undefined;\n }\n\n } else if (method === \"return\") {\n context.abrupt(\"return\", arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n var info = {\n value: record.arg,\n done: context.done\n };\n\n if (record.arg === ContinueSentinel) {\n if (context.delegate && method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n arg = undefined;\n }\n } else {\n return info;\n }\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(arg) call above.\n method = \"throw\";\n arg = record.arg;\n }\n }\n };\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset();\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function() {\n this.prev = 0;\n this.next = 0;\n this.sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.tryEntries.forEach(resetTryEntry);\n\n // Pre-initialize at least 20 temporary variables to enable hidden\n // class optimizations for simple generators.\n for (var tempIndex = 0, tempName;\n hasOwn.call(this, tempName = \"t\" + tempIndex) || tempIndex < 20;\n ++tempIndex) {\n this[tempName] = null;\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n return !!caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.next = finallyEntry.finallyLoc;\n } else {\n this.complete(record);\n }\n\n return ContinueSentinel;\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = record.arg;\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","\nclass AbstractConnector { //eslint-disable-line no-unused-vars\n /*\n opts\n .role : String Role of this client (\"master\" or \"slave\")\n .userId : String that uniquely defines the user.\n */\n constructor (y, opts) {\n this.y = y;\n if (opts == null){\n opts = {};\n }\n if (opts.role == null || opts.role === \"master\") {\n this.role = \"master\";\n } else if (opts.role === \"slave\") {\n this.role = \"slave\";\n } else {\n throw new Error(\"Role must be either 'master' or 'slave'!\");\n }\n this.role = opts.role;\n this.connections = {};\n this.userEventListeners = [];\n this.whenSyncedListeners = [];\n this.currentSyncTarget = null;\n this.syncingClients = [];\n this.forwardToSyncingClients = (opts.forwardToSyncingClients === false) ? false : true;\n this.debug = opts.debug ? true : false;\n }\n setUserId (userId) {\n this.userId = userId;\n this.y.db.setUserId(userId);\n }\n onUserEvent (f) {\n this.userEventListeners.push(f);\n }\n userLeft (user : string) {\n delete this.connections[user];\n if (user === this.currentSyncTarget){\n this.currentSyncTarget = null;\n this.findNextSyncTarget();\n }\n for (var f of this.userEventListeners){\n f({\n action: \"userLeft\",\n user: user\n });\n }\n }\n userJoined (user, role) {\n if(role == null){\n throw new Error(\"You must specify the role of the joined user!\");\n }\n if (this.connections[user] != null) {\n throw new Error(\"This user already joined!\");\n }\n this.connections[user] = {\n isSynced: false,\n role: role\n };\n for (var f of this.userEventListeners) {\n f({\n action: \"userJoined\",\n user: user,\n role: role\n });\n }\n if (this.currentSyncTarget == null) {\n this.findNextSyncTarget();\n }\n }\n // Execute a function _when_ we are connected.\n // If not connected, wait until connected\n whenSynced (f) {\n if (this.isSynced === true) {\n f();\n } else {\n this.whenSyncedListeners.push(f);\n }\n }\n // returns false, if there is no sync target\n // true otherwise\n findNextSyncTarget () {\n if (this.currentSyncTarget != null && this.connections[this.currentSyncTarget].isSynced === false) {\n throw new Error(\"The current sync has not finished!\");\n }\n\n var syncUser = null;\n for (var uid in this.connections) {\n syncUser = this.connections[uid];\n if (!syncUser.isSynced) {\n break;\n }\n }\n if (syncUser != null){\n var conn = this;\n this.y.db.requestTransaction(function*(){\n conn.currentSyncTarget = uid;\n conn.send(uid, {\n type: \"sync step 1\",\n stateVector: yield* this.getStateVector()\n });\n });\n }\n // set the state to synced!\n if (!this.isSynced) {\n this.isSynced = true;\n for (var f of this.whenSyncedListeners) {\n f();\n }\n this.whenSyncedListeners = null;\n }\n return false;\n }\n // You received a raw message, and you know that it is intended for to Yjs. Then call this function.\n receiveMessage (sender, m){\n if (this.debug) {\n console.log(`${sender} -> ${this.userId}: ${JSON.stringify(m)}`); //eslint-disable-line\n }\n if (m.type === \"sync step 1\") {\n // TODO: make transaction, stream the ops\n let conn = this;\n this.y.db.requestTransaction(function*(){\n var ops = yield* this.getOperations(m.stateVector);\n var sv = yield* this.getStateVector();\n conn.send(sender, {\n type: \"sync step 2\",\n os: ops,\n stateVector: sv\n });\n if (this.forwardToSyncingClients) {\n conn.syncingClients.push(sender);\n setTimeout(function(){\n conn.syncingClients = conn.syncingClients.filter(function(cli){\n return cli !== sender;\n });\n conn.send(sender, {\n type: \"sync done\"\n });\n }, conn.syncingClientDuration);\n }\n });\n } else if (m.type === \"sync step 2\") {\n this.y.db.apply(m.os);\n let conn = this;\n this.y.db.requestTransaction(function*(){\n var ops = yield* this.getOperations(m.stateVector);\n if (ops.length > 0) {\n conn.broadcast({\n type: \"update\",\n ops: ops\n });\n }\n });\n } else if (m.type === \"sync done\") {\n this.connections[sender].isSynced = true;\n this.findNextSyncTarget();\n } else if (m.type === \"update\") {\n if (this.forwardToSyncingClients) {\n for (var client of this.syncingClients) {\n this.send(client, m);\n }\n }\n this.y.db.apply(m.ops);\n }\n }\n // Currently, the HB encodes operations as JSON. For the moment I want to keep it\n // that way. Maybe we support encoding in the HB as XML in the future, but for now I don't want\n // too much overhead. Y is very likely to get changed a lot in the future\n //\n // Because we don't want to encode JSON as string (with character escaping, wich makes it pretty much unreadable)\n // we encode the JSON as XML.\n //\n // When the HB support encoding as XML, the format should look pretty much like this.\n //\n // does not support primitive values as array elements\n // expects an ltx (less than xml) object\n parseMessageFromXml (m) {\n function parseArray (node) {\n for (var n of node.children){\n if (n.getAttribute(\"isArray\") === \"true\") {\n return parseArray(n);\n } else {\n return parseObject(n);\n }\n }\n }\n function parseObject (node) {\n var json = {};\n for (var attrName in node.attrs) {\n var value = node.attrs[attrName];\n var int = parseInt(value);\n if (isNaN(int) || (\"\" + int) !== value){\n json[attrName] = value;\n } else {\n json[attrName] = int;\n }\n }\n for (var n in node.children){\n var name = n.name;\n if (n.getAttribute(\"isArray\") === \"true\") {\n json[name] = parseArray(n);\n } else {\n json[name] = parseObject(n);\n }\n }\n return json;\n }\n parseObject(m);\n }\n // encode message in xml\n // we use string because Strophe only accepts an \"xml-string\"..\n // So {a:4,b:{c:5}} will look like\n // \n // \n // \n // m - ltx element\n // json - Object\n encodeMessageToXml (msg, obj) {\n // attributes is optional\n function encodeObject (m, json) {\n for (var name in json) {\n var value = json[name];\n if (name == null) {\n // nop\n } else if (value.constructor === Object) {\n encodeObject(m.c(name), value);\n } else if (value.constructor === Array) {\n encodeArray(m.c(name), value);\n } else {\n m.setAttribute(name, value);\n }\n }\n }\n function encodeArray (m, array) {\n m.setAttribute(\"isArray\", \"true\");\n for (var e of array) {\n if (e.constructor === Object) {\n encodeObject(m.c(\"array-element\"), e);\n } else {\n encodeArray(m.c(\"array-element\"), e);\n }\n }\n }\n if (obj.constructor === Object) {\n encodeObject(msg.c(\"y\", { xmlns: \"http://y.ninja/connector-stanza\" }), obj);\n } else if (obj.constructor === Array) {\n encodeArray(msg.c(\"y\", { xmlns: \"http://y.ninja/connector-stanza\" }), obj);\n } else {\n throw new Error(\"I can't encode this json!\");\n }\n }\n}\n","/* @flow */\nclass AbstractTransaction { //eslint-disable-line no-unused-vars\n constructor (store : OperationStore) {\n this.store = store;\n }\n // returns false if operation is not expected.\n *addOperation (op) {\n var state = yield* this.getState(op.id[0]);\n if (op.id[1] === state.clock){\n state.clock++;\n yield* this.setState(state);\n yield* this.setOperation(op);\n this.store.operationAdded(op);\n return true;\n } else {\n return false;\n }\n }\n}\nY.AbstractTransaction = AbstractTransaction;\n\ntype Listener = {\n f : GeneratorFunction, // is called when all operations are available\n missing : number // number of operations that are missing\n}\n\ntype Id = [string, number];\n\nclass AbstractOperationStore { //eslint-disable-line no-unused-vars\n constructor (y) {\n this.y = y;\n this.parentListeners = {};\n this.parentListenersRequestPending = false;\n this.parentListenersActivated = {};\n // E.g. this.listenersById[id] : Array\n this.listenersById = {};\n // Execute the next time a transaction is requested\n this.listenersByIdExecuteNow = [];\n // A transaction is requested\n this.listenersByIdRequestPending = false;\n /* To make things more clear, the following naming conventions:\n * ls : we put this.listenersById on ls\n * l : Array\n * id : Id (can't use as property name)\n * sid : String (converted from id via JSON.stringify\n so we can use it as a property name)\n\n Always remember to first overwrite over\n a property before you iterate over it!\n */\n }\n setUserId (userId) {\n this.userId = userId;\n }\n apply (ops) {\n for (var key in ops) {\n var o = ops[key];\n var required = Y.Struct[o.struct].requiredOps(o);\n this.whenOperationsExist(required, Y.Struct[o.struct].execute, o);\n }\n }\n // f is called as soon as every operation requested is available.\n // Note that Transaction can (and should) buffer requests.\n whenOperationsExist (ids : Array, f : GeneratorFunction, args : Array) {\n if (ids.length > 0) {\n let listener : Listener = {\n f: f,\n args: args || [],\n missing: ids.length\n };\n\n for (let key in ids) {\n let id = ids[key];\n let sid = JSON.stringify(id);\n let l = this.listenersById[sid];\n if (l == null){\n l = [];\n this.listenersById[sid] = l;\n }\n l.push(listener);\n }\n } else {\n this.listenersByIdExecuteNow.push({\n f: f,\n args: args || []\n });\n }\n\n if (this.listenersByIdRequestPending){\n return;\n }\n\n this.listenersByIdRequestPending = true;\n var store = this;\n\n this.requestTransaction(function*(){\n var exeNow = store.listenersByIdExecuteNow;\n store.listenersByIdExecuteNow = [];\n\n var ls = store.listenersById;\n store.listenersById = {};\n\n store.listenersByIdRequestPending = false;\n\n for (let key in exeNow) {\n let listener = exeNow[key];\n yield* listener.f.call(this, listener.args);\n }\n\n for (var sid in ls){\n var l = ls[sid];\n var id = JSON.parse(sid);\n if ((yield* this.getOperation(id)) == null){\n store.listenersById[sid] = l;\n } else {\n for (let key in l) {\n let listener = l[key];\n if (--listener.missing === 0){\n yield* listener.f.call(this, listener.args);\n }\n }\n }\n }\n });\n }\n // called by a transaction when an operation is added\n operationAdded (op) {\n // notify whenOperation listeners (by id)\n var l = this.listenersById[JSON.stringify(op.id)];\n if (l != null) {\n for (var key in l){\n var listener = l[key];\n if (--listener.missing === 0){\n this.whenOperationsExist([], listener.f, listener.args);\n }\n }\n }\n // notify parent listeners, if possible\n var listeners = this.parentListeners[op.parent];\n if ( this.parentListenersRequestPending\n || ( listeners == null )\n || ( listeners.length === 0 )) {\n return;\n }\n var al = this.parentListenersActivated[JSON.stringify(op.parent)];\n if ( al == null ){\n al = [];\n this.parentListenersActivated[JSON.stringify(op.parent)] = al;\n }\n al.push(op);\n\n this.parentListenersRequestPending = true;\n var store = this;\n this.requestTransaction(function*(){\n store.parentListenersRequestPending = false;\n var activatedOperations = store.parentListenersActivated;\n store.parentListenersActivated = {};\n for (var parentId in activatedOperations){\n var parent = yield* this.getOperation(parentId);\n Struct[parent.struct].notifyObservers(activatedOperations[parentId]);\n }\n });\n\n }\n removeParentListener (id, f) {\n var ls = this.parentListeners[id];\n if (ls != null) {\n this.parentListeners[id] = ls.filter(function(g){\n return (f !== g);\n });\n }\n }\n addParentListener (id, f) {\n var ls = this.parentListeners[JSON.stringify(id)];\n if (ls == null) {\n ls = [];\n this.parentListeners[JSON.stringify(id)] = ls;\n }\n ls.push(f);\n }\n}\nY.AbstractOperationStore = AbstractOperationStore;\n","\nclass WebRTC extends AbstractConnector {\n constructor (options) {\n if(options === undefined){\n throw new Error(\"Options must not be undefined!\");\n }\n super({\n role: \"slave\"\n });\n\n var room = options.room;\n\n // connect per default to our server\n if(options.url == null){\n options.url = \"https://yatta.ninja:8888\";\n }\n\n var swr = new SimpleWebRTC(options); //eslint-disable-line no-undef\n this.swr = swr;\n var self = this;\n\n swr.once(\"connectionReady\", function(userId){\n // SimpleWebRTC (swr) is initialized\n swr.joinRoom(room);\n\n swr.once(\"joinedRoom\", function(){\n self.setUserId(userId);\n var i;\n // notify the connector class about all the users that already\n // joined the session\n for(i in self.swr.webrtc.peers){\n self.userJoined(self.swr.webrtc.peers[i].id, \"master\");\n }\n swr.on(\"channelMessage\", function(peer, room_, message){\n // The client received a message\n // Check if the connector is already initialized,\n // only then forward the message to the connector class\n if(message.type != null ){\n self.receiveMessage(peer.id, message.payload);\n }\n });\n });\n\n swr.on(\"createdPeer\", function(peer){\n // a new peer/client joined the session.\n // Notify the connector class, if the connector\n // is already initialized\n self.userJoined(peer.id, \"master\");\n });\n\n swr.on(\"peerStreamRemoved\", function(peer){\n // a client left the session.\n // Notify the connector class, if the connector\n // is already initialized\n self.userLeft(peer.id);\n });\n });\n }\n send (uid, message) {\n var self = this;\n // we have to make sure that the message is sent under all circumstances\n var send = function(){\n // check if the clients still exists\n var peer = self.swr.webrtc.getPeers(uid)[0];\n var success;\n if(peer){\n // success is true, if the message is successfully sent\n success = peer.sendDirectly(\"simplewebrtc\", \"yjs\", message);\n }\n if(!success){\n // resend the message if it didn't work\n setTimeout(send, 500);\n }\n };\n // try to send the message\n send();\n }\n broadcast (message) {\n this.swr.sendDirectlyToAll(\"simplewebrtc\", \"yjs\", message);\n }\n}\n\nY.WebRTC = WebRTC;\n","\ntype State = {\n user: string,\n clock: number\n};\n\ntype StateVector = Array;\n\ntype StateSet = Object;\n\ntype IDBTransaction = Function;\ntype IDBObjectStore = Function;\ntype IDBRequest = Function;\ntype IDBCursor = Function;\ntype IDBKeyRange = Function;\n\ntype IDBOpenDBRequest = Function;\n\ndeclare var indexedDB : Object;\n\nY.IndexedDB = (function(){ //eslint-disable-line no-unused-vars\n class Transaction extends AbstractTransaction { //eslint-disable-line\n transaction: IDBTransaction;\n sv: IDBObjectStore;\n os: IDBObjectStore;\n store: OperationStore;\n\n constructor (store : OperationStore) {\n super(store);\n this.transaction = store.db.transaction([\"OperationStore\", \"StateVector\"], \"readwrite\");\n this.sv = this.transaction.objectStore(\"StateVector\");\n this.os = this.transaction.objectStore(\"OperationStore\");\n this.buffer = {};\n }\n *setOperation (op) {\n yield this.os.put(op);\n this.buffer[JSON.stringify(op.id)] = op;\n return op;\n }\n *getOperation (id) {\n var op = this.buffer[JSON.stringify(id)];\n if (op == null) {\n op = yield this.os.get(id);\n this.buffer[JSON.stringify(id)] = op;\n }\n return op;\n }\n *removeOperation (id) {\n this.buffer[JSON.stringify(id)] = null;\n return yield this.os.delete(id);\n }\n *setState (state : State) : State {\n return yield this.sv.put(state);\n }\n *getState (user : string) : State {\n var state;\n if ((state = yield this.sv.get(user)) != null){\n return state;\n } else {\n return {\n user: user,\n clock: 0\n };\n }\n }\n *getStateVector () : StateVector {\n var stateVector = [];\n var cursorResult = this.sv.openCursor();\n var cursor;\n while ((cursor = yield cursorResult) != null) {\n stateVector.push(cursor.value);\n cursor.continue();\n }\n return stateVector;\n }\n *getStateSet () : StateSet {\n var sv : StateVector = yield* this.getStateVector();\n var ss : StateSet = {};\n for (var state of sv){\n ss[state.user] = state.clock;\n }\n return ss;\n }\n\n *getOperations (startSS : StateSet) {\n if (startSS == null){\n startSS = {};\n }\n var ops = [];\n\n var endSV : StateVector = yield* this.getStateVector();\n for (var endState of endSV) {\n var user = endState.user;\n var startPos = startSS[user] || 0;\n var endPos = endState.clock;\n var range = IDBKeyRange.bound([user, startPos], [user, endPos]);\n var cursorResult = this.os.openCursor(range);\n var cursor;\n while ((cursor = yield cursorResult) != null) {\n ops.push(cursor.value);\n cursor.continue();\n }\n }\n return ops;\n }\n }\n class OperationStore extends AbstractOperationStore { //eslint-disable-line no-undef\n namespace: string;\n ready: Promise;\n whenReadyListeners: Array;\n constructor (y, opts) {\n super(y);\n if (opts == null) {\n opts = {};\n }\n if (opts.namespace == null || typeof opts.namespace !== \"string\") {\n throw new Error(\"IndexedDB: expect a string (opts.namespace)!\");\n } else {\n this.namespace = opts.namespace;\n }\n if (opts.idbVersion != null) {\n this.idbVersion = opts.idbVersion;\n } else {\n this.idbVersion = 5;\n }\n\n this.transactionQueue = {\n queue: [],\n onRequest: null\n };\n\n var store = this;\n\n var tGen = (function *transactionGen(){\n store.db = yield indexedDB.open(opts.namespace, store.idbVersion);\n var transactionQueue = store.transactionQueue;\n\n var transaction = null;\n var cont = true;\n while (cont) {\n var request = yield transactionQueue;\n transaction = new Transaction(store);\n\n yield* request.call(transaction, request);/*\n while (transactionQueue.queue.length > 0) {\n yield* transactionQueue.queue.shift().call(transaction);\n }*/\n }\n })();\n\n function handleTransactions(t){ //eslint-disable-line no-unused-vars\n var request = t.value;\n if (t.done){\n return;\n } else if (request.constructor === IDBRequest\n || request.constructor === IDBCursor ) {\n request.onsuccess = function(){\n handleTransactions(tGen.next(request.result));\n };\n request.onerror = function(err){\n tGen.throw(err);\n };\n } else if (request === store.transactionQueue) {\n if (request.queue.length > 0){\n handleTransactions(tGen.next(request.queue.shift()));\n } else {\n request.onRequest = function(){\n request.onRequest = null;\n handleTransactions(tGen.next(request.queue.shift()));\n };\n }\n } else if ( request.constructor === IDBOpenDBRequest ) {\n request.onsuccess = function(event){\n var db = event.target.result;\n handleTransactions(tGen.next(db));\n };\n request.onerror = function(){\n tGen.throw(\"Couldn't open IndexedDB database!\");\n };\n request.onupgradeneeded = function(event){\n var db = event.target.result;\n try {\n db.createObjectStore(\"OperationStore\", {keyPath: \"id\"});\n db.createObjectStore(\"StateVector\", {keyPath: \"user\"});\n } catch (e) {\n // console.log(\"Store already exists!\");\n }\n };\n } else {\n tGen.throw(\"You can not yield this type!\");\n }\n }\n handleTransactions(tGen.next());\n\n }\n requestTransaction (makeGen : Function) {\n this.transactionQueue.queue.push(makeGen);\n if (this.transactionQueue.onRequest != null) {\n this.transactionQueue.onRequest();\n }\n }\n *removeDatabase () {\n this.db.close();\n yield indexedDB.deleteDatabase(this.namespace);\n }\n }\n return OperationStore;\n})();\n","\n\n(function(){\n\n class List {\n constructor (_model) {\n this._model = _model;\n }\n *val (pos) {\n if (pos != null) {\n var o = yield* this.Struct.List.ref(this._model, pos);\n return o ? o.content : null;\n } else {\n return yield* this.Struct.List.map(this._model, function(c){return c; });\n }\n }\n *insert (pos, contents) {\n yield* this.Struct.List.insert(pos, contents);\n }\n }\n\n Y.List = function* YList(){\n var model = yield* this.Struct.List.create();\n return new List(model);\n };\n Y.List.Create = List;\n})();\n","\n(function(){\n class Map {\n constructor (_model) {\n this._model = _model;\n }\n *val () {\n var transaction = yield \"transaction\";\n var model = yield* transaction.getOperation(this._model);\n if (arguments.length === 0) {\n throw new Error(\"Implement this case!\");\n } else if (arguments.length === 1) {\n return yield* Y.Struct.Map.get.call(transaction, model, arguments[0]);\n } else {\n return yield* Y.Struct.Map.set.call(transaction, model, arguments[0], arguments[1]);\n }\n }\n }\n\n Y.Map = function* YMap(){\n if (this instanceof Y.AbstractOperationStore) {\n var model = yield* Y.Struct.map.create.call(this);\n return new Map(model);\n } else {\n throw new Error(\"Don't use `new` to create this type!\");\n }\n };\n Y.Map.Create = Map;\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["y.js","Struct.js","Connectors/Test.js","OperationStores/Memory.js","runtime.js","Connector.js","OperationStore.js","Connectors/WebRTC.js","OperationStores/IndexedDB.js","Types/List.js","Types/Map.js"],"names":["_inherits","subClass","superClass","TypeError","prototype","Object","create","constructor","value","enumerable","writable","configurable","__proto__","_classCallCheck","instance","Constructor","compareIds","id1","id2","getRandom","o","Array","Math","floor","random","length","keys","key","push","flushOne","bufs","i","globalRoom","buffers","userId","m","shift","user","users","receiveMessage","copyObject","c","global","wrap","innerFn","outerFn","self","tryLocsList","generator","Generator","_invoke","makeInvokeMethod","Context","tryCatch","fn","obj","arg","type","call","err","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","forEach","method","this","AwaitArgument","AsyncIterator","invoke","result","Promise","resolve","then","invokeNext","invokeThrow","unwrapped","enqueue","enqueueResult","previousPromise","invokeReturn","process","domain","bind","context","state","GenStateSuspendedStart","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","iterator","undefined","returnMethod","record","info","done","GenStateSuspendedYield","resultName","next","nextLoc","sent","dispatchException","abrupt","ContinueSentinel","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","values","iterable","iteratorMethod","iteratorSymbol","isNaN","hasOwn","hasOwnProperty","Symbol","inModule","module","runtime","regeneratorRuntime","exports","Gp","displayName","isGeneratorFunction","genFun","ctor","name","mark","awrap","async","iter","toString","object","reverse","pop","prev","tempName","tempIndex","stop","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","window","callee$0$0","context$1$0","Y","opts","db","connector","requestTransaction","callee$2$0","context$3$0","addOperation","id","struct","map","transact","destroy","disconnect","removeDatabase","AbstractConnector","y","role","connections","userEventListeners","whenSyncedListeners","currentSyncTarget","syncingClients","forwardToSyncingClients","debug","setUserId","onUserEvent","f","userLeft","findNextSyncTarget","_iterator","_isArray","isArray","_i","_ref","action","userJoined","isSynced","_iterator2","_isArray2","_i2","_ref2","whenSynced","syncUser","uid","conn","t0","t1","getStateVector","t3","t2","t4","stateVector","send","_iterator3","_isArray3","_i3","_ref3","sender","_this","console","log","JSON","stringify","callee$3$0","ops","sv","context$4$0","getOperations","os","setTimeout","filter","cli","syncingClientDuration","apply","broadcast","_iterator4","_isArray4","_i4","_ref4","client","parseMessageFromXml","parseArray","_x","_again","_function","node","_iterator5","_isArray5","_i5","_ref5","n","children","getAttribute","parseObject","json","attrName","attrs","int","parseInt","encodeMessageToXml","msg","encodeObject","encodeArray","setAttribute","array","_iterator6","_isArray6","_i6","_ref6","e","xmlns","AbstractTransaction","store","op","context$2$0","getState","clock","setState","setOperation","operationAdded","AbstractOperationStore","parentListeners","parentListenersRequestPending","parentListenersActivated","listenersById","listenersByIdExecuteNow","listenersByIdRequestPending","required","Struct","requiredOps","whenOperationsExist","ids","listener","missing","_id","sid","l","exeNow","ls","execute","parse","getOperation","t6","t5","t7","t8","listeners","parent","al","activatedOperations","parentId","notifyObservers","removeParentListener","g","addParentListener","Operation","encode","Insert","left","right","start","end","origin","parentSub","getDistanceToOrigin","d","distanceToOrigin","p","oOriginDistance","sub","next_cl","t9","t10","t11","t13","t12","t16","t15","t17","List","ref","pos","res","operation","content","insert","contents","or","Map","get","set","removeUser","addUser","uname","u","setInterval","userIdCounter","Test","_AbstractConnector","options","message","flushAll","WebRTC","_AbstractConnector2","room","url","swr","SimpleWebRTC","once","joinRoom","webrtc","peers","on","peer","room_","payload","success","getPeers","sendDirectly","sendDirectlyToAll","IndexedDB","Transaction","_AbstractTransaction","transaction","objectStore","buffer","put","removeOperation","cursorResult","cursor","openCursor","getStateSet","ss","_iterator7","_isArray7","_i7","_ref7","startSS","endSV","_iterator8","_isArray8","_i8","_ref8","endState","startPos","endPos","range","IDBKeyRange","bound","OperationStore","_AbstractOperationStore","handleTransactions","t","request","IDBRequest","IDBCursor","onsuccess","tGen","onerror","transactionQueue","queue","onRequest","IDBOpenDBRequest","event","target","onupgradeneeded","createObjectStore","keyPath","namespace","idbVersion","transactionGen","cont","indexedDB","open","makeGen","close","deleteDatabase","Memory","_AbstractTransaction2","_iterator9","_isArray9","_i9","_ref9","makeOperationReady","_AbstractOperationStore2","gen","Create","_model","val","YList","model","args$3$0","arguments","YMap"],"mappings":"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","file":"y.js","sourcesContent":["/* @flow */\n\nconst GeneratorFunction = (function*(){}).constructor;\n\nclass Y { //eslint-disable-line no-unused-vars\n constructor (opts) {\n this.db = new Y[opts.db.name](this, opts.db);\n this.connector = new Y[opts.connector.name](this, opts.connector);\n this.db.requestTransaction(function*(){\n // create initial Map type\n yield* this.addOperation({\n id: [\"_\", 0],\n struct: \"Map\",\n map: {}\n });\n });\n }\n transact (generator) {\n if (generator.constructor !== GeneratorFunction) {\n throw new Error(\"y.transact requires a Generator function! E.g. function*(){/*..*/}\");\n }\n this.db.requestTransaction(generator);\n }\n destroy () {\n this.connector.disconnect();\n this.db.removeDatabase();\n this.connector = null;\n this.db = null;\n this.transact = function(){\n throw new Error(\"Remember?, you destroyed this type ;)\");\n };\n }\n}\n","/* @flow */\n\n// Op is anything that we could get from the OperationStore.\ntype Op = Object;\ntype Id = [string, number];\n\ntype List = {\n id: Id,\n start: Insert,\n end: Insert\n};\n\ntype Insert = {\n id: Id,\n left: Insert,\n right: Insert,\n origin: Insert,\n parent: List,\n content: any\n};\n\nfunction compareIds(id1, id2) {\n if (id1 == null) {\n if (id2 == null) {\n return true;\n } else {\n return false;\n }\n }\n if (id1[0] === id2[0] && id1[1] === id2[1]) {\n return true;\n } else {\n return false;\n }\n}\n\nvar Struct = {\n Operation: { //eslint-disable-line no-unused-vars\n create: function*(op : Op) : Struct.Operation {\n var user = this.store.y.connector.userId;\n var state = yield* this.getState(user);\n op.id = [user, state.clock];\n if ((yield* this.addOperation(op)) === false) {\n throw new Error(\"This is highly unexpected :(\");\n }\n this.store.y.connector.broadcast({\n type: \"update\",\n ops: [Struct[op.struct].encode(op)]\n });\n }\n },\n Insert: {\n /*{\n content: any,\n left: Id,\n right: Id,\n parent: Id,\n parentSub: string (optional)\n }\n */\n create: function*( op: Op ) : Insert {\n if ( op.left === undefined\n || op.right === undefined\n || op.parent === undefined ) {\n throw new Error(\"You must define left, right, and parent!\");\n }\n op.origin = op.left;\n op.struct = \"Insert\";\n yield* Struct.Operation.create.call(this, op);\n\n if (op.left != null) {\n var left = yield* this.getOperation(op.left);\n left.right = op.id;\n yield* this.setOperation(left);\n }\n if (op.right != null) {\n var right = yield* this.getOperation(op.right);\n right.left = op.id;\n yield* this.setOperation(right);\n }\n var parent = yield* this.getOperation(op.parent);\n if (op.parentSub != null){\n if (compareIds(parent.map[op.parentSub], op.right)) {\n parent.map[op.parentSub] = op.id;\n yield* this.setOperation(parent);\n }\n } else {\n var start = compareIds(parent.start, op.right);\n var end = compareIds(parent.end, op.left);\n if (start || end) {\n if (start) {\n parent.start = op.id;\n }\n if (end) {\n parent.end = op.id;\n }\n yield* this.setOperation(parent);\n }\n }\n return op;\n },\n encode: function(op){\n /*var e = {\n id: op.id,\n left: op.left,\n right: op.right,\n origin: op.origin,\n parent: op.parent,\n content: op.content,\n struct: \"Insert\"\n };\n if (op.parentSub != null){\n e.parentSub = op.parentSub;\n }\n return e;*/\n return op;\n },\n requiredOps: function(op){\n var ids = [];\n if(op.left != null){\n ids.push(op.left);\n }\n if(op.right != null){\n ids.push(op.right);\n }\n if(op.right == null && op.left == null) {\n ids.push(op.parent);\n }\n return ids;\n },\n getDistanceToOrigin: function *(op){\n var d = 0;\n var o = yield* this.getOperation(op.left);\n while (op.origin !== (o ? o.id : null)) {\n d++;\n o = yield* this.getOperation(o.left);\n }\n return d;\n },\n /*\n # $this has to find a unique position between origin and the next known character\n # case 1: $origin equals $o.origin: the $creator parameter decides if left or right\n # let $OL= [o1,o2,o3,o4], whereby $this is to be inserted between o1 and o4\n # o2,o3 and o4 origin is 1 (the position of o2)\n # there is the case that $this.creator < o2.creator, but o3.creator < $this.creator\n # then o2 knows o3. Since on another client $OL could be [o1,o3,o4] the problem is complex\n # therefore $this would be always to the right of o3\n # case 2: $origin < $o.origin\n # if current $this insert_position > $o origin: $this ins\n # else $insert_position will not change\n # (maybe we encounter case 1 later, then this will be to the right of $o)\n # case 3: $origin > $o.origin\n # $this insert_position is to the left of $o (forever!)\n */\n execute: function*(op){\n var i; // loop counter\n var distanceToOrigin = i = yield* Struct.Insert.getDistanceToOrigin.call(this, op); // most cases: 0 (starts from 0)\n var o;\n\n // find o. o is the first conflicting operation\n if (op.left != null) {\n o = yield* this.getOperation(op.left);\n o = yield* this.getOperation(o.right);\n } else if (op.right != null) {\n o = yield* this.getOperation(op.right);\n while (o.left != null){\n o = yield* this.getOperation(o.left);\n }\n } else { // left & right are null\n var p = yield* this.getOperation(op.parent);\n if (op.parentSub != null) {\n o = yield* this.getOperation(p.map[op.parentSub]);\n } else {\n o = yield* this.getOperation(p.start);\n }\n }\n\n // handle conflicts\n while (true) {\n if (o != null && o.id !== op.right){\n var oOriginDistance = yield* Struct.Insert.getDistanceToOrigin.call(this, o);\n if (oOriginDistance === i) {\n // case 1\n if (o.id[0] < op.id[0]) {\n op.left = o.id;\n distanceToOrigin = i + 1;\n }\n } else if (oOriginDistance < i) {\n // case 2\n if (i - distanceToOrigin <= oOriginDistance) {\n op.left = o.id;\n distanceToOrigin = i + 1;\n }\n } else {\n break;\n }\n i++;\n o = yield* this.getOperation(o.next_cl);\n } else {\n break;\n }\n }\n\n // reconnect..\n var left = null;\n var right = null;\n var parent = yield* this.getOperation(op.parent);\n\n // NOTE: You you have to call addOperation before you set any other operation!\n\n // reconnect left and set right of op\n if (op.left != null) {\n left = yield* this.getOperation(op.left);\n op.right = left.right;\n left.right = op.id;\n if ((yield* this.addOperation(op)) === false) { // add here\n return;\n }\n yield* this.setOperation(left);\n } else {\n if ((yield* this.addOperation(op)) === false) { // or here\n return;\n }\n // only set right, if possible\n if (op.parentSub != null) {\n var sub = parent[op.parentSub];\n op.right = sub != null ? sub : null;\n } else {\n op.right = parent.start;\n }\n }\n // reconnect right\n if (op.right != null) {\n right = yield* this.getOperation(op.right);\n right.left = op.id;\n yield* this.setOperation(right);\n }\n\n // notify parent\n if (op.parentSub != null) {\n if (left == null) {\n parent.map[op.parentSub] = op.id;\n yield* this.setOperation(parent);\n }\n } else {\n if (right == null || left == null) {\n if (right == null) {\n parent.end = op.id;\n }\n if (left == null) {\n parent.start = op.id;\n }\n yield* this.setOperation(parent);\n }\n }\n }\n },\n List: {\n create: function*( op : Op){\n op.start = null;\n op.end = null;\n op.struct = \"List\";\n return yield* Struct.Operation.create.call(this, op);\n },\n encode: function(op){\n return {\n struct: \"List\",\n id: op.id\n };\n },\n requiredOps: function(op){\n var ids = [];\n if (op.start != null) {\n ids.push(op.start);\n }\n if (op.end != null){\n ids.push(op.end);\n }\n return ids;\n },\n execute: function* (op) {\n if ((yield* this.addOperation(op)) === false) {\n return;\n }\n },\n ref: function* (op : Op, pos : number) : Insert {\n var o = op.start;\n while ( pos !== 0 || o != null) {\n o = (yield* this.getOperation(o)).right;\n pos--;\n }\n return (o == null) ? null : yield* this.getOperation(o);\n },\n map: function* (o : Op, f : Function) : Array {\n o = o.start;\n var res = [];\n while ( o != null) {\n var operation = yield* this.getOperation(o);\n res.push(f(operation.content));\n o = operation.right;\n }\n return res;\n },\n insert: function* (op, pos : number, contents : Array) {\n var o = yield* Struct.List.ref.call(this, op, pos);\n var or = yield* this.getOperation(o.right);\n for (var key in contents) {\n var insert = {\n left: o,\n right: or,\n content: contents[key],\n parent: op\n };\n o = yield* Struct.Insert.create.call(this, insert);\n }\n }\n },\n Map: {\n /*\n {\n // empty\n }\n */\n create: function*( op : Op ){\n op.map = {};\n op.struct = \"Map\";\n return yield* Struct.Operation.create.call(this, op);\n },\n encode: function(op){\n return {\n struct: \"Map\",\n id: op.id\n };\n },\n requiredOps: function(op){\n var ids = [];\n for (var end in op.map) {\n ids.push(op.map[end]);\n }\n return ids;\n },\n execute: function* (op) {\n if ((yield* this.addOperation(op)) === false) {\n return;\n }\n },\n get: function* (op, name) {\n var res = yield* this.getOperation(op.map[name]);\n return (res != null) ? res.content : void 0;\n },\n set: function* (op, name, value) {\n var insert = {\n left: null,\n right: op.map[name] || null,\n content: value,\n parent: op.id,\n parentSub: name\n };\n yield* Struct.Insert.create.call(this, insert);\n }\n }\n};\n\nY.Struct = Struct;\n","// returns a random element of o\n// works on Object, and Array\nfunction getRandom (o) {\n if (o instanceof Array) {\n return o[Math.floor(Math.random() * o.length)];\n } else if (o.constructor === Object) {\n var keys = [];\n for (var key in o) {\n keys.push(key);\n }\n return o[getRandom(keys)];\n }\n}\n\nvar globalRoom = {\n users: {},\n buffers: {},\n removeUser: function(user : AbstractConnector){\n\n for (var i in this.users) {\n this.users[i].userLeft(user);\n }\n delete this.users[user];\n delete this.buffers[user];\n },\n addUser: function(connector){\n this.users[connector.userId] = connector;\n this.buffers[connector.userId] = [];\n for (var uname in this.users) {\n if (uname !== connector.userId) {\n var u = this.users[uname];\n u.userJoined(connector.userId, \"master\");\n connector.userJoined(u.userId, \"master\");\n }\n }\n }\n};\nfunction flushOne(){\n var bufs = [];\n for (var i in globalRoom.buffers) {\n if (globalRoom.buffers[i].length > 0) {\n bufs.push(i);\n }\n }\n if (bufs.length > 0) {\n var userId = getRandom(bufs);\n var m = globalRoom.buffers[userId].shift();\n var user = globalRoom.users[userId];\n user.receiveMessage(m[0], m[1]);\n return true;\n } else {\n return false;\n }\n}\nsetInterval(flushOne, 10);\n\nvar userIdCounter = 0;\n\nclass Test extends AbstractConnector {\n constructor (y, options) {\n if(options === undefined){\n throw new Error(\"Options must not be undefined!\");\n }\n options.role = \"master\";\n options.forwardToSyncingClients = false;\n super(y, options);\n this.setUserId((userIdCounter++) + \"\");\n globalRoom.addUser(this);\n this.globalRoom = globalRoom;\n }\n send (userId, message) {\n globalRoom.buffers[userId].push(JSON.parse(JSON.stringify([this.userId, message])));\n }\n broadcast (message) {\n for (var key in globalRoom.buffers) {\n globalRoom.buffers[key].push(JSON.parse(JSON.stringify([this.userId, message])));\n }\n }\n disconnect () {\n globalRoom.removeUser(this.userId);\n }\n flushAll () {\n var c = true;\n while (c) {\n c = flushOne();\n }\n }\n}\n\nY.Test = Test;\n","\ntype State = {\n user: string,\n clock: number\n};\n\n\nfunction copyObject (o) {\n var c = {};\n for (var key in o) {\n c[key] = o[key];\n }\n return c;\n}\n\ntype StateVector = Array;\ntype OperationSet = Object; // os[Id] = op\ntype StateSet = Object;\n\nY.Memory = (function(){ //eslint-disable-line no-unused-vars\n class Transaction extends AbstractTransaction { //eslint-disable-line\n ss: StateSet;\n os: OperationSet;\n store: OperationStore;\n\n constructor (store : OperationStore) {\n super(store);\n this.ss = store.ss;\n this.os = store.os;\n }\n *setOperation (op) {\n this.os[JSON.stringify(op.id)] = op;\n return op;\n }\n *getOperation (id) {\n return this.os[JSON.stringify(id)];\n }\n *removeOperation (id) {\n delete this.os[JSON.stringify(id)];\n }\n *setState (state : State) : State {\n this.ss[state.user] = state.clock;\n }\n *getState (user : string) : State {\n var clock = this.ss[user];\n if (clock == null){\n clock = 0;\n }\n return {\n user: user,\n clock: clock\n };\n }\n *getStateVector () : StateVector {\n var stateVector = [];\n\n for (var user in this.ss) {\n var clock = this.ss[user];\n stateVector.push({\n user: user,\n clock: clock\n });\n }\n return stateVector;\n }\n *getStateSet () : StateSet {\n return this.ss;\n }\n *getOperations (startSS : StateSet) {\n if (startSS == null){\n startSS = {};\n }\n var ops = [];\n\n var endSV : StateVector = yield* this.getStateVector();\n for (var endState of endSV) {\n var user = endState.user;\n if (user === \"_\") {\n continue;\n }\n var startPos = startSS[user] || 0;\n var endPos = endState.clock;\n\n for (var clock = startPos; clock <= endPos; clock++) {\n var op = yield* this.getOperation([user, clock]);\n if (op != null) {\n op = Struct[op.struct].encode(op);\n ops.push(yield* this.makeOperationReady.call(this, startSS, op));\n }\n }\n }\n return ops;\n }\n *makeOperationReady (ss, op) {\n // instead of ss, you could use currSS (a ss that increments when you add an operation)\n var clock;\n var o = op;\n while (true){\n // while unknown, go to the right\n o = yield* this.getOperation(o.right);\n if (o == null) {\n break;\n }\n clock = ss[o.id[0]];\n if (clock != null && o.id[1] < clock ) {\n break;\n }\n }\n op = copyObject(op);\n op.right = (o == null) ? null : o.id;\n return op;\n }\n }\n class OperationStore extends AbstractOperationStore { //eslint-disable-line no-undef\n constructor (y) {\n super(y);\n this.os = {};\n this.ss = {};\n }\n requestTransaction (makeGen : Function) {\n var t = new Transaction(this);\n var gen = makeGen.call(t, new Y.Map.Create([\"_\", 0]));\n var res = gen.next();\n while(!res.done){\n if (res.value === \"transaction\") {\n res = gen.next(t);\n } else {\n throw new Error(\"You may not yield this type. (Maybe you meant to use 'yield*'?)\");\n }\n }\n }\n *removeDatabase () {\n delete this.os;\n }\n }\n return OperationStore;\n})();\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var hasOwn = Object.prototype.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var iteratorSymbol =\n typeof Symbol === \"function\" && Symbol.iterator || \"@@iterator\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided, then outerFn.prototype instanceof Generator.\n var generator = Object.create((outerFn || Generator).prototype);\n\n generator._invoke = makeInvokeMethod(\n innerFn, self || null,\n new Context(tryLocsList || [])\n );\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n genFun.__proto__ = GeneratorFunctionPrototype;\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `value instanceof AwaitArgument` to determine if the yielded value is\n // meant to be awaited. Some may consider the name of this method too\n // cutesy, but they are curmudgeons.\n runtime.awrap = function(arg) {\n return new AwaitArgument(arg);\n };\n\n function AwaitArgument(arg) {\n this.arg = arg;\n }\n\n function AsyncIterator(generator) {\n // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : Promise.resolve(value).then(function(unwrapped) {\n result.value = unwrapped;\n return result;\n }, invokeThrow);\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n var enqueueResult =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(function() {\n return invoke(method, arg);\n }) : new Promise(function(resolve) {\n resolve(invoke(method, arg));\n });\n\n // Avoid propagating enqueueResult failures to Promises returned by\n // later invocations of the iterator, and call generator.return() to\n // allow the generator a chance to clean up.\n previousPromise = enqueueResult[\"catch\"](invokeReturn);\n\n return enqueueResult;\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n if (method === \"return\" ||\n (method === \"throw\" && delegate.iterator[method] === undefined)) {\n // A return or throw (when the delegate iterator has no throw\n // method) always terminates the yield* loop.\n context.delegate = null;\n\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n var returnMethod = delegate.iterator[\"return\"];\n if (returnMethod) {\n var record = tryCatch(returnMethod, delegate.iterator, arg);\n if (record.type === \"throw\") {\n // If the return method threw an exception, let that\n // exception prevail over the original return or throw.\n method = \"throw\";\n arg = record.arg;\n continue;\n }\n }\n\n if (method === \"return\") {\n // Continue with the outer return, now that the delegate\n // iterator has been terminated.\n continue;\n }\n }\n\n var record = tryCatch(\n delegate.iterator[method],\n delegate.iterator,\n arg\n );\n\n if (record.type === \"throw\") {\n context.delegate = null;\n\n // Like returning generator.throw(uncaught), but without the\n // overhead of an extra function call.\n method = \"throw\";\n arg = record.arg;\n continue;\n }\n\n // Delegate generator ran and handled its own exceptions so\n // regardless of what the method was, we continue as if it is\n // \"next\" with an undefined arg.\n method = \"next\";\n arg = undefined;\n\n var info = record.arg;\n if (info.done) {\n context[delegate.resultName] = info.value;\n context.next = delegate.nextLoc;\n } else {\n state = GenStateSuspendedYield;\n return info;\n }\n\n context.delegate = null;\n }\n\n if (method === \"next\") {\n if (state === GenStateSuspendedYield) {\n context.sent = arg;\n } else {\n delete context.sent;\n }\n\n } else if (method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw arg;\n }\n\n if (context.dispatchException(arg)) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n method = \"next\";\n arg = undefined;\n }\n\n } else if (method === \"return\") {\n context.abrupt(\"return\", arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n var info = {\n value: record.arg,\n done: context.done\n };\n\n if (record.arg === ContinueSentinel) {\n if (context.delegate && method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n arg = undefined;\n }\n } else {\n return info;\n }\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(arg) call above.\n method = \"throw\";\n arg = record.arg;\n }\n }\n };\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset();\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function() {\n this.prev = 0;\n this.next = 0;\n this.sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.tryEntries.forEach(resetTryEntry);\n\n // Pre-initialize at least 20 temporary variables to enable hidden\n // class optimizations for simple generators.\n for (var tempIndex = 0, tempName;\n hasOwn.call(this, tempName = \"t\" + tempIndex) || tempIndex < 20;\n ++tempIndex) {\n this[tempName] = null;\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n return !!caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.next = finallyEntry.finallyLoc;\n } else {\n this.complete(record);\n }\n\n return ContinueSentinel;\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = record.arg;\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","\nclass AbstractConnector { //eslint-disable-line no-unused-vars\n /*\n opts\n .role : String Role of this client (\"master\" or \"slave\")\n .userId : String that uniquely defines the user.\n */\n constructor (y, opts) {\n this.y = y;\n if (opts == null){\n opts = {};\n }\n if (opts.role == null || opts.role === \"master\") {\n this.role = \"master\";\n } else if (opts.role === \"slave\") {\n this.role = \"slave\";\n } else {\n throw new Error(\"Role must be either 'master' or 'slave'!\");\n }\n this.role = opts.role;\n this.connections = {};\n this.userEventListeners = [];\n this.whenSyncedListeners = [];\n this.currentSyncTarget = null;\n this.syncingClients = [];\n this.forwardToSyncingClients = (opts.forwardToSyncingClients === false) ? false : true;\n this.debug = opts.debug ? true : false;\n }\n setUserId (userId) {\n this.userId = userId;\n this.y.db.setUserId(userId);\n }\n onUserEvent (f) {\n this.userEventListeners.push(f);\n }\n userLeft (user : string) {\n delete this.connections[user];\n if (user === this.currentSyncTarget){\n this.currentSyncTarget = null;\n this.findNextSyncTarget();\n }\n for (var f of this.userEventListeners){\n f({\n action: \"userLeft\",\n user: user\n });\n }\n }\n userJoined (user, role) {\n if(role == null){\n throw new Error(\"You must specify the role of the joined user!\");\n }\n if (this.connections[user] != null) {\n throw new Error(\"This user already joined!\");\n }\n this.connections[user] = {\n isSynced: false,\n role: role\n };\n for (var f of this.userEventListeners) {\n f({\n action: \"userJoined\",\n user: user,\n role: role\n });\n }\n if (this.currentSyncTarget == null) {\n this.findNextSyncTarget();\n }\n }\n // Execute a function _when_ we are connected.\n // If not connected, wait until connected\n whenSynced (f) {\n if (this.isSynced === true) {\n f();\n } else {\n this.whenSyncedListeners.push(f);\n }\n }\n // returns false, if there is no sync target\n // true otherwise\n findNextSyncTarget () {\n if (this.currentSyncTarget != null && this.connections[this.currentSyncTarget].isSynced === false) {\n throw new Error(\"The current sync has not finished!\");\n }\n\n var syncUser = null;\n for (var uid in this.connections) {\n syncUser = this.connections[uid];\n if (!syncUser.isSynced) {\n break;\n }\n }\n if (syncUser != null){\n var conn = this;\n this.y.db.requestTransaction(function*(){\n conn.currentSyncTarget = uid;\n conn.send(uid, {\n type: \"sync step 1\",\n stateVector: yield* this.getStateVector()\n });\n });\n }\n // set the state to synced!\n if (!this.isSynced) {\n this.isSynced = true;\n for (var f of this.whenSyncedListeners) {\n f();\n }\n this.whenSyncedListeners = null;\n }\n return false;\n }\n // You received a raw message, and you know that it is intended for to Yjs. Then call this function.\n receiveMessage (sender, m){\n if (this.debug) {\n console.log(`${sender} -> ${this.userId}: ${JSON.stringify(m)}`); //eslint-disable-line\n }\n if (m.type === \"sync step 1\") {\n // TODO: make transaction, stream the ops\n let conn = this;\n this.y.db.requestTransaction(function*(){\n var ops = yield* this.getOperations(m.stateVector);\n var sv = yield* this.getStateVector();\n conn.send(sender, {\n type: \"sync step 2\",\n os: ops,\n stateVector: sv\n });\n if (this.forwardToSyncingClients) {\n conn.syncingClients.push(sender);\n setTimeout(function(){\n conn.syncingClients = conn.syncingClients.filter(function(cli){\n return cli !== sender;\n });\n conn.send(sender, {\n type: \"sync done\"\n });\n }, conn.syncingClientDuration);\n }\n });\n } else if (m.type === \"sync step 2\") {\n this.y.db.apply(m.os);\n let conn = this;\n this.y.db.requestTransaction(function*(){\n var ops = yield* this.getOperations(m.stateVector);\n if (ops.length > 0) {\n conn.broadcast({\n type: \"update\",\n ops: ops\n });\n }\n });\n } else if (m.type === \"sync done\") {\n this.connections[sender].isSynced = true;\n this.findNextSyncTarget();\n } else if (m.type === \"update\") {\n if (this.forwardToSyncingClients) {\n for (var client of this.syncingClients) {\n this.send(client, m);\n }\n }\n this.y.db.apply(m.ops);\n }\n }\n // Currently, the HB encodes operations as JSON. For the moment I want to keep it\n // that way. Maybe we support encoding in the HB as XML in the future, but for now I don't want\n // too much overhead. Y is very likely to get changed a lot in the future\n //\n // Because we don't want to encode JSON as string (with character escaping, wich makes it pretty much unreadable)\n // we encode the JSON as XML.\n //\n // When the HB support encoding as XML, the format should look pretty much like this.\n //\n // does not support primitive values as array elements\n // expects an ltx (less than xml) object\n parseMessageFromXml (m) {\n function parseArray (node) {\n for (var n of node.children){\n if (n.getAttribute(\"isArray\") === \"true\") {\n return parseArray(n);\n } else {\n return parseObject(n);\n }\n }\n }\n function parseObject (node) {\n var json = {};\n for (var attrName in node.attrs) {\n var value = node.attrs[attrName];\n var int = parseInt(value);\n if (isNaN(int) || (\"\" + int) !== value){\n json[attrName] = value;\n } else {\n json[attrName] = int;\n }\n }\n for (var n in node.children){\n var name = n.name;\n if (n.getAttribute(\"isArray\") === \"true\") {\n json[name] = parseArray(n);\n } else {\n json[name] = parseObject(n);\n }\n }\n return json;\n }\n parseObject(m);\n }\n // encode message in xml\n // we use string because Strophe only accepts an \"xml-string\"..\n // So {a:4,b:{c:5}} will look like\n // \n // \n // \n // m - ltx element\n // json - Object\n encodeMessageToXml (msg, obj) {\n // attributes is optional\n function encodeObject (m, json) {\n for (var name in json) {\n var value = json[name];\n if (name == null) {\n // nop\n } else if (value.constructor === Object) {\n encodeObject(m.c(name), value);\n } else if (value.constructor === Array) {\n encodeArray(m.c(name), value);\n } else {\n m.setAttribute(name, value);\n }\n }\n }\n function encodeArray (m, array) {\n m.setAttribute(\"isArray\", \"true\");\n for (var e of array) {\n if (e.constructor === Object) {\n encodeObject(m.c(\"array-element\"), e);\n } else {\n encodeArray(m.c(\"array-element\"), e);\n }\n }\n }\n if (obj.constructor === Object) {\n encodeObject(msg.c(\"y\", { xmlns: \"http://y.ninja/connector-stanza\" }), obj);\n } else if (obj.constructor === Array) {\n encodeArray(msg.c(\"y\", { xmlns: \"http://y.ninja/connector-stanza\" }), obj);\n } else {\n throw new Error(\"I can't encode this json!\");\n }\n }\n}\n","/* @flow */\nclass AbstractTransaction { //eslint-disable-line no-unused-vars\n constructor (store : OperationStore) {\n this.store = store;\n }\n // returns false if operation is not expected.\n *addOperation (op) {\n var state = yield* this.getState(op.id[0]);\n if (op.id[1] === state.clock){\n state.clock++;\n yield* this.setState(state);\n yield* this.setOperation(op);\n this.store.operationAdded(op);\n return true;\n } else if (op.id[1] < state.clock) {\n return false;\n } else {\n throw new Error(\"Operations must arrive in order!\");\n }\n }\n}\nY.AbstractTransaction = AbstractTransaction;\n\ntype Listener = {\n f : GeneratorFunction, // is called when all operations are available\n missing : number // number of operations that are missing\n}\n\ntype Id = [string, number];\n\nclass AbstractOperationStore { //eslint-disable-line no-unused-vars\n constructor (y) {\n this.y = y;\n this.parentListeners = {};\n this.parentListenersRequestPending = false;\n this.parentListenersActivated = {};\n // E.g. this.listenersById[id] : Array\n this.listenersById = {};\n // Execute the next time a transaction is requested\n this.listenersByIdExecuteNow = [];\n // A transaction is requested\n this.listenersByIdRequestPending = false;\n /* To make things more clear, the following naming conventions:\n * ls : we put this.listenersById on ls\n * l : Array\n * id : Id (can't use as property name)\n * sid : String (converted from id via JSON.stringify\n so we can use it as a property name)\n\n Always remember to first overwrite\n a property before you iterate over it!\n */\n }\n setUserId (userId) {\n this.userId = userId;\n }\n apply (ops) {\n for (var key in ops) {\n var o = ops[key];\n var required = Y.Struct[o.struct].requiredOps(o);\n this.whenOperationsExist(required, o);\n }\n }\n // op is executed as soon as every operation requested is available.\n // Note that Transaction can (and should) buffer requests.\n whenOperationsExist (ids : Array, op : Operation) {\n if (ids.length > 0) {\n let listener : Listener = {\n op: op,\n missing: ids.length\n };\n\n for (let key in ids) {\n let id = ids[key];\n let sid = JSON.stringify(id);\n let l = this.listenersById[sid];\n if (l == null){\n l = [];\n this.listenersById[sid] = l;\n }\n l.push(listener);\n }\n } else {\n this.listenersByIdExecuteNow.push({\n op: op\n });\n }\n\n if (this.listenersByIdRequestPending){\n return;\n }\n\n this.listenersByIdRequestPending = true;\n var store = this;\n\n this.requestTransaction(function*(){\n var exeNow = store.listenersByIdExecuteNow;\n store.listenersByIdExecuteNow = [];\n\n var ls = store.listenersById;\n store.listenersById = {};\n\n store.listenersByIdRequestPending = false;\n\n for (let key in exeNow) {\n let o = exeNow[key].op;\n yield* Struct[o.struct].execute.call(this, o);\n }\n\n for (var sid in ls){\n var l = ls[sid];\n var id = JSON.parse(sid);\n if ((yield* this.getOperation(id)) == null){\n store.listenersById[sid] = l;\n } else {\n for (let key in l) {\n let listener = l[key];\n let o = listener.op;\n if (--listener.missing === 0){\n yield* Struct[o.struct].execute.call(this, o);\n }\n }\n }\n }\n });\n }\n // called by a transaction when an operation is added\n operationAdded (op) {\n var sid = JSON.stringify(op.id);\n var l = this.listenersById[sid];\n delete this.listenersById[sid];\n\n // notify whenOperation listeners (by id)\n if (l != null) {\n for (var key in l){\n var listener = l[key];\n if (--listener.missing === 0){\n this.whenOperationsExist([], listener.op);\n }\n }\n }\n // notify parent listeners, if possible\n var listeners = this.parentListeners[op.parent];\n if ( this.parentListenersRequestPending\n || ( listeners == null )\n || ( listeners.length === 0 )) {\n return;\n }\n var al = this.parentListenersActivated[JSON.stringify(op.parent)];\n if ( al == null ){\n al = [];\n this.parentListenersActivated[JSON.stringify(op.parent)] = al;\n }\n al.push(op);\n\n this.parentListenersRequestPending = true;\n var store = this;\n this.requestTransaction(function*(){\n store.parentListenersRequestPending = false;\n var activatedOperations = store.parentListenersActivated;\n store.parentListenersActivated = {};\n for (var parentId in activatedOperations){\n var parent = yield* this.getOperation(parentId);\n Struct[parent.struct].notifyObservers(activatedOperations[parentId]);\n }\n });\n\n }\n removeParentListener (id, f) {\n var ls = this.parentListeners[id];\n if (ls != null) {\n this.parentListeners[id] = ls.filter(function(g){\n return (f !== g);\n });\n }\n }\n addParentListener (id, f) {\n var ls = this.parentListeners[JSON.stringify(id)];\n if (ls == null) {\n ls = [];\n this.parentListeners[JSON.stringify(id)] = ls;\n }\n ls.push(f);\n }\n}\nY.AbstractOperationStore = AbstractOperationStore;\n","\nclass WebRTC extends AbstractConnector {\n constructor (options) {\n if(options === undefined){\n throw new Error(\"Options must not be undefined!\");\n }\n super({\n role: \"slave\"\n });\n\n var room = options.room;\n\n // connect per default to our server\n if(options.url == null){\n options.url = \"https://yatta.ninja:8888\";\n }\n\n var swr = new SimpleWebRTC(options); //eslint-disable-line no-undef\n this.swr = swr;\n var self = this;\n\n swr.once(\"connectionReady\", function(userId){\n // SimpleWebRTC (swr) is initialized\n swr.joinRoom(room);\n\n swr.once(\"joinedRoom\", function(){\n self.setUserId(userId);\n var i;\n // notify the connector class about all the users that already\n // joined the session\n for(i in self.swr.webrtc.peers){\n self.userJoined(self.swr.webrtc.peers[i].id, \"master\");\n }\n swr.on(\"channelMessage\", function(peer, room_, message){\n // The client received a message\n // Check if the connector is already initialized,\n // only then forward the message to the connector class\n if(message.type != null ){\n self.receiveMessage(peer.id, message.payload);\n }\n });\n });\n\n swr.on(\"createdPeer\", function(peer){\n // a new peer/client joined the session.\n // Notify the connector class, if the connector\n // is already initialized\n self.userJoined(peer.id, \"master\");\n });\n\n swr.on(\"peerStreamRemoved\", function(peer){\n // a client left the session.\n // Notify the connector class, if the connector\n // is already initialized\n self.userLeft(peer.id);\n });\n });\n }\n send (uid, message) {\n var self = this;\n // we have to make sure that the message is sent under all circumstances\n var send = function(){\n // check if the clients still exists\n var peer = self.swr.webrtc.getPeers(uid)[0];\n var success;\n if(peer){\n // success is true, if the message is successfully sent\n success = peer.sendDirectly(\"simplewebrtc\", \"yjs\", message);\n }\n if(!success){\n // resend the message if it didn't work\n setTimeout(send, 500);\n }\n };\n // try to send the message\n send();\n }\n broadcast (message) {\n this.swr.sendDirectlyToAll(\"simplewebrtc\", \"yjs\", message);\n }\n}\n\nY.WebRTC = WebRTC;\n","\ntype State = {\n user: string,\n clock: number\n};\n\ntype StateVector = Array;\n\ntype StateSet = Object;\n\ntype IDBTransaction = Function;\ntype IDBObjectStore = Function;\ntype IDBRequest = Function;\ntype IDBCursor = Function;\ntype IDBKeyRange = Function;\n\ntype IDBOpenDBRequest = Function;\n\ndeclare var indexedDB : Object;\n\nY.IndexedDB = (function(){ //eslint-disable-line no-unused-vars\n class Transaction extends AbstractTransaction { //eslint-disable-line\n transaction: IDBTransaction;\n sv: IDBObjectStore;\n os: IDBObjectStore;\n store: OperationStore;\n\n constructor (store : OperationStore) {\n super(store);\n this.transaction = store.db.transaction([\"OperationStore\", \"StateVector\"], \"readwrite\");\n this.sv = this.transaction.objectStore(\"StateVector\");\n this.os = this.transaction.objectStore(\"OperationStore\");\n this.buffer = {};\n }\n *setOperation (op) {\n yield this.os.put(op);\n this.buffer[JSON.stringify(op.id)] = op;\n return op;\n }\n *getOperation (id) {\n var op = this.buffer[JSON.stringify(id)];\n if (op == null) {\n op = yield this.os.get(id);\n this.buffer[JSON.stringify(id)] = op;\n }\n return op;\n }\n *removeOperation (id) {\n this.buffer[JSON.stringify(id)] = null;\n return yield this.os.delete(id);\n }\n *setState (state : State) : State {\n return yield this.sv.put(state);\n }\n *getState (user : string) : State {\n var state;\n if ((state = yield this.sv.get(user)) != null){\n return state;\n } else {\n return {\n user: user,\n clock: 0\n };\n }\n }\n *getStateVector () : StateVector {\n var stateVector = [];\n var cursorResult = this.sv.openCursor();\n var cursor;\n while ((cursor = yield cursorResult) != null) {\n stateVector.push(cursor.value);\n cursor.continue();\n }\n return stateVector;\n }\n *getStateSet () : StateSet {\n var sv : StateVector = yield* this.getStateVector();\n var ss : StateSet = {};\n for (var state of sv){\n ss[state.user] = state.clock;\n }\n return ss;\n }\n\n *getOperations (startSS : StateSet) {\n if (startSS == null){\n startSS = {};\n }\n var ops = [];\n\n var endSV : StateVector = yield* this.getStateVector();\n for (var endState of endSV) {\n var user = endState.user;\n var startPos = startSS[user] || 0;\n var endPos = endState.clock;\n var range = IDBKeyRange.bound([user, startPos], [user, endPos]);\n var cursorResult = this.os.openCursor(range);\n var cursor;\n while ((cursor = yield cursorResult) != null) {\n ops.push(cursor.value);\n cursor.continue();\n }\n }\n return ops;\n }\n }\n class OperationStore extends AbstractOperationStore { //eslint-disable-line no-undef\n namespace: string;\n ready: Promise;\n whenReadyListeners: Array;\n constructor (y, opts) {\n super(y);\n if (opts == null) {\n opts = {};\n }\n if (opts.namespace == null || typeof opts.namespace !== \"string\") {\n throw new Error(\"IndexedDB: expect a string (opts.namespace)!\");\n } else {\n this.namespace = opts.namespace;\n }\n if (opts.idbVersion != null) {\n this.idbVersion = opts.idbVersion;\n } else {\n this.idbVersion = 5;\n }\n\n this.transactionQueue = {\n queue: [],\n onRequest: null\n };\n\n var store = this;\n\n var tGen = (function *transactionGen(){\n store.db = yield indexedDB.open(opts.namespace, store.idbVersion);\n var transactionQueue = store.transactionQueue;\n\n var transaction = null;\n var cont = true;\n while (cont) {\n var request = yield transactionQueue;\n transaction = new Transaction(store);\n\n yield* request.call(transaction, request);/*\n while (transactionQueue.queue.length > 0) {\n yield* transactionQueue.queue.shift().call(transaction);\n }*/\n }\n })();\n\n function handleTransactions(t){ //eslint-disable-line no-unused-vars\n var request = t.value;\n if (t.done){\n return;\n } else if (request.constructor === IDBRequest\n || request.constructor === IDBCursor ) {\n request.onsuccess = function(){\n handleTransactions(tGen.next(request.result));\n };\n request.onerror = function(err){\n tGen.throw(err);\n };\n } else if (request === store.transactionQueue) {\n if (request.queue.length > 0){\n handleTransactions(tGen.next(request.queue.shift()));\n } else {\n request.onRequest = function(){\n request.onRequest = null;\n handleTransactions(tGen.next(request.queue.shift()));\n };\n }\n } else if ( request.constructor === IDBOpenDBRequest ) {\n request.onsuccess = function(event){\n var db = event.target.result;\n handleTransactions(tGen.next(db));\n };\n request.onerror = function(){\n tGen.throw(\"Couldn't open IndexedDB database!\");\n };\n request.onupgradeneeded = function(event){\n var db = event.target.result;\n try {\n db.createObjectStore(\"OperationStore\", {keyPath: \"id\"});\n db.createObjectStore(\"StateVector\", {keyPath: \"user\"});\n } catch (e) {\n // console.log(\"Store already exists!\");\n }\n };\n } else {\n tGen.throw(\"You can not yield this type!\");\n }\n }\n handleTransactions(tGen.next());\n\n }\n requestTransaction (makeGen : Function) {\n this.transactionQueue.queue.push(makeGen);\n if (this.transactionQueue.onRequest != null) {\n this.transactionQueue.onRequest();\n }\n }\n *removeDatabase () {\n this.db.close();\n yield indexedDB.deleteDatabase(this.namespace);\n }\n }\n return OperationStore;\n})();\n","\n\n(function(){\n\n class List {\n constructor (_model) {\n this._model = _model;\n }\n *val (pos) {\n if (pos != null) {\n var o = yield* this.Struct.List.ref(this._model, pos);\n return o ? o.content : null;\n } else {\n return yield* this.Struct.List.map(this._model, function(c){return c; });\n }\n }\n *insert (pos, contents) {\n yield* this.Struct.List.insert(pos, contents);\n }\n }\n\n Y.List = function* YList(){\n var model = yield* this.Struct.List.create();\n return new List(model);\n };\n Y.List.Create = List;\n})();\n","\n(function(){\n class Map {\n constructor (_model) {\n this._model = _model;\n }\n *val () {\n var transaction = yield \"transaction\";\n var model = yield* transaction.getOperation(this._model);\n if (arguments.length === 0) {\n throw new Error(\"Implement this case!\");\n } else if (arguments.length === 1) {\n return yield* Y.Struct.Map.get.call(transaction, model, arguments[0]);\n } else {\n return yield* Y.Struct.Map.set.call(transaction, model, arguments[0], arguments[1]);\n }\n }\n }\n\n Y.Map = function* YMap(){\n if (this instanceof Y.AbstractOperationStore) {\n var model = yield* Y.Struct.map.create.call(this);\n return new Map(model);\n } else {\n throw new Error(\"Don't use `new` to create this type!\");\n }\n };\n Y.Map.Create = Map;\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file