From ae790b6947e5ba797db0e43788a7d331ad752e5b Mon Sep 17 00:00:00 2001
From: Kevin Jahns <kevin.jahns@rwth-aachen.de>
Date: Fri, 19 Jun 2015 14:54:35 +0200
Subject: [PATCH] updated OperationBuffer

---
 .flowconfig                 |   6 ++
 src/IndexedDB.js            | 172 +++++++++++++++++++++++-------------
 src/IndexedDB.spec.js       |  59 ++++++++++++-
 src/OperationBuffer.js      |   3 +-
 src/OperationBuffer.spec.js |  11 ---
 y.js                        |   2 +-
 y.js.map                    |   2 +-
 7 files changed, 177 insertions(+), 78 deletions(-)

diff --git a/.flowconfig b/.flowconfig
index 86c40fc9..4e39e3aa 100644
--- a/.flowconfig
+++ b/.flowconfig
@@ -1,3 +1,9 @@
+[ignore]
+.*/node_modules/.*
+.*/build/.*
+./y.js
+./y.js.map
+
 [include]
 
 [libs]
diff --git a/src/IndexedDB.js b/src/IndexedDB.js
index 62fa4cca..4a078d8c 100644
--- a/src/IndexedDB.js
+++ b/src/IndexedDB.js
@@ -6,17 +6,54 @@ type State = {
 
 type StateVector = Array<State>;
 
-type StateSet = Object<number>;
+type StateSet = Object;
 
-var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
-  class Transaction {
+type IDBTransaction = Function;
+type IDBObjectStore = Function;
+type IDBRequest = Function;
+type IDBCursor = Function;
+type IDBKeyRange = Function;
+
+type IDBOpenDBRequest = Function;
+
+declare var indexedDB : Object;
+
+declare var setTimeout : Function;
+
+class AbstractTransaction { //eslint-disable-line no-unused-vars
+  constructor () {
+  }
+  *addOperation (op) {
+    var state = yield* this.getState(op.uid[0]);
+    if (state == null){
+      state = {
+        user: op.uid[0],
+        clock: 0
+      };
+    }
+    if (op.uid[1] === state.clock){
+      state.clock++;
+      yield* this.setState(state);
+      return true;
+    } else {
+      return false;
+    }
+  }
+}
 
+var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
+  class Transaction extends AbstractTransaction{
+    transaction: IDBTransaction;
+    sv: IDBObjectStore;
+    ob: IDBObjectStore;
     constructor (transaction) {
+      super();
       this.transaction = transaction;
       this.sv = transaction.objectStore("StateVector");
       this.ob = transaction.objectStore("OperationBuffer");
     }
     *setOperation (op) {
+        yield* (function*(){})();
         yield this.ob.put(op);
         return op;
     }
@@ -34,78 +71,91 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
     }
     *getStateVector () : StateVector {
       var stateVector = [];
-      var cursor = yield this.sv.openCursor();
-      while ((cursor = yield cursor.continue) != null) {
+      var cursorResult = this.sv.openCursor();
+      var cursor;
+      while ((cursor = yield cursorResult) != null) {
         stateVector.push(cursor.value);
+        cursor.continue();
       }
       return stateVector;
     }
     *getStateSet () : StateSet {
+      var sv : StateVector = yield* this.getStateVector();
+      var ss : StateSet = {};
+      for (var state of sv){
+        ss[state.user] = state.clock;
+      }
+      return ss;
     }
-    getOperations () {
-      return function* () {
-        var op = yield this.getOperation(["u1", 0]);
-        return op.uid;
-      };
-    }
-    /*
-    getOperations: (state_map)->
-      flow = Promise.resolve()
-      ops = []
-      that = this
-      hb = that.t.objectStore("HistoryBuffer")
 
-      that.getStateVector().then (end_state_vector)->
-        for end_state of end_state_vector
-          # convert to the db-structure
-          do (end_state = end_state)->
-            start_state =
-              user: end_state.name
-              state: state_map[end_state] ? 0
+    *getOperations (startSS : StateSet) {
+      if (startSS == null){
+        startSS = {};
+      }
+      var ops = [];
 
-            flow = flow.then ()->
-              from = [start_state.user, start_state.number]
-              to = [end_state.user, end_state.number]
-                cursor = event.target.result
-                if cursor?
-                  ops.push cursor.value # add Operation
-                  cursor.continue()
-                else
-                  # got all ops from this user
-                  defer.resolve ops
-              defer.promise
-    */
+      var endSV : StateVector = yield* this.getStateVector();
+      for (var endState of endSV) {
+        var user = endState.user;
+        var startPos = startSS[user] || 0;
+        var endPos = endState.clock;
+        var range = IDBKeyRange.bound([user, startPos], [user, endPos]);
+        var cursorResult = this.ob.openCursor(range);
+        var cursor;
+        while ((cursor = yield cursorResult) != null) {
+          ops.push(cursor.value);
+          cursor.continue();
+        }
+      }
+      return ops;
+    }
   }
   class DB {
+    namespace: string;
+    ready: Promise;
+    whenReadyListeners: Array<Function>;
     constructor (namespace : string) {
+      this.whenReadyListeners = [];
       this.namespace = namespace;
-      this.ready = new Promise(function(yay, nay){
-        var req = indexedDB.open(namespace); //eslint-disable-line no-undef
-        req.onerror = function(){
-          nay("Couldn't open the IndexedDB database!");
-        };
-        req.onsuccess = function(event){
-          yay(event.target.result);
-        };
-        req.onupgradeneeded = function(event){
-          var db = event.target.result;
-          db.createObjectStore("OperationBuffer", {keyPath: "uid"});
-          db.createObjectStore("StateVector", {keyPath: "user"});
-        };
-      }).catch(function(message){
-          throw new Error(message);
-      });
+      this.ready = false;
+
+      var req = indexedDB.open(namespace); //eslint-disable-line no-undef
+      req.onerror = function(){
+        throw new Error("Couldn't open the IndexedDB database!");
+      };
+      req.onsuccess = (event)=>{
+        this.db = event.target.result;
+        this.whenReadyListeners.forEach(function(f){
+          setTimeout(f, 0);
+        });
+        this.whenReadyListeners = null;
+        this.ready = true;
+      };
+      req.onupgradeneeded = function(event){
+        var db = event.target.result;
+        db.createObjectStore("OperationBuffer", {keyPath: "uid"});
+        db.createObjectStore("StateVector", {keyPath: "user"});
+      };
+    }
+    whenReady (f : Function) {
+      if (this.ready){
+        setTimeout(f, 0);
+      } else {
+        this.whenReadyListeners.push(f);
+      }
     }
     requestTransaction (makeGen : Function) {
-      this.ready.then(function(db){
-        var transaction = new Transaction(db.transaction(["OperationBuffer", "StateVector"], "readwrite"));
+      this.whenReady(()=>{
+        var transaction = new Transaction(this.db.transaction(["OperationBuffer", "StateVector"], "readwrite"));
         var gen = makeGen.apply(transaction);
 
-        function handle(res){
-          var request = res.value;
+        function handle(res : any){
+          var request : any = res.value;
           if (res.done){
             return;
-          } else if (request.constructor === IDBRequest) {
+          } else if (request.constructor === IDBRequest
+                     || request.constructor === IDBCursor
+                     || request.constructor === IDBOpenDBRequest) {
             request.onsuccess = function(){
               handle(gen.next(request.result));
             };
@@ -113,13 +163,15 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
               gen.throw(err);
             };
           } else {
-            gen.throw("You may not yield this type!");
+            gen.throw("You can not yield this type!");
           }
         }
-
-        return handle(gen.next());
+        handle(gen.next());
       });
     }
+    *removeDatabase () {
+      return yield indexedDB.deleteDatabase(this.namespace);
+    }
   }
   return DB;
 })();
diff --git a/src/IndexedDB.spec.js b/src/IndexedDB.spec.js
index f99c9527..50ab8f7b 100644
--- a/src/IndexedDB.spec.js
+++ b/src/IndexedDB.spec.js
@@ -8,10 +8,10 @@ if(typeof window !== "undefined"){
     it("can create transactions", function(done) {
       ob.requestTransaction(function*(){
         var op = yield* this.setOperation({
-          "uid": ["u1", 0],
+          "uid": ["1", 0],
           "stuff": true
         });
-        expect(yield* this.getOperation(["u1", 0]))
+        expect(yield* this.getOperation(["1", 0]))
           .toEqual(op);
         done();
       });
@@ -26,7 +26,6 @@ if(typeof window !== "undefined"){
     });
 
     it("yield throws if request is unknown", function(done){
-
       ob.requestTransaction(function*(){
         try {
           yield this.getOperations(["u1", 0]);
@@ -39,5 +38,59 @@ if(typeof window !== "undefined"){
         done();
       });
     });
+
+    it("sets and gets stateVector", function(done){
+      ob.requestTransaction(function*(){
+        var s1 = {user: "1", clock: 1};
+        var s2 = {user: "2", clock: 3};
+        yield* this.setState(s1);
+        yield* this.setState(s2);
+        var sv = yield* this.getStateVector();
+        expect(sv).not.toBeUndefined();
+        expect(sv).toEqual([s1, s2]);
+        done();
+      });
+    });
+
+    it("gets stateSet", function(done){
+      ob.requestTransaction(function*(){
+        var s1 = {user: "1", clock: 1};
+        var s2 = {user: "2", clock: 3};
+        yield* this.setState(s1);
+        yield* this.setState(s2);
+        var sv = yield* this.getStateSet();
+        expect(sv).not.toBeUndefined();
+        expect(sv).toEqual({
+          "1": 1,
+          "2": 3
+        });
+        done();
+      });
+    });
+
+    it("getOperations returns operations (no parameters)", function(done){
+      ob.requestTransaction(function*(){
+        var s1 = {user: "1", clock: 55};
+        yield* this.setState(s1);
+        var op1 = yield* this.setOperation({
+          "uid": ["1", 0],
+          "stuff": true
+        });
+        var op2 = yield* this.setOperation({
+          "uid": ["1", 3],
+          "stuff": true
+        });
+        var ops = yield* this.getOperations();
+        expect(ops.length).toBeGreaterThan(1);
+        expect(ops[0]).toEqual(op1);
+        expect(ops[1]).toEqual(op2);
+        done();
+      });
+    });
+    afterAll(function(){
+      ob.requestTransaction(function*(){
+        yield* ob.removeDatabase();
+      });
+    });
   });
 }
diff --git a/src/OperationBuffer.js b/src/OperationBuffer.js
index 29171ee1..2e4ace47 100644
--- a/src/OperationBuffer.js
+++ b/src/OperationBuffer.js
@@ -1,8 +1,7 @@
 /* @flow */
 
 class OperationBuffer { //eslint-disable-line no-unused-vars
-  i : number;
   constructor () {
-    this.i = 4;
+
   }
 }
diff --git a/src/OperationBuffer.spec.js b/src/OperationBuffer.spec.js
index e1c5aab4..a4ba0077 100644
--- a/src/OperationBuffer.spec.js
+++ b/src/OperationBuffer.spec.js
@@ -1,13 +1,2 @@
 /* @flow */
 /*eslint-env browser,jasmine,console */
-
-describe("Operation Buffer", function() {
-  var OB = new OperationBuffer();
-
-  it("contains spec with an expectation", function(done) {
-    setTimeout(function(){
-      done();
-    }, 1000);
-    expect(OB.i).toBe(4);
-  });
-});
diff --git a/y.js b/y.js
index 9e043b44..2074752d 100644
--- a/y.js
+++ b/y.js
@@ -1,2 +1,2 @@
-"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}!function(t){function e(t,e,r,o){var i=Object.create((e||n).prototype);return i._invoke=s(t,r||null,new h(o||[])),i}function r(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(n){return{type:"throw",arg:n}}}function n(){}function o(){}function i(){}function a(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function c(t){this.arg=t}function u(t){function e(e,r){var n=t[e](r),a=n.value;return a instanceof c?Promise.resolve(a.arg).then(o,i):Promise.resolve(a).then(function(t){return n.value=t,n},i)}function r(t,r){var o=n?n.then(function(){return e(t,r)}):new Promise(function(n){n(e(t,r))});return n=o["catch"](a),o}"object"==typeof process&&process.domain&&(e=process.domain.bind(e));var n,o=e.bind(t,"next"),i=e.bind(t,"throw"),a=e.bind(t,"return");this._invoke=r}function s(t,e,n){var o=x;return function(i,a){if(o===L)throw new Error("Generator is already running");if(o===k)return y();for(;;){var c=n.delegate;if(c){if("return"===i||"throw"===i&&c.iterator[i]===v){n.delegate=null;var u=c.iterator["return"];if(u){var s=r(u,c.iterator,a);if("throw"===s.type){i="throw",a=s.arg;continue}}if("return"===i)continue}var s=r(c.iterator[i],c.iterator,a);if("throw"===s.type){n.delegate=null,i="throw",a=s.arg;continue}i="next",a=v;var f=s.arg;if(!f.done)return o=b,f;n[c.resultName]=f.value,n.next=c.nextLoc,n.delegate=null}if("next"===i)o===b?n.sent=a:delete n.sent;else if("throw"===i){if(o===x)throw o=k,a;n.dispatchException(a)&&(i="next",a=v)}else"return"===i&&n.abrupt("return",a);o=L;var s=r(t,e,n);if("normal"===s.type){o=n.done?k:b;var f={value:s.arg,done:n.done};if(s.arg!==E)return f;n.delegate&&"next"===i&&(a=v)}else"throw"===s.type&&(o=k,i="throw",a=s.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function l(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset()}function p(t){if(t){var e=t[g];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,n=function o(){for(;++r<t.length;)if(d.call(t,r))return o.value=t[r],o.done=!1,o;return o.value=v,o.done=!0,o};return n.next=n}}return{next:y}}function y(){return{value:v,done:!0}}var v,d=Object.prototype.hasOwnProperty,g="function"==typeof Symbol&&Symbol.iterator||"@@iterator",w="object"==typeof module,m=t.regeneratorRuntime;if(m)return void(w&&(module.exports=m));m=t.regeneratorRuntime=w?module.exports:{},m.wrap=e;var x="suspendedStart",b="suspendedYield",L="executing",k="completed",E={},O=i.prototype=n.prototype;o.prototype=O.constructor=i,i.constructor=o,o.displayName="GeneratorFunction",m.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return e?e===o||"GeneratorFunction"===(e.displayName||e.name):!1},m.mark=function(t){return t.__proto__=i,t.prototype=Object.create(O),t},m.awrap=function(t){return new c(t)},a(u.prototype),m.async=function(t,r,n,o){var i=new u(e(t,r,n,o));return m.isGeneratorFunction(r)?i:i.next().then(function(t){return t.done?t.value:i.next()})},a(O),O[g]=function(){return this},O.toString=function(){return"[object Generator]"},m.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function n(){for(;e.length;){var r=e.pop();if(r in t)return n.value=r,n.done=!1,n}return n.done=!0,n}},m.values=p,h.prototype={constructor:h,reset:function(){this.prev=0,this.next=0,this.sent=v,this.done=!1,this.delegate=null,this.tryEntries.forEach(l);for(var t,e=0;d.call(this,t="t"+e)||20>e;++e)this[t]=null},stop:function(){this.done=!0;var t=this.tryEntries[0],e=t.completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){function e(e,n){return i.type="throw",i.arg=t,r.next=e,!!n}if(this.done)throw t;for(var r=this,n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n],i=o.completion;if("root"===o.tryLoc)return e("end");if(o.tryLoc<=this.prev){var a=d.call(o,"catchLoc"),c=d.call(o,"finallyLoc");if(a&&c){if(this.prev<o.catchLoc)return e(o.catchLoc,!0);if(this.prev<o.finallyLoc)return e(o.finallyLoc)}else if(a){if(this.prev<o.catchLoc)return e(o.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return e(o.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&d.call(n,"finallyLoc")&&this.prev<n.finallyLoc){var o=n;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var i=o?o.completion:{};return i.type=t,i.arg=e,o?this.next=o.finallyLoc:this.complete(i),E},complete:function(t,e){if("throw"===t.type)throw t.arg;"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=t.arg,this.next="end"):"normal"===t.type&&e&&(this.next=e)},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),l(r),E}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;l(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:p(t),resultName:e,nextLoc:r},E}}}("object"==typeof global?global:"object"==typeof window?window:"object"==typeof self?self:void 0);var IndexedDB=function(){var t=function(){function t(e){_classCallCheck(this,t),this.transaction=e,this.sv=e.objectStore("StateVector"),this.ob=e.objectStore("OperationBuffer")}return t.prototype.setOperation=regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ob.put(t);case 2:return e.abrupt("return",t);case 3:case"end":return e.stop()}},e,this)}),t.prototype.getOperation=regeneratorRuntime.mark(function r(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ob.get(t);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},r,this)}),t.prototype.setState=regeneratorRuntime.mark(function n(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.sv.put(t);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},n,this)}),t.prototype.getState=regeneratorRuntime.mark(function o(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.sv.get(t);case 2:if(e.t0=e.sent,e.t0){e.next=5;break}e.t0={user:t,clock:0};case 5:return e.abrupt("return",e.t0);case 6:case"end":return e.stop()}},o,this)}),t.prototype.getStateVector=regeneratorRuntime.mark(function i(){var t,e;return regeneratorRuntime.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:return t=[],r.next=3,this.sv.openCursor();case 3:e=r.sent;case 4:return r.next=6,e["continue"];case 6:if(r.t0=e=r.sent,null==r.t0){r.next=11;break}t.push(e.value),r.next=4;break;case 11:return r.abrupt("return",t);case 12:case"end":return r.stop()}},i,this)}),t.prototype.getOperations=function(){return regeneratorRuntime.mark(function t(){var e;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.getOperation(["u1",0]);case 2:return e=t.sent,t.abrupt("return",e.uid);case 4:case"end":return t.stop()}},t,this)})},t}(),e=function(){function e(t){_classCallCheck(this,e),this.namespace=t,this.ready=new Promise(function(e,r){var n=indexedDB.open(t);n.onerror=function(){r("Couldn't open the IndexedDB database!")},n.onsuccess=function(t){e(t.target.result)},n.onupgradeneeded=function(t){var e=t.target.result;e.createObjectStore("OperationBuffer",{keyPath:"uid"}),e.createObjectStore("StateVector",{keyPath:"user"})}})["catch"](function(t){throw new Error(t)})}return e.prototype.requestTransaction=function(e){this.ready.then(function(r){function n(t){var e=t.value;t.done||(e.constructor===IDBRequest?(e.onsuccess=function(){n(i.next(e.result))},e.onerror=function(t){i["throw"](t)}):i["throw"]("You may not yield this type!"))}var o=new t(r.transaction(["OperationBuffer","StateVector"],"readwrite")),i=e.apply(o);return n(i.next())})},e}();return e}(),OperationBuffer=function t(){_classCallCheck(this,t),this.i=4},Operation=function(){function t(e){_classCallCheck(this,t),this.i=e.i}return t.prototype.yay=function(){return this.i},t}();
+"use strict";function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}!function(t){function e(t,e,r,o){var a=Object.create((e||n).prototype);return a._invoke=s(t,r||null,new p(o||[])),a}function r(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(n){return{type:"throw",arg:n}}}function n(){}function o(){}function a(){}function i(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function u(t){this.arg=t}function c(t){function e(e,r){var n=t[e](r),i=n.value;return i instanceof u?Promise.resolve(i.arg).then(o,a):Promise.resolve(i).then(function(t){return n.value=t,n},a)}function r(t,r){var o=n?n.then(function(){return e(t,r)}):new Promise(function(n){n(e(t,r))});return n=o["catch"](i),o}"object"==typeof process&&process.domain&&(e=process.domain.bind(e));var n,o=e.bind(t,"next"),a=e.bind(t,"throw"),i=e.bind(t,"return");this._invoke=r}function s(t,e,n){var o=w;return function(a,i){if(o===k)throw new Error("Generator is already running");if(o===L)return y();for(;;){var u=n.delegate;if(u){if("return"===a||"throw"===a&&u.iterator[a]===d){n.delegate=null;var c=u.iterator["return"];if(c){var s=r(c,u.iterator,i);if("throw"===s.type){a="throw",i=s.arg;continue}}if("return"===a)continue}var s=r(u.iterator[a],u.iterator,i);if("throw"===s.type){n.delegate=null,a="throw",i=s.arg;continue}a="next",i=d;var f=s.arg;if(!f.done)return o=x,f;n[u.resultName]=f.value,n.next=u.nextLoc,n.delegate=null}if("next"===a)o===x?n.sent=i:delete n.sent;else if("throw"===a){if(o===w)throw o=L,i;n.dispatchException(i)&&(a="next",i=d)}else"return"===a&&n.abrupt("return",i);o=k;var s=r(t,e,n);if("normal"===s.type){o=n.done?L:x;var f={value:s.arg,done:n.done};if(s.arg!==R)return f;n.delegate&&"next"===a&&(i=d)}else"throw"===s.type&&(o=L,a="throw",i=s.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function l(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function p(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset()}function h(t){if(t){var e=t[g];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,n=function o(){for(;++r<t.length;)if(v.call(t,r))return o.value=t[r],o.done=!1,o;return o.value=d,o.done=!0,o};return n.next=n}}return{next:y}}function y(){return{value:d,done:!0}}var d,v=Object.prototype.hasOwnProperty,g="function"==typeof Symbol&&Symbol.iterator||"@@iterator",b="object"==typeof module,m=t.regeneratorRuntime;if(m)return void(b&&(module.exports=m));m=t.regeneratorRuntime=b?module.exports:{},m.wrap=e;var w="suspendedStart",x="suspendedYield",k="executing",L="completed",R={},E=a.prototype=n.prototype;o.prototype=E.constructor=a,a.constructor=o,o.displayName="GeneratorFunction",m.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return e?e===o||"GeneratorFunction"===(e.displayName||e.name):!1},m.mark=function(t){return t.__proto__=a,t.prototype=Object.create(E),t},m.awrap=function(t){return new u(t)},i(c.prototype),m.async=function(t,r,n,o){var a=new c(e(t,r,n,o));return m.isGeneratorFunction(r)?a:a.next().then(function(t){return t.done?t.value:a.next()})},i(E),E[g]=function(){return this},E.toString=function(){return"[object Generator]"},m.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function n(){for(;e.length;){var r=e.pop();if(r in t)return n.value=r,n.done=!1,n}return n.done=!0,n}},m.values=h,p.prototype={constructor:p,reset:function(){this.prev=0,this.next=0,this.sent=d,this.done=!1,this.delegate=null,this.tryEntries.forEach(l);for(var t,e=0;v.call(this,t="t"+e)||20>e;++e)this[t]=null},stop:function(){this.done=!0;var t=this.tryEntries[0],e=t.completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){function e(e,n){return a.type="throw",a.arg=t,r.next=e,!!n}if(this.done)throw t;for(var r=this,n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n],a=o.completion;if("root"===o.tryLoc)return e("end");if(o.tryLoc<=this.prev){var i=v.call(o,"catchLoc"),u=v.call(o,"finallyLoc");if(i&&u){if(this.prev<o.catchLoc)return e(o.catchLoc,!0);if(this.prev<o.finallyLoc)return e(o.finallyLoc)}else if(i){if(this.prev<o.catchLoc)return e(o.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return e(o.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&v.call(n,"finallyLoc")&&this.prev<n.finallyLoc){var o=n;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=t,a.arg=e,o?this.next=o.finallyLoc:this.complete(a),R},complete:function(t,e){if("throw"===t.type)throw t.arg;"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=t.arg,this.next="end"):"normal"===t.type&&e&&(this.next=e)},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),l(r),R}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;l(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:h(t),resultName:e,nextLoc:r},R}}}("object"==typeof global?global:"object"==typeof window?window:"object"==typeof self?self:void 0);var AbstractTransaction=function(){function t(){_classCallCheck(this,t)}return t.prototype.addOperation=regeneratorRuntime.mark(function e(t){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.delegateYield(this.getState(t.uid[0]),"t0",1);case 1:if(r=e.t0,null==r&&(r={user:t.uid[0],clock:0}),t.uid[1]!==r.clock){e.next=9;break}return r.clock++,e.delegateYield(this.setState(r),"t1",6);case 6:return e.abrupt("return",!0);case 9:return e.abrupt("return",!1);case 10:case"end":return e.stop()}},e,this)}),t}(),IndexedDB=function(){var t=function(t){function e(r){_classCallCheck(this,e),t.call(this),this.transaction=r,this.sv=r.objectStore("StateVector"),this.ob=r.objectStore("OperationBuffer")}return _inherits(e,t),e.prototype.setOperation=regeneratorRuntime.mark(function r(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.delegateYield(regeneratorRuntime.mark(function r(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:case"end":return t.stop()}},r,this)})(),"t0",1);case 1:return e.next=3,this.ob.put(t);case 3:return e.abrupt("return",t);case 4:case"end":return e.stop()}},r,this)}),e.prototype.getOperation=regeneratorRuntime.mark(function n(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ob.get(t);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},n,this)}),e.prototype.setState=regeneratorRuntime.mark(function o(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.sv.put(t);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},o,this)}),e.prototype.getState=regeneratorRuntime.mark(function a(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.sv.get(t);case 2:if(e.t0=e.sent,e.t0){e.next=5;break}e.t0={user:t,clock:0};case 5:return e.abrupt("return",e.t0);case 6:case"end":return e.stop()}},a,this)}),e.prototype.getStateVector=regeneratorRuntime.mark(function i(){var t,e,r;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:t=[],e=this.sv.openCursor();case 2:return n.next=4,e;case 4:if(n.t0=r=n.sent,null==n.t0){n.next=10;break}t.push(r.value),r["continue"](),n.next=2;break;case 10:return n.abrupt("return",t);case 11:case"end":return n.stop()}},i,this)}),e.prototype.getStateSet=regeneratorRuntime.mark(function u(){var t,e,r,n,o,a,i;return regeneratorRuntime.wrap(function(u){for(;;)switch(u.prev=u.next){case 0:return u.delegateYield(this.getStateVector(),"t0",1);case 1:t=u.t0,e={},r=t,n=Array.isArray(r),o=0,r=n?r:r[Symbol.iterator]();case 4:if(!n){u.next=10;break}if(!(o>=r.length)){u.next=7;break}return u.abrupt("break",18);case 7:a=r[o++],u.next=14;break;case 10:if(o=r.next(),!o.done){u.next=13;break}return u.abrupt("break",18);case 13:a=o.value;case 14:i=a,e[i.user]=i.clock;case 16:u.next=4;break;case 18:return u.abrupt("return",e);case 19:case"end":return u.stop()}},u,this)}),e.prototype.getOperations=regeneratorRuntime.mark(function c(t){var e,r,n,o,a,i,u,s,f,l,p,h,y;return regeneratorRuntime.wrap(function(c){for(;;)switch(c.prev=c.next){case 0:return null==t&&(t={}),e=[],c.delegateYield(this.getStateVector(),"t0",3);case 3:r=c.t0,n=r,o=Array.isArray(n),a=0,n=o?n:n[Symbol.iterator]();case 5:if(!o){c.next=11;break}if(!(a>=n.length)){c.next=8;break}return c.abrupt("break",31);case 8:i=n[a++],c.next=15;break;case 11:if(a=n.next(),!a.done){c.next=14;break}return c.abrupt("break",31);case 14:i=a.value;case 15:u=i,s=u.user,f=t[s]||0,l=u.clock,p=IDBKeyRange.bound([s,f],[s,l]),h=this.ob.openCursor(p);case 21:return c.next=23,h;case 23:if(c.t1=y=c.sent,null==c.t1){c.next=29;break}e.push(y.value),y["continue"](),c.next=21;break;case 29:c.next=5;break;case 31:return c.abrupt("return",e);case 32:case"end":return c.stop()}},c,this)}),e}(AbstractTransaction),e=function(){function e(t){var r=this;_classCallCheck(this,e),this.whenReadyListeners=[],this.namespace=t,this.ready=!1;var n=indexedDB.open(t);n.onerror=function(){throw new Error("Couldn't open the IndexedDB database!")},n.onsuccess=function(t){r.db=t.target.result,r.whenReadyListeners.forEach(function(t){setTimeout(t,0)}),r.whenReadyListeners=null,r.ready=!0},n.onupgradeneeded=function(t){var e=t.target.result;e.createObjectStore("OperationBuffer",{keyPath:"uid"}),e.createObjectStore("StateVector",{keyPath:"user"})}}return e.prototype.whenReady=function(t){this.ready?setTimeout(t,0):this.whenReadyListeners.push(t)},e.prototype.requestTransaction=function(e){var r=this;this.whenReady(function(){function n(t){var e=t.value;t.done||(e.constructor===IDBRequest||e.constructor===IDBCursor||e.constructor===IDBOpenDBRequest?(e.onsuccess=function(){n(a.next(e.result))},e.onerror=function(t){a["throw"](t)}):a["throw"]("You can not yield this type!"))}var o=new t(r.db.transaction(["OperationBuffer","StateVector"],"readwrite")),a=e.apply(o);n(a.next())})},e.prototype.removeDatabase=regeneratorRuntime.mark(function r(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,indexedDB.deleteDatabase(this.namespace);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}},r,this)}),e}();return e}(),OperationBuffer=function t(){_classCallCheck(this,t)},Operation=function(){function t(e){_classCallCheck(this,t),this.i=e.i}return t.prototype.yay=function(){return this.i},t}();
 //# sourceMappingURL=y.js.map
\ No newline at end of file
diff --git a/y.js.map b/y.js.map
index 03e8554b..7f6d9a79 100644
--- a/y.js.map
+++ b/y.js.map
@@ -1 +1 @@
-{"version":3,"sources":["y.js","runtime.js","IndexedDB.js","OperationBuffer.js","Operations.js"],"names":["_classCallCheck","instance","Constructor","TypeError","global","wrap","innerFn","outerFn","self","tryLocsList","generator","Object","create","Generator","prototype","_invoke","makeInvokeMethod","Context","tryCatch","fn","obj","arg","type","call","err","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","forEach","method","this","AwaitArgument","AsyncIterator","invoke","result","value","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","push","resetTryEntry","completion","reset","values","iterable","iteratorMethod","iteratorSymbol","isNaN","length","i","hasOwn","hasOwnProperty","Symbol","inModule","module","runtime","regeneratorRuntime","exports","Gp","constructor","displayName","isGeneratorFunction","genFun","ctor","name","mark","__proto__","awrap","async","iter","toString","keys","object","key","reverse","pop","prev","tempName","tempIndex","stop","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","window","IndexedDB","Transaction","transaction","sv","objectStore","ob","setOperation","op","context$3$0","put","getOperation","uid","get","setState","getState","user","t0","clock","getStateVector","stateVector","cursor","openCursor","getOperations","callee$3$0","context$4$0","DB","namespace","ready","yay","nay","req","indexedDB","open","onerror","onsuccess","event","target","onupgradeneeded","db","createObjectStore","keyPath","message","requestTransaction","makeGen","res","request","IDBRequest","gen","apply","OperationBuffer","Operation"],"mappings":"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","file":"y.js","sourcesContent":[null,"/**\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","\ntype State = {\n  user: string,\n  clock: number\n};\n\ntype StateVector = Array<State>;\n\ntype StateSet = Object<number>;\n\nvar IndexedDB = (function(){ //eslint-disable-line no-unused-vars\n  class Transaction {\n\n    constructor (transaction) {\n      this.transaction = transaction;\n      this.sv = transaction.objectStore(\"StateVector\");\n      this.ob = transaction.objectStore(\"OperationBuffer\");\n    }\n    *setOperation (op) {\n        yield this.ob.put(op);\n        return op;\n    }\n    *getOperation (uid) {\n        return yield this.ob.get(uid);\n    }\n    *setState (state : State) : State {\n      return yield this.sv.put(state);\n    }\n    *getState (user : string) : State {\n      return (yield this.sv.get(user)) || {\n        user: user,\n        clock: 0\n      };\n    }\n    *getStateVector () : StateVector {\n      var stateVector = [];\n      var cursor = yield this.sv.openCursor();\n      while ((cursor = yield cursor.continue) != null) {\n        stateVector.push(cursor.value);\n      }\n      return stateVector;\n    }\n    getOperations () {\n      return function* () {\n        var op = yield this.getOperation([\"u1\", 0]);\n        return op.uid;\n      };\n    }\n    /*\n    getOperations: (state_map)->\n      flow = Promise.resolve()\n      ops = []\n      that = this\n      hb = that.t.objectStore(\"HistoryBuffer\")\n\n      that.getStateVector().then (end_state_vector)->\n        for end_state of end_state_vector\n          # convert to the db-structure\n          do (end_state = end_state)->\n            start_state =\n              user: end_state.name\n              state: state_map[end_state] ? 0\n\n            flow = flow.then ()->\n              from = [start_state.user, start_state.number]\n              to = [end_state.user, end_state.number]\n                cursor = event.target.result\n                if cursor?\n                  ops.push cursor.value # add Operation\n                  cursor.continue()\n                else\n                  # got all ops from this user\n                  defer.resolve ops\n              defer.promise\n    */\n  }\n  class DB {\n    constructor (namespace : string) {\n      this.namespace = namespace;\n      this.ready = new Promise(function(yay, nay){\n        var req = indexedDB.open(namespace); //eslint-disable-line no-undef\n        req.onerror = function(){\n          nay(\"Couldn't open the IndexedDB database!\");\n        };\n        req.onsuccess = function(event){\n          yay(event.target.result);\n        };\n        req.onupgradeneeded = function(event){\n          var db = event.target.result;\n          db.createObjectStore(\"OperationBuffer\", {keyPath: \"uid\"});\n          db.createObjectStore(\"StateVector\", {keyPath: \"user\"});\n        };\n      }).catch(function(message){\n          throw new Error(message);\n      });\n    }\n    requestTransaction (makeGen : Function) {\n      this.ready.then(function(db){\n        var transaction = new Transaction(db.transaction([\"OperationBuffer\", \"StateVector\"], \"readwrite\"));\n        var gen = makeGen.apply(transaction);\n\n        function handle(res){\n          var request = res.value;\n          if (res.done){\n            return;\n          } else if (request.constructor === IDBRequest) {\n            request.onsuccess = function(){\n              handle(gen.next(request.result));\n            };\n            request.onerror = function(err){\n              gen.throw(err);\n            };\n          } else {\n            gen.throw(\"You may not yield this type!\");\n          }\n        }\n\n        return handle(gen.next());\n      });\n    }\n  }\n  return DB;\n})();\n","/* @flow */\n\nclass OperationBuffer { //eslint-disable-line no-unused-vars\n  i : number;\n  constructor () {\n    this.i = 4;\n  }\n}\n","/* @flow */\n\nclass Operation { //eslint-disable-line no-unused-vars\n  i : number;\n  constructor (op) {\n    this.i = op.i;\n  }\n  yay () {\n    return this.i;\n  }\n}\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"sources":["y.js","runtime.js","IndexedDB.js","OperationBuffer.js","Operations.js"],"names":["_inherits","subClass","superClass","TypeError","prototype","Object","create","constructor","value","enumerable","writable","configurable","__proto__","_classCallCheck","instance","Constructor","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","push","resetTryEntry","completion","reset","values","iterable","iteratorMethod","iteratorSymbol","isNaN","length","i","hasOwn","hasOwnProperty","Symbol","inModule","module","runtime","regeneratorRuntime","exports","Gp","displayName","isGeneratorFunction","genFun","ctor","name","mark","awrap","async","iter","toString","keys","object","key","reverse","pop","prev","tempName","tempIndex","stop","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","window","AbstractTransaction","addOperation","op","context$2$0","getState","uid","t0","user","clock","setState","IndexedDB","Transaction","_AbstractTransaction","transaction","sv","objectStore","ob","setOperation","context$3$0","callee$3$0","context$4$0","put","getOperation","get","getStateVector","stateVector","cursorResult","cursor","openCursor","getStateSet","ss","_iterator","_isArray","_i","_ref","Array","isArray","getOperations","startSS","ops","endSV","_iterator2","_isArray2","_i2","_ref2","endState","startPos","endPos","range","IDBKeyRange","bound","t1","DB","namespace","_this","whenReadyListeners","ready","req","indexedDB","open","onerror","onsuccess","event","db","target","f","setTimeout","onupgradeneeded","createObjectStore","keyPath","whenReady","requestTransaction","makeGen","_this2","res","request","IDBRequest","IDBCursor","IDBOpenDBRequest","gen","apply","removeDatabase","deleteDatabase","OperationBuffer","Operation","yay"],"mappings":"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","file":"y.js","sourcesContent":[null,"/**\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","\ntype State = {\n  user: string,\n  clock: number\n};\n\ntype StateVector = Array<State>;\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\ndeclare var setTimeout : Function;\n\nclass AbstractTransaction { //eslint-disable-line no-unused-vars\n  constructor () {\n  }\n  *addOperation (op) {\n    var state = yield* this.getState(op.uid[0]);\n    if (state == null){\n      state = {\n        user: op.uid[0],\n        clock: 0\n      };\n    }\n    if (op.uid[1] === state.clock){\n      state.clock++;\n      yield* this.setState(state);\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nvar IndexedDB = (function(){ //eslint-disable-line no-unused-vars\n  class Transaction extends AbstractTransaction{\n    transaction: IDBTransaction;\n    sv: IDBObjectStore;\n    ob: IDBObjectStore;\n    constructor (transaction) {\n      super();\n      this.transaction = transaction;\n      this.sv = transaction.objectStore(\"StateVector\");\n      this.ob = transaction.objectStore(\"OperationBuffer\");\n    }\n    *setOperation (op) {\n        yield* (function*(){})();\n        yield this.ob.put(op);\n        return op;\n    }\n    *getOperation (uid) {\n        return yield this.ob.get(uid);\n    }\n    *setState (state : State) : State {\n      return yield this.sv.put(state);\n    }\n    *getState (user : string) : State {\n      return (yield this.sv.get(user)) || {\n        user: user,\n        clock: 0\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.ob.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 DB {\n    namespace: string;\n    ready: Promise;\n    whenReadyListeners: Array<Function>;\n    constructor (namespace : string) {\n      this.whenReadyListeners = [];\n      this.namespace = namespace;\n      this.ready = false;\n\n      var req = indexedDB.open(namespace); //eslint-disable-line no-undef\n      req.onerror = function(){\n        throw new Error(\"Couldn't open the IndexedDB database!\");\n      };\n      req.onsuccess = (event)=>{\n        this.db = event.target.result;\n        this.whenReadyListeners.forEach(function(f){\n          setTimeout(f, 0);\n        });\n        this.whenReadyListeners = null;\n        this.ready = true;\n      };\n      req.onupgradeneeded = function(event){\n        var db = event.target.result;\n        db.createObjectStore(\"OperationBuffer\", {keyPath: \"uid\"});\n        db.createObjectStore(\"StateVector\", {keyPath: \"user\"});\n      };\n    }\n    whenReady (f : Function) {\n      if (this.ready){\n        setTimeout(f, 0);\n      } else {\n        this.whenReadyListeners.push(f);\n      }\n    }\n    requestTransaction (makeGen : Function) {\n      this.whenReady(()=>{\n        var transaction = new Transaction(this.db.transaction([\"OperationBuffer\", \"StateVector\"], \"readwrite\"));\n        var gen = makeGen.apply(transaction);\n\n        function handle(res : any){\n          var request : any = res.value;\n          if (res.done){\n            return;\n          } else if (request.constructor === IDBRequest\n                     || request.constructor === IDBCursor\n                     || request.constructor === IDBOpenDBRequest) {\n            request.onsuccess = function(){\n              handle(gen.next(request.result));\n            };\n            request.onerror = function(err){\n              gen.throw(err);\n            };\n          } else {\n            gen.throw(\"You can not yield this type!\");\n          }\n        }\n        handle(gen.next());\n      });\n    }\n    *removeDatabase () {\n      return yield indexedDB.deleteDatabase(this.namespace);\n    }\n  }\n  return DB;\n})();\n","/* @flow */\n\nclass OperationBuffer { //eslint-disable-line no-unused-vars\n  constructor () {\n\n  }\n}\n","/* @flow */\n\nclass Operation { //eslint-disable-line no-unused-vars\n  i : number;\n  constructor (op) {\n    this.i = op.i;\n  }\n  yay () {\n    return this.i;\n  }\n}\n"],"sourceRoot":"/source/"}
\ No newline at end of file
-- 
GitLab