diff --git a/.eslintrc b/.eslintrc index fdd4aef0..26b41068 100644 --- a/.eslintrc +++ b/.eslintrc @@ -8,7 +8,10 @@ }, "parser": "babel-eslint", "globals": { - "OperationBuffer": true, + "OperationStore": true, + "AbstractOperationStore": true, + "AbstractTransaction": true, + "Transaction": true, "IndexedDB": true, "IDBRequest": true } diff --git a/gulpfile.js b/gulpfile.js index 544c10b5..75573273 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -128,7 +128,6 @@ gulp.task("develop", ["build_jasmine_browser", "test", "build"], function(){ .pipe(watch("build/jasmine_browser.js")) .pipe(jasmineBrowser.specRunner()) .pipe(jasmineBrowser.server({port: options.testport})); - }); gulp.task("default", ["build", "test"]); diff --git a/package.json b/package.json index f889295a..c949463f 100644 --- a/package.json +++ b/package.json @@ -44,11 +44,10 @@ "gulp-jasmine-browser": "^0.1.3", "gulp-sourcemaps": "^1.5.2", "gulp-uglify": "^1.2.0", + "gulp-util": "^3.0.5", "gulp-watch": "^4.2.4", - "gulp-webpack": "^1.5.0", "minimist": "^1.1.1", "pre-commit": "^1.0.10", - "promise-polyfill": "^2.0.2", "regenerator": "^0.8.30" } } diff --git a/src/IndexedDB.js b/src/IndexedDB.js index 4a078d8c..22bb9c98 100644 --- a/src/IndexedDB.js +++ b/src/IndexedDB.js @@ -20,54 +20,49 @@ 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{ + class Transaction extends AbstractTransaction { //eslint-disable-line transaction: IDBTransaction; sv: IDBObjectStore; - ob: IDBObjectStore; - constructor (transaction) { - super(); - this.transaction = transaction; - this.sv = transaction.objectStore("StateVector"); - this.ob = transaction.objectStore("OperationBuffer"); + os: IDBObjectStore; + store: OperationStore; + + constructor (store : OperationStore) { + super(store); + this.transaction = store.db.transaction(["OperationStore", "StateVector"], "readwrite"); + this.sv = this.transaction.objectStore("StateVector"); + this.os = this.transaction.objectStore("OperationStore"); + this.buffer = {}; } *setOperation (op) { - yield* (function*(){})(); - yield this.ob.put(op); - return op; + yield this.os.put(op); + this.buffer[JSON.stringify(op.uid)] = op; + return op; } - *getOperation (uid) { - return yield this.ob.get(uid); + *getOperation (id) { + var op = this.buffer[JSON.stringify(id)]; + if (op == null) { + op = yield this.os.get(id); + this.buffer[JSON.stringify(id)] = op; + } + return op; + } + *removeOperation (id) { + return yield this.os.delete(id); } *setState (state : State) : State { return yield this.sv.put(state); } *getState (user : string) : State { - return (yield this.sv.get(user)) || { - user: user, - clock: 0 - }; + var state; + if ((state = yield this.sv.get(user)) != null){ + return state; + } else { + return { + user: user, + clock: 0 + }; + } } *getStateVector () : StateVector { var stateVector = []; @@ -100,7 +95,7 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars var startPos = startSS[user] || 0; var endPos = endState.clock; var range = IDBKeyRange.bound([user, startPos], [user, endPos]); - var cursorResult = this.ob.openCursor(range); + var cursorResult = this.os.openCursor(range); var cursor; while ((cursor = yield cursorResult) != null) { ops.push(cursor.value); @@ -110,16 +105,17 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars return ops; } } - class DB { + class OperationStore extends AbstractOperationStore { //eslint-disable-line no-undef namespace: string; ready: Promise; whenReadyListeners: Array; constructor (namespace : string) { + super(); this.whenReadyListeners = []; this.namespace = namespace; this.ready = false; - var req = indexedDB.open(namespace); //eslint-disable-line no-undef + var req = indexedDB.open(namespace, 2); //eslint-disable-line no-undef req.onerror = function(){ throw new Error("Couldn't open the IndexedDB database!"); }; @@ -133,7 +129,7 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars }; req.onupgradeneeded = function(event){ var db = event.target.result; - db.createObjectStore("OperationBuffer", {keyPath: "uid"}); + db.createObjectStore("OperationStore", {keyPath: "id"}); db.createObjectStore("StateVector", {keyPath: "user"}); }; } @@ -146,7 +142,7 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars } requestTransaction (makeGen : Function) { this.whenReady(()=>{ - var transaction = new Transaction(this.db.transaction(["OperationBuffer", "StateVector"], "readwrite")); + var transaction = new Transaction(this); var gen = makeGen.apply(transaction); function handle(res : any){ @@ -170,8 +166,9 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars }); } *removeDatabase () { - return yield indexedDB.deleteDatabase(this.namespace); + this.db.close(); + yield indexedDB.deleteDatabase(this.namespace); } } - return DB; + return OperationStore; })(); diff --git a/src/IndexedDB.spec.js b/src/IndexedDB.spec.js index 50ab8f7b..0f051338 100644 --- a/src/IndexedDB.spec.js +++ b/src/IndexedDB.spec.js @@ -5,10 +5,10 @@ if(typeof window !== "undefined"){ describe("IndexedDB", function() { var ob = new IndexedDB("Test"); - it("can create transactions", function(done) { + it("can add and get operation", function(done) { ob.requestTransaction(function*(){ var op = yield* this.setOperation({ - "uid": ["1", 0], + "id": ["1", 0], "stuff": true }); expect(yield* this.getOperation(["1", 0])) @@ -17,6 +17,21 @@ if(typeof window !== "undefined"){ }); }); + it("can remove operation", function(done) { + ob.requestTransaction(function*(){ + var op = yield* this.setOperation({ + "id": ["1", 0], + "stuff": true + }); + expect(yield* this.getOperation(["1", 0])) + .toEqual(op); + yield* this.removeOperation(["1", 0]); + expect(yield* this.getOperation(["1", 0])) + .toBeUndefined(); + done(); + }); + }); + it("getOperation(op) returns undefined if op does not exist", function(done){ ob.requestTransaction(function*(){ var op = yield* this.getOperation("plzDon'tBeThere"); @@ -73,11 +88,11 @@ if(typeof window !== "undefined"){ var s1 = {user: "1", clock: 55}; yield* this.setState(s1); var op1 = yield* this.setOperation({ - "uid": ["1", 0], + "id": ["1", 0], "stuff": true }); var op2 = yield* this.setOperation({ - "uid": ["1", 3], + "id": ["1", 3], "stuff": true }); var ops = yield* this.getOperations(); @@ -87,9 +102,11 @@ if(typeof window !== "undefined"){ done(); }); }); - afterAll(function(){ + afterAll(function(done){ ob.requestTransaction(function*(){ yield* ob.removeDatabase(); + ob = null; + done(); }); }); }); diff --git a/src/OperationBuffer.js b/src/OperationBuffer.js deleted file mode 100644 index 2e4ace47..00000000 --- a/src/OperationBuffer.js +++ /dev/null @@ -1,7 +0,0 @@ -/* @flow */ - -class OperationBuffer { //eslint-disable-line no-unused-vars - constructor () { - - } -} diff --git a/src/OperationBuffer.spec.js b/src/OperationBuffer.spec.js deleted file mode 100644 index a4ba0077..00000000 --- a/src/OperationBuffer.spec.js +++ /dev/null @@ -1,2 +0,0 @@ -/* @flow */ -/*eslint-env browser,jasmine,console */ diff --git a/src/OperationStore.js b/src/OperationStore.js new file mode 100644 index 00000000..868d716f --- /dev/null +++ b/src/OperationStore.js @@ -0,0 +1,117 @@ +/* @flow */ +class AbstractTransaction { //eslint-disable-line no-unused-vars + constructor (store : OperationStore) { + this.store = store; + } + // Throws if operation is not expected. + *addOperation (op) { + var state = this.getState(op.id[0]); + if (op.id[1] === state.clock){ + state.clock++; + yield* this.setState(state); + this.store.operationAdded(op); + return true; + } else { + return false; + } + } +} + +type Listener = { + f : GeneratorFunction, // is called when all operations are available + missing : number // number of operations that are missing +} + +type GeneratorFunction = Function; + +type Id = [string, number]; + +class AbstractOperationStore { //eslint-disable-line no-unused-vars + constructor () { + // E.g. this.listenersById[id] : Array + this.listenersById = {}; + // Execute the next time a transaction is requested + this.listenersByIdExecuteNow = []; + // A transaction is requested + this.listenersByIdRequestPending = false; + /* To make things more clear, the following naming conventions: + * ls : we put this.listenersById on ls + * l : Array + * id : Id (can't use as property name) + * sid : String (converted from id via JSON.stringify + so we can use it as a property name) + + Always remember to first overwrite over + a property before you iterate over it! + */ + } + // f is called as soon as every operation requested is available. + // Note that Transaction can (and should) buffer requests. + whenOperationsExist (ids : Array, f : GeneratorFunction, args : Array) { + if (ids.length > 0) { + let listener : Listener = { + f: f, + args: args || [], + missing: ids.length + }; + + for (let id of ids) { + let sid = JSON.stringify(id); + let l = this.listenersById[sid]; + if (l == null){ + l = []; + this.listenersById[sid] = l; + } + l.push(listener); + } + } else { + this.listenersByIdExecuteNow.push({ + f: f, + args: args || [] + }); + } + + if (this.listenersByIdRequestPending){ + return; + } + + this.listenersByIdRequestPending = true; + var store = this; + + this.requestTransaction(function*(){ + var exe = store.listenersByIdExecuteNow; + store.listenersByIdExecuteNow = []; + for (let listener of exe) { + yield* listener.f.apply(this, listener.args); + } + + var ls = store.listenersById; + store.listenersById = {}; + for (var sid in ls){ + var l = ls[sid]; + var id = JSON.parse(sid); + if ((yield* this.getOperation(id)) == null){ + store.listenersById[sid] = l; + } else { + for (let listener of l) { + if (--listener.missing === 0){ + yield* listener.f.apply(this, listener.args); + } + } + } + } + + store.listenersByIdRequestPending = false; + }); + + } + // called by a transaction when an operation is added + operationAdded (op) { + var l = this.listenersById[op.id]; + for (var listener of l){ + if (--listener.missing === 0){ + this.whenOperationsExist([], listener.f, listener.args); + } + } + } +} diff --git a/src/OperationStore.spec.js b/src/OperationStore.spec.js new file mode 100644 index 00000000..9bf1de17 --- /dev/null +++ b/src/OperationStore.spec.js @@ -0,0 +1,40 @@ +/* @flow */ +/*eslint-env browser,jasmine,console */ + +describe("OperationStore", function() { + class OperationStore extends AbstractOperationStore { + requestTransaction (makeGen) { + var gen = makeGen.apply(); + + 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*(){ + done(); + }); + os.operationAdded({id: id}); + }); + it("calls when no requirements", function(done) { + os.whenOperationsExist([], function*(){ + done(); + }); + }); + it("calls when no requirements with arguments", function(done) { + os.whenOperationsExist([], function*(arg){ + expect(arg).toBeTrue(); + done(); + }, [true]); + }); +}); diff --git a/src/Operations.js b/src/Operations.js index aff2281f..8934df5a 100644 --- a/src/Operations.js +++ b/src/Operations.js @@ -1,11 +1,44 @@ /* @flow */ -class Operation { //eslint-disable-line no-unused-vars - i : number; - constructor (op) { - this.i = op.i; +// Op is anything that we could get from the OperationStore. +type Op = Object; + +var Struct = { + Operation: { //eslint-disable-line no-unused-vars + create: function*(op : Op, user : string) : Struct.Operation { + var state = yield* this.getState(user); + op.id = [user, state.clock]; + return yield* this.addOperation(op); + } + }, + Insert: { + create: function*( op : Op, + user : string, + left : Struct.Insert, + right : Struct.Insert) : Struct.Insert { + op.left = left ? left.id : null; + op.origin = op.left; + op.right = right ? right.id : null; + op.type = "Insert"; + yield* Struct.Operation.create(op, user); + + if (left != null) { + left.right = op.id; + yield* this.setOperation(left); + } + if (right != null) { + right.left = op.id; + yield* this.setOperation(right); + } + return op; + }, + requiredOps: function(op, ids){ + ids.push(op.left); + ids.push(op.right); + return ids; + }, + execute: function*(op){ + return op; + } } - yay () { - return this.i; - } -} +}; diff --git a/y.js b/y.js index 2074752d..59317450 100644 --- a/y.js +++ b/y.js @@ -1,2 +1,2 @@ -"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(;++re;++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=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&v.call(n,"finallyLoc")&&this.prev=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}(); +"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}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(e){function t(e,t,r,a){var i=Object.create((t||n).prototype);return i._invoke=c(e,r||null,new p(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 o(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function s(e){this.arg=e}function u(e){function t(t,r){var n=e[t](r),o=n.value;return o instanceof s?Promise.resolve(o.arg).then(a,i):Promise.resolve(o).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"](o),a}"object"==typeof process&&process.domain&&(t=process.domain.bind(t));var n,a=t.bind(e,"next"),i=t.bind(e,"throw"),o=t.bind(e,"return");this._invoke=r}function c(e,t,n){var a=m;return function(i,o){if(a===k)throw new Error("Generator is already running");if(a===R)return d();for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===y){n.delegate=null;var u=s.iterator["return"];if(u){var c=r(u,s.iterator,o);if("throw"===c.type){i="throw",o=c.arg;continue}}if("return"===i)continue}var c=r(s.iterator[i],s.iterator,o);if("throw"===c.type){n.delegate=null,i="throw",o=c.arg;continue}i="next",o=y;var l=c.arg;if(!l.done)return a=w,l;n[s.resultName]=l.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)a===w?n.sent=o:delete n.sent;else if("throw"===i){if(a===m)throw a=R,o;n.dispatchException(o)&&(i="next",o=y)}else"return"===i&&n.abrupt("return",o);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&&(o=y)}else"throw"===c.type&&(a=R,i="throw",o=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 f(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function p(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(l,this),this.reset()}function h(e){if(e){var t=e[b];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 o=g.call(a,"catchLoc"),s=g.call(a,"finallyLoc");if(o&&s){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&g.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),f(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;f(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 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.uid)]=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 t.next=2,this.os["delete"](e);case 2:return t.abrupt("return",t.sent);case 3: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 o(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()}},o,this)}),t.prototype.getStateVector=regeneratorRuntime.mark(function s(){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()}},s,this)}),t.prototype.getStateSet=regeneratorRuntime.mark(function u(){var e,t,r,n,a,i,o;return regeneratorRuntime.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return s.delegateYield(this.getStateVector(),"t0",1);case 1:e=s.t0,t={},r=e,n=Array.isArray(r),a=0,r=n?r:r[Symbol.iterator]();case 4:if(!n){s.next=10;break}if(!(a>=r.length)){s.next=7;break}return s.abrupt("break",18);case 7:i=r[a++],s.next=14;break;case 10:if(a=r.next(),!a.done){s.next=13;break}return s.abrupt("break",18);case 13:i=a.value;case 14:o=i,t[o.user]=o.clock;case 16:s.next=4;break;case 18:return s.abrupt("return",t);case 19:case"end":return s.stop()}},u,this)}),t.prototype.getOperations=regeneratorRuntime.mark(function c(e){var t,r,n,a,i,o,s,u,l,f,p,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:o=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:o=i.value;case 15:s=o,u=s.user,l=e[u]||0,f=s.clock,p=IDBKeyRange.bound([u,l],[u,f]),h=this.os.openCursor(p);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(e){var n=this;_classCallCheck(this,r),t.call(this),this.whenReadyListeners=[],this.namespace=e,this.ready=!1;var a=indexedDB.open(e,2);a.onerror=function(){throw new Error("Couldn't open the IndexedDB database!")},a.onsuccess=function(e){n.db=e.target.result,n.whenReadyListeners.forEach(function(e){setTimeout(e,0)}),n.whenReadyListeners=null,n.ready=!0},a.onupgradeneeded=function(e){var t=e.target.result;t.createObjectStore("OperationStore",{keyPath:"id"}),t.createObjectStore("StateVector",{keyPath:"user"})}}return _inherits(r,t),r.prototype.whenReady=function(e){this.ready?setTimeout(e,0):this.whenReadyListeners.push(e)},r.prototype.requestTransaction=function(t){var r=this;this.whenReady(function(){function n(e){var t=e.value;e.done||(t.constructor===IDBRequest||t.constructor===IDBCursor||t.constructor===IDBOpenDBRequest?(t.onsuccess=function(){n(i.next(t.result))},t.onerror=function(e){i["throw"](e)}):i["throw"]("You can not yield this type!"))}var a=new e(r),i=t.apply(a);n(i.next())})},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}(),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:if(r=this.getState(e.id[0]),e.id[1]!==r.clock){t.next=8;break}return r.clock++,t.delegateYield(this.setState(r),"t0",4);case 4:return this.store.operationAdded(e),t.abrupt("return",!0);case 8:return t.abrupt("return",!1);case 9:case"end":return t.stop()}},t,this)}),e}(),AbstractOperationStore=function(){function e(){_classCallCheck(this,e),this.listenersById={},this.listenersByIdExecuteNow=[],this.listenersByIdRequestPending=!1}return e.prototype.whenOperationsExist=function(e,t,r){if(e.length>0)for(var n={f:t,args:r||[],missing:e.length},a=e,i=Array.isArray(a),o=0,a=i?a:a[Symbol.iterator]();;){var s;if(i){if(o>=a.length)break;s=a[o++]}else{if(o=a.next(),o.done)break;s=o.value}var u=s,c=JSON.stringify(u),l=this.listenersById[c];null==l&&(l=[],this.listenersById[c]=l),l.push(n)}else this.listenersByIdExecuteNow.push({f:t,args:r||[]});if(!this.listenersByIdRequestPending){this.listenersByIdRequestPending=!0;var f=this;this.requestTransaction(regeneratorRuntime.mark(function p(){var e,t,r,n,a,i,o,s,u,c,l,h,d,y;return regeneratorRuntime.wrap(function(p){for(;;)switch(p.prev=p.next){case 0:e=f.listenersByIdExecuteNow,f.listenersByIdExecuteNow=[],t=e,r=Array.isArray(t),n=0,t=r?t:t[Symbol.iterator]();case 3:if(!r){p.next=9;break}if(!(n>=t.length)){p.next=6;break}return p.abrupt("break",17);case 6:a=t[n++],p.next=13;break;case 9:if(n=t.next(),!n.done){p.next=12;break}return p.abrupt("break",17);case 12:a=n.value;case 13:return i=a,p.delegateYield(i.f.apply(this,i.args),"t0",15);case 15:p.next=3;break;case 17:o=f.listenersById,f.listenersById={},p.t1=regeneratorRuntime.keys(o);case 20:if((p.t2=p.t1()).done){p.next=47;break}return s=p.t2.value,u=o[s],c=JSON.parse(s),p.delegateYield(this.getOperation(c),"t3",25);case 25:if(null!=p.t3){p.next=29;break}f.listenersById[s]=u,p.next=45;break;case 29:l=u,h=Array.isArray(l),d=0,l=h?l:l[Symbol.iterator]();case 30:if(!h){p.next=36;break}if(!(d>=l.length)){p.next=33;break}return p.abrupt("break",45);case 33:y=l[d++],p.next=40;break;case 36:if(d=l.next(),!d.done){p.next=39;break}return p.abrupt("break",45);case 39:y=d.value;case 40:if(i=y,0!==--i.missing){p.next=43;break}return p.delegateYield(i.f.apply(this,i.args),"t4",43);case 43:p.next=30;break;case 45:p.next=20;break;case 47:f.listenersByIdRequestPending=!1;case 48:case"end":return p.stop()}},p,this)}))}},e.prototype.operationAdded=function(e){for(var t=this.listenersById[e.id],r=t,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 o=i;0===--o.missing&&this.whenOperationsExist([],o.f,o.args)}},e}(),Struct={Operation:{create:regeneratorRuntime.mark(function e(t,r){var n;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.delegateYield(this.getState(r),"t0",1);case 1:return n=e.t0,t.id=[r,n.clock],e.delegateYield(this.addOperation(t),"t1",4);case 4:return e.abrupt("return",e.t1);case 5:case"end":return e.stop()}},e,this)})},Insert:{create:regeneratorRuntime.mark(function t(e,r,n,a){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.left=n?n.id:null,e.origin=e.left,e.right=a?a.id:null,e.type="Insert",t.delegateYield(Struct.Operation.create(e,r),"t0",5);case 5:if(null==n){t.next=8;break}return n.right=e.id,t.delegateYield(this.setOperation(n),"t1",8);case 8:if(null==a){t.next=11;break}return a.left=e.id,t.delegateYield(this.setOperation(a),"t2",11);case 11:return t.abrupt("return",e);case 12:case"end":return t.stop()}},t,this)}),requiredOps:function(e,t){return t.push(e.left),t.push(e.right),t},execute:regeneratorRuntime.mark(function r(e){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e);case 1:case"end":return t.stop()}},r,this)})}}; //# sourceMappingURL=y.js.map \ No newline at end of file diff --git a/y.js.map b/y.js.map index 7f6d9a79..6408fcc3 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":["_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;\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;\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 +{"version":3,"sources":["y.js","runtime.js","IndexedDB.js","OperationStore.js","Operations.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_inherits","subClass","superClass","prototype","Object","create","constructor","value","enumerable","writable","configurable","__proto__","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","IndexedDB","Transaction","_AbstractTransaction","store","transaction","db","sv","objectStore","os","buffer","setOperation","op","context$3$0","put","JSON","stringify","uid","getOperation","id","get","removeOperation","setState","getState","user","t0","clock","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","AbstractTransaction","OperationStore","_AbstractOperationStore","namespace","_this","whenReadyListeners","ready","req","indexedDB","open","onerror","onsuccess","event","target","f","setTimeout","onupgradeneeded","createObjectStore","keyPath","whenReady","requestTransaction","makeGen","_this2","res","request","IDBRequest","IDBCursor","IDBOpenDBRequest","gen","apply","removeDatabase","close","deleteDatabase","AbstractOperationStore","addOperation","context$2$0","operationAdded","listenersById","listenersByIdExecuteNow","listenersByIdRequestPending","whenOperationsExist","ids","args","listener","missing","_iterator3","_isArray3","_i3","_ref3","sid","l","callee$2$0","exe","_iterator4","_isArray4","_i4","_ref4","ls","_iterator5","_isArray5","_i5","_ref5","t2","parse","t3","_iterator6","_isArray6","_i6","_ref6","Struct","Operation","context$1$0","Insert","left","right","origin","requiredOps","execute"],"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;\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\nvar 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.uid)] = 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 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 (namespace : string) {\n super();\n this.whenReadyListeners = [];\n this.namespace = namespace;\n this.ready = false;\n\n var req = indexedDB.open(namespace, 2); //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(\"OperationStore\", {keyPath: \"id\"});\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);\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 this.db.close();\n yield indexedDB.deleteDatabase(this.namespace);\n }\n }\n return OperationStore;\n})();\n","/* @flow */\nclass AbstractTransaction { //eslint-disable-line no-unused-vars\n constructor (store : OperationStore) {\n this.store = store;\n }\n // Throws if operation is not expected.\n *addOperation (op) {\n var state = this.getState(op.id[0]);\n if (op.id[1] === state.clock){\n state.clock++;\n yield* this.setState(state);\n this.store.operationAdded(op);\n return true;\n } else {\n return false;\n }\n }\n}\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 GeneratorFunction = Function;\n\ntype Id = [string, number];\n\nclass AbstractOperationStore { //eslint-disable-line no-unused-vars\n constructor () {\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 // 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 id of ids) {\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 exe = store.listenersByIdExecuteNow;\n store.listenersByIdExecuteNow = [];\n for (let listener of exe) {\n yield* listener.f.apply(this, listener.args);\n }\n\n var ls = store.listenersById;\n store.listenersById = {};\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 listener of l) {\n if (--listener.missing === 0){\n yield* listener.f.apply(this, listener.args);\n }\n }\n }\n }\n\n store.listenersByIdRequestPending = false;\n });\n\n }\n // called by a transaction when an operation is added\n operationAdded (op) {\n var l = this.listenersById[op.id];\n for (var listener of l){\n if (--listener.missing === 0){\n this.whenOperationsExist([], listener.f, listener.args);\n }\n }\n }\n}\n","/* @flow */\n\n// Op is anything that we could get from the OperationStore.\ntype Op = Object;\n\nvar Struct = {\n Operation: { //eslint-disable-line no-unused-vars\n create: function*(op : Op, user : string) : Struct.Operation {\n var state = yield* this.getState(user);\n op.id = [user, state.clock];\n return yield* this.addOperation(op);\n }\n },\n Insert: {\n create: function*( op : Op,\n user : string,\n left : Struct.Insert,\n right : Struct.Insert) : Struct.Insert {\n op.left = left ? left.id : null;\n op.origin = op.left;\n op.right = right ? right.id : null;\n op.type = \"Insert\";\n yield* Struct.Operation.create(op, user);\n\n if (left != null) {\n left.right = op.id;\n yield* this.setOperation(left);\n }\n if (right != null) {\n right.left = op.id;\n yield* this.setOperation(right);\n }\n return op;\n },\n requiredOps: function(op, ids){\n ids.push(op.left);\n ids.push(op.right);\n return ids;\n },\n execute: function*(op){\n return op;\n }\n }\n};\n"],"sourceRoot":"/source/"} \ No newline at end of file