linted all files
This commit is contained in:
		
							parent
							
								
									fec03dc6e1
								
							
						
					
					
						commit
						7ec409e09f
					
				
							
								
								
									
										29
									
								
								.eslintrc
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								.eslintrc
									
									
									
									
									
								
							@ -5,20 +5,23 @@
 | 
				
			|||||||
  "rules": {
 | 
					  "rules": {
 | 
				
			||||||
    "strict": 0,
 | 
					    "strict": 0,
 | 
				
			||||||
    "camelcase": [1, {"properties": "never"}],
 | 
					    "camelcase": [1, {"properties": "never"}],
 | 
				
			||||||
    "no-underscore-dangle": 0
 | 
					    "no-underscore-dangle": 0,
 | 
				
			||||||
 | 
					    "no-constant-condition": 0,
 | 
				
			||||||
 | 
					    "no-empty": 0
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "parser": "babel-eslint",
 | 
					  "parser": "babel-eslint",
 | 
				
			||||||
  "globals": {
 | 
					  "globals": {
 | 
				
			||||||
        "OperationStore": true,
 | 
					    "Struct": true,
 | 
				
			||||||
        "AbstractOperationStore": true,
 | 
					    "OperationStore": true,
 | 
				
			||||||
        "AbstractTransaction": true,
 | 
					    "AbstractOperationStore": true,
 | 
				
			||||||
        "AbstractConnector": true,
 | 
					    "AbstractTransaction": true,
 | 
				
			||||||
        "Transaction": true,
 | 
					    "AbstractConnector": true,
 | 
				
			||||||
        "IndexedDB": true,
 | 
					    "Transaction": true,
 | 
				
			||||||
        "IDBRequest": true,
 | 
					    "IndexedDB": true,
 | 
				
			||||||
        "GeneratorFunction": true,
 | 
					    "IDBRequest": true,
 | 
				
			||||||
        "Y": true,
 | 
					    "GeneratorFunction": true,
 | 
				
			||||||
        "setTimeout": true,
 | 
					    "Y": true,
 | 
				
			||||||
        "setInterval": true
 | 
					    "setTimeout": true,
 | 
				
			||||||
    }
 | 
					    "setInterval": true
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -49,7 +49,7 @@ var concat = require("gulp-concat");
 | 
				
			|||||||
var watch = require("gulp-watch");
 | 
					var watch = require("gulp-watch");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var polyfills = [
 | 
					var polyfills = [
 | 
				
			||||||
  "./node_modules/regenerator/runtime.js"
 | 
					  "./node_modules/gulp-babel/node_modules/babel-core/node_modules/regenerator/runtime.js"
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var files = {
 | 
					var files = {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,6 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "pre-commit": [
 | 
					  "pre-commit": [
 | 
				
			||||||
    "lint",
 | 
					    "lint",
 | 
				
			||||||
    "test",
 | 
					 | 
				
			||||||
    "build"
 | 
					    "build"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "repository": {
 | 
					  "repository": {
 | 
				
			||||||
@ -47,7 +46,6 @@
 | 
				
			|||||||
    "gulp-util": "^3.0.5",
 | 
					    "gulp-util": "^3.0.5",
 | 
				
			||||||
    "gulp-watch": "^4.2.4",
 | 
					    "gulp-watch": "^4.2.4",
 | 
				
			||||||
    "minimist": "^1.1.1",
 | 
					    "minimist": "^1.1.1",
 | 
				
			||||||
    "pre-commit": "^1.0.10",
 | 
					    "pre-commit": "^1.0.10"
 | 
				
			||||||
    "regenerator": "^0.8.30"
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										106
									
								
								src/Connector.js
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								src/Connector.js
									
									
									
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class AbstractConnector {
 | 
					class AbstractConnector { //eslint-disable-line no-unused-vars
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
    opts
 | 
					    opts
 | 
				
			||||||
     .role : String Role of this client ("master" or "slave")
 | 
					     .role : String Role of this client ("master" or "slave")
 | 
				
			||||||
@ -73,60 +73,72 @@ class AbstractConnector {
 | 
				
			|||||||
  // true otherwise
 | 
					  // true otherwise
 | 
				
			||||||
  findNextSyncTarget () {
 | 
					  findNextSyncTarget () {
 | 
				
			||||||
    if (this.currentSyncTarget != null && this.connections[this.currentSyncTarget].isSynced === false) {
 | 
					    if (this.currentSyncTarget != null && this.connections[this.currentSyncTarget].isSynced === false) {
 | 
				
			||||||
      throw new Error("The current sync has not finished!")
 | 
					      throw new Error("The current sync has not finished!");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var syncUser = null;
 | 
				
			||||||
    for (var uid in this.connections) {
 | 
					    for (var uid in this.connections) {
 | 
				
			||||||
      var u = this.connections[uid];
 | 
					      syncUser = this.connections[uid];
 | 
				
			||||||
      if (!u.isSynced) {
 | 
					      if (!syncUser.isSynced) {
 | 
				
			||||||
        this.currentSyncTarget = uid;
 | 
					        break;
 | 
				
			||||||
        this.send(uid, {
 | 
					 | 
				
			||||||
            type: "sync step 1",
 | 
					 | 
				
			||||||
            stateVector: hb.getStateVector()
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (syncUser != null){
 | 
				
			||||||
 | 
					      var conn = this;
 | 
				
			||||||
 | 
					      this.y.os.requestTransaction(function*(){
 | 
				
			||||||
 | 
					        conn.currentSyncTarget = uid;
 | 
				
			||||||
 | 
					        conn.send(uid, {
 | 
				
			||||||
 | 
					          type: "sync step 1",
 | 
				
			||||||
 | 
					          stateVector: yield* this.getStateVector()
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    // set the state to synced!
 | 
					    // set the state to synced!
 | 
				
			||||||
    if (!this.isSynced) {
 | 
					    if (!this.isSynced) {
 | 
				
			||||||
      this.isSynced = true;
 | 
					      this.isSynced = true;
 | 
				
			||||||
      for (var f of this.whenSyncedListeners) {
 | 
					      for (var f of this.whenSyncedListeners) {
 | 
				
			||||||
        f()
 | 
					        f();
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      this.whenSyncedListeners = null;
 | 
					      this.whenSyncedListeners = null;
 | 
				
			||||||
    }    return false;
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // You received a raw message, and you know that it is intended for to Yjs. Then call this function.
 | 
					  // You received a raw message, and you know that it is intended for to Yjs. Then call this function.
 | 
				
			||||||
  receiveMessage (sender, m) {
 | 
					  receiveMessage (sender, m) {
 | 
				
			||||||
    if (m.type === "sync step 1") {
 | 
					    if (m.type === "sync step 1") {
 | 
				
			||||||
      // TODO: make transaction, stream the ops
 | 
					      // TODO: make transaction, stream the ops
 | 
				
			||||||
      var ops = yield* this.os.getOperations(m.stateVector);
 | 
					      let conn = this;
 | 
				
			||||||
      // TODO: compare against m.sv!
 | 
					      this.os.requestTransaction(function*(){
 | 
				
			||||||
      var sv = yield* this.getStateVector();
 | 
					        var ops = yield* this.getOperations(m.stateVector);
 | 
				
			||||||
      this.send (sender, {
 | 
					        var sv = yield* this.getStateVector();
 | 
				
			||||||
        type: "sync step 2"
 | 
					        conn.send(sender, {
 | 
				
			||||||
        os: ops,
 | 
					          type: "sync step 2",
 | 
				
			||||||
        stateVector: sv
 | 
					          os: ops,
 | 
				
			||||||
      });
 | 
					          stateVector: sv
 | 
				
			||||||
      this.syncingClients.push(sender);
 | 
					 | 
				
			||||||
      setTimeout(()=>{
 | 
					 | 
				
			||||||
        this.syncingClients = this.syncingClients.filter(function(client){
 | 
					 | 
				
			||||||
          return client !== sender;
 | 
					 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        this.send(sender, {
 | 
					        conn.syncingClients.push(sender);
 | 
				
			||||||
          type: "sync done"
 | 
					        setTimeout(function(){
 | 
				
			||||||
        })
 | 
					          conn.syncingClients = conn.syncingClients.filter(function(cli){
 | 
				
			||||||
      }, this.syncingClientDuration);
 | 
					            return cli !== sender;
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          conn.send(sender, {
 | 
				
			||||||
 | 
					            type: "sync done"
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        }, conn.syncingClientDuration);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
    } else if (m.type === "sync step 2") {
 | 
					    } else if (m.type === "sync step 2") {
 | 
				
			||||||
      var ops = this.os.getOperations(m.stateVector);
 | 
					      let conn = this;
 | 
				
			||||||
      this.broadcast {
 | 
					      this.os.requestTransaction(function*(){
 | 
				
			||||||
        type: "update",
 | 
					        var ops = yield* this.getOperations(m.stateVector);
 | 
				
			||||||
        ops: ops
 | 
					        conn.broadcast({
 | 
				
			||||||
      }
 | 
					          type: "update",
 | 
				
			||||||
 | 
					          ops: ops
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
    } else if (m.type === "sync done") {
 | 
					    } else if (m.type === "sync done") {
 | 
				
			||||||
      this.connections[sender].isSynced = true;
 | 
					      this.connections[sender].isSynced = true;
 | 
				
			||||||
      this.findNextSyncTarget();
 | 
					      this.findNextSyncTarget();
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    } else if (m.type === "update") {
 | 
					    } else if (m.type === "update") {
 | 
				
			||||||
      for (var client of this.syncingClients) {
 | 
					      for (var client of this.syncingClients) {
 | 
				
			||||||
        this.send(client, m);
 | 
					        this.send(client, m);
 | 
				
			||||||
@ -157,16 +169,16 @@ class AbstractConnector {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    function parseObject (node) {
 | 
					    function parseObject (node) {
 | 
				
			||||||
      var json = {};
 | 
					      var json = {};
 | 
				
			||||||
      for (name in node.attrs) {
 | 
					      for (var attrName in node.attrs) {
 | 
				
			||||||
        var value = node.attrs[name];
 | 
					        var value = node.attrs[attrName];
 | 
				
			||||||
        var int = parseInt(value);
 | 
					        var int = parseInt(value);
 | 
				
			||||||
        if (isNaN(int) or (""+int) !== value){
 | 
					        if (isNaN(int) || ("" + int) !== value){
 | 
				
			||||||
          json[name] = value;
 | 
					          json[attrName] = value;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          json[name] = int;
 | 
					          json[attrName] = int;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      for (n in node.children){
 | 
					      for (var n in node.children){
 | 
				
			||||||
        var name = n.name;
 | 
					        var name = n.name;
 | 
				
			||||||
        if (n.getAttribute("isArray") === "true") {
 | 
					        if (n.getAttribute("isArray") === "true") {
 | 
				
			||||||
          json[name] = parseArray(n);
 | 
					          json[name] = parseArray(n);
 | 
				
			||||||
@ -176,7 +188,7 @@ class AbstractConnector {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return json;
 | 
					      return json;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    parseObject(node);
 | 
					    parseObject(m);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // encode message in xml
 | 
					  // encode message in xml
 | 
				
			||||||
  // we use string because Strophe only accepts an "xml-string"..
 | 
					  // we use string because Strophe only accepts an "xml-string"..
 | 
				
			||||||
@ -186,10 +198,10 @@ class AbstractConnector {
 | 
				
			|||||||
  // </y>
 | 
					  // </y>
 | 
				
			||||||
  // m - ltx element
 | 
					  // m - ltx element
 | 
				
			||||||
  // json - Object
 | 
					  // json - Object
 | 
				
			||||||
  encodeMessageToXml (m, json) {
 | 
					  encodeMessageToXml (msg, obj) {
 | 
				
			||||||
    // attributes is optional
 | 
					    // attributes is optional
 | 
				
			||||||
    function encodeObject (m, json) {
 | 
					    function encodeObject (m, json) {
 | 
				
			||||||
      for (name in json) {
 | 
					      for (var name in json) {
 | 
				
			||||||
        var value = json[name];
 | 
					        var value = json[name];
 | 
				
			||||||
        if (name == null) {
 | 
					        if (name == null) {
 | 
				
			||||||
          // nop
 | 
					          // nop
 | 
				
			||||||
@ -212,10 +224,10 @@ class AbstractConnector {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (json.constructor === Object) {
 | 
					    if (obj.constructor === Object) {
 | 
				
			||||||
      encodeObject(m.c("y", {xmlns:"http://y.ninja/connector-stanza"}), json);
 | 
					      encodeObject(msg.c("y", { xmlns: "http://y.ninja/connector-stanza" }), obj);
 | 
				
			||||||
    } else if (json.constructor === Array) {
 | 
					    } else if (obj.constructor === Array) {
 | 
				
			||||||
      encodeArray(m.c("y", {xmlns:"http://y.ninja/connector-stanza"}), json);
 | 
					      encodeArray(msg.c("y", { xmlns: "http://y.ninja/connector-stanza" }), obj);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      throw new Error("I can't encode this json!");
 | 
					      throw new Error("I can't encode this json!");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ class AbstractTransaction { //eslint-disable-line no-unused-vars
 | 
				
			|||||||
  constructor (store : OperationStore) {
 | 
					  constructor (store : OperationStore) {
 | 
				
			||||||
    this.store = store;
 | 
					    this.store = store;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // Throws if operation is not expected.
 | 
					  // returns false if operation is not expected.
 | 
				
			||||||
  *addOperation (op) {
 | 
					  *addOperation (op) {
 | 
				
			||||||
    var state = this.getState(op.id[0]);
 | 
					    var state = this.getState(op.id[0]);
 | 
				
			||||||
    if (op.id[1] === state.clock){
 | 
					    if (op.id[1] === state.clock){
 | 
				
			||||||
@ -25,7 +25,8 @@ type Listener = {
 | 
				
			|||||||
type Id = [string, number];
 | 
					type Id = [string, number];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AbstractOperationStore { //eslint-disable-line no-unused-vars
 | 
					class AbstractOperationStore { //eslint-disable-line no-unused-vars
 | 
				
			||||||
  constructor () {
 | 
					  constructor (y) {
 | 
				
			||||||
 | 
					    this.y = y;
 | 
				
			||||||
    this.parentListeners = {};
 | 
					    this.parentListeners = {};
 | 
				
			||||||
    this.parentListenersRequestPending = false;
 | 
					    this.parentListenersRequestPending = false;
 | 
				
			||||||
    this.parentListenersActivated = {};
 | 
					    this.parentListenersActivated = {};
 | 
				
			||||||
@ -46,6 +47,12 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars
 | 
				
			|||||||
      a property before you iterate over it!
 | 
					      a property before you iterate over it!
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  apply (ops) {
 | 
				
			||||||
 | 
					    for (var o of ops) {
 | 
				
			||||||
 | 
					      var required = Y.Struct[o.type].requiredOps(o);
 | 
				
			||||||
 | 
					      this.whenOperationsExist(required, Y.Struct[o.type].execute, o);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  // f is called as soon as every operation requested is available.
 | 
					  // f is called as soon as every operation requested is available.
 | 
				
			||||||
  // Note that Transaction can (and should) buffer requests.
 | 
					  // Note that Transaction can (and should) buffer requests.
 | 
				
			||||||
  whenOperationsExist (ids : Array<Id>, f : GeneratorFunction, args : Array<any>) {
 | 
					  whenOperationsExist (ids : Array<Id>, f : GeneratorFunction, args : Array<any>) {
 | 
				
			||||||
@ -134,15 +141,15 @@ class AbstractOperationStore { //eslint-disable-line no-unused-vars
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    this.parentListenersRequestPending = true;
 | 
					    this.parentListenersRequestPending = true;
 | 
				
			||||||
    var store = this;
 | 
					    var store = this;
 | 
				
			||||||
    this.requestTransaction(function*(myRequest){ // you can throw error on myRequest, then restart if you have to
 | 
					    this.requestTransaction(function*(){
 | 
				
			||||||
      store.parentListenersRequestPending = false;
 | 
					      store.parentListenersRequestPending = false;
 | 
				
			||||||
      var activatedOperations = store.parentListenersActivated;
 | 
					      var activatedOperations = store.parentListenersActivated;
 | 
				
			||||||
      store.parentListenersActivated = {};
 | 
					      store.parentListenersActivated = {};
 | 
				
			||||||
      for (var parent_id in activatedOperations){
 | 
					      for (var parentId in activatedOperations){
 | 
				
			||||||
        var parent = yield* this.getOperation(parent_id);
 | 
					        var parent = yield* this.getOperation(parentId);
 | 
				
			||||||
        Struct[parent.type].notifyObservers(activatedOperations[parent_id]);
 | 
					        Struct[parent.type].notifyObservers(activatedOperations[parentId]);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    })
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  removeParentListener (id, f) {
 | 
					  removeParentListener (id, f) {
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,7 @@ type IDBOpenDBRequest = Function;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
declare var indexedDB : Object;
 | 
					declare var indexedDB : Object;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
 | 
					Y.IndexedDB = (function(){ //eslint-disable-line no-unused-vars
 | 
				
			||||||
  class Transaction extends AbstractTransaction { //eslint-disable-line
 | 
					  class Transaction extends AbstractTransaction { //eslint-disable-line
 | 
				
			||||||
    transaction: IDBTransaction;
 | 
					    transaction: IDBTransaction;
 | 
				
			||||||
    sv: IDBObjectStore;
 | 
					    sv: IDBObjectStore;
 | 
				
			||||||
@ -108,9 +108,17 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
 | 
				
			|||||||
    namespace: string;
 | 
					    namespace: string;
 | 
				
			||||||
    ready: Promise;
 | 
					    ready: Promise;
 | 
				
			||||||
    whenReadyListeners: Array<Function>;
 | 
					    whenReadyListeners: Array<Function>;
 | 
				
			||||||
    constructor (namespace : string) {
 | 
					    constructor (y, opts) {
 | 
				
			||||||
      super();
 | 
					      super(y);
 | 
				
			||||||
      this.namespace = namespace;
 | 
					      if (opts == null) {
 | 
				
			||||||
 | 
					        opts = {};
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (opts.namespace != null || typeof opts.namespace !== "string") {
 | 
				
			||||||
 | 
					        throw new Error("IndexedDB: expect a string (opts.namespace)!");
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        this.namespace = opts.namespace;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      this.transactionQueue = {
 | 
					      this.transactionQueue = {
 | 
				
			||||||
        queue: [],
 | 
					        queue: [],
 | 
				
			||||||
        onRequest: null
 | 
					        onRequest: null
 | 
				
			||||||
@ -119,7 +127,7 @@ var IndexedDB = (function(){ //eslint-disable-line no-unused-vars
 | 
				
			|||||||
      var store = this;
 | 
					      var store = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var tGen = (function *transactionGen(){
 | 
					      var tGen = (function *transactionGen(){
 | 
				
			||||||
        store.db = yield indexedDB.open(namespace, 3);
 | 
					        store.db = yield indexedDB.open(opts.namespace, 3);
 | 
				
			||||||
        var transactionQueue = store.transactionQueue;
 | 
					        var transactionQueue = store.transactionQueue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var transaction = null;
 | 
					        var transaction = null;
 | 
				
			||||||
 | 
				
			|||||||
@ -2,28 +2,44 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Op is anything that we could get from the OperationStore.
 | 
					// Op is anything that we could get from the OperationStore.
 | 
				
			||||||
type Op = Object;
 | 
					type Op = Object;
 | 
				
			||||||
 | 
					type Id = [string, number];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type List = {
 | 
				
			||||||
 | 
					  id: Id,
 | 
				
			||||||
 | 
					  start: Insert,
 | 
				
			||||||
 | 
					  end: Insert
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Insert = {
 | 
				
			||||||
 | 
					  id: Id,
 | 
				
			||||||
 | 
					  left: Insert,
 | 
				
			||||||
 | 
					  right: Insert,
 | 
				
			||||||
 | 
					  origin: Insert,
 | 
				
			||||||
 | 
					  parent: List,
 | 
				
			||||||
 | 
					  content: any
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Struct = {
 | 
					var Struct = {
 | 
				
			||||||
  Operation: {  //eslint-disable-line no-unused-vars
 | 
					  Operation: {  //eslint-disable-line no-unused-vars
 | 
				
			||||||
    create: function*(op : Op, user : string) : Struct.Operation {
 | 
					    create: function*(op : Op) : Struct.Operation {
 | 
				
			||||||
 | 
					      var user = this.store.y.connector.userId;
 | 
				
			||||||
      var state = yield* this.getState(user);
 | 
					      var state = yield* this.getState(user);
 | 
				
			||||||
      op.id = [user, state.clock];
 | 
					      op.id = [user, state.clock];
 | 
				
			||||||
      return yield* this.addOperation(op);
 | 
					      return yield* this.addOperation(op);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  Insert: {
 | 
					  Insert: {
 | 
				
			||||||
    create: function*( op : Op,
 | 
					    create: function*( op: Op,
 | 
				
			||||||
                      user : string,
 | 
					                      content: any,
 | 
				
			||||||
                      content : any,
 | 
					                      left: Insert,
 | 
				
			||||||
                      left : Struct.Insert,
 | 
					                      right: Insert,
 | 
				
			||||||
                      right : Struct.Insert,
 | 
					                      parent: List) : Insert {
 | 
				
			||||||
                      parent : Struct.List) : Insert {
 | 
					 | 
				
			||||||
      op.left = left ? left.id : null;
 | 
					      op.left = left ? left.id : null;
 | 
				
			||||||
      op.origin = op.left;
 | 
					      op.origin = op.left;
 | 
				
			||||||
      op.right = right ? right.id : null;
 | 
					      op.right = right ? right.id : null;
 | 
				
			||||||
      op.parent = parent.id;
 | 
					      op.parent = parent.id;
 | 
				
			||||||
      op.struct = "Insert";
 | 
					      op.struct = "Insert";
 | 
				
			||||||
      yield* Struct.Operation.create.call(this, op, user);
 | 
					      yield* Struct.Operation.create.call(this, op);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (left != null) {
 | 
					      if (left != null) {
 | 
				
			||||||
        left.right = op.id;
 | 
					        left.right = op.id;
 | 
				
			||||||
@ -69,8 +85,8 @@ var Struct = {
 | 
				
			|||||||
    #         $this insert_position is to the left of $o (forever!)
 | 
					    #         $this insert_position is to the left of $o (forever!)
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
    execute: function*(op){
 | 
					    execute: function*(op){
 | 
				
			||||||
      var distance_to_origin = yield* Struct.Insert.getDistanceToOrigin(op); // most cases: 0 (starts from 0)
 | 
					      var distanceToOrigin = yield* Struct.Insert.getDistanceToOrigin(op); // most cases: 0 (starts from 0)
 | 
				
			||||||
      var i = distance_to_origin; // loop counter
 | 
					      var i = distanceToOrigin; // loop counter
 | 
				
			||||||
      var o = yield* this.getOperation(this.left);
 | 
					      var o = yield* this.getOperation(this.left);
 | 
				
			||||||
      o = yield* this.getOperation(o.right);
 | 
					      o = yield* this.getOperation(o.right);
 | 
				
			||||||
      var tmp;
 | 
					      var tmp;
 | 
				
			||||||
@ -80,13 +96,13 @@ var Struct = {
 | 
				
			|||||||
            // case 1
 | 
					            // case 1
 | 
				
			||||||
            if (o.id[0] < op.id[0]) {
 | 
					            if (o.id[0] < op.id[0]) {
 | 
				
			||||||
              op.left = o;
 | 
					              op.left = o;
 | 
				
			||||||
              distance_to_origin = i + 1;
 | 
					              distanceToOrigin = i + 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          } else if ((tmp = Struct.Insert.getDistanceToOrigin(o)) < i) {
 | 
					          } else if ((tmp = Struct.Insert.getDistanceToOrigin(o)) < i) {
 | 
				
			||||||
            // case 2
 | 
					            // case 2
 | 
				
			||||||
            if (i - distance_to_origin <= tmp) {
 | 
					            if (i - distanceToOrigin <= tmp) {
 | 
				
			||||||
              op.left = o;
 | 
					              op.left = o;
 | 
				
			||||||
              distance_to_origin = i+1;
 | 
					              distanceToOrigin = i + 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@ -94,7 +110,7 @@ var Struct = {
 | 
				
			|||||||
          i++;
 | 
					          i++;
 | 
				
			||||||
          o = yield* this.getOperation(o.next_cl);
 | 
					          o = yield* this.getOperation(o.next_cl);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          break
 | 
					          break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      // reconnect..
 | 
					      // reconnect..
 | 
				
			||||||
@ -110,12 +126,11 @@ var Struct = {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  List: {
 | 
					  List: {
 | 
				
			||||||
    create: function*( op : Op,
 | 
					    create: function*( op : Op){
 | 
				
			||||||
                       user : string){
 | 
					 | 
				
			||||||
      op.start = null;
 | 
					      op.start = null;
 | 
				
			||||||
      op.end = null;
 | 
					      op.end = null;
 | 
				
			||||||
      op.struct = "List";
 | 
					      op.struct = "List";
 | 
				
			||||||
      return yield* Struct.Operation.create.call(this, op, user);
 | 
					      return yield* Struct.Operation.create.call(this, op);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    requiredOps: function(op, ids){
 | 
					    requiredOps: function(op, ids){
 | 
				
			||||||
      if (op.start != null) {
 | 
					      if (op.start != null) {
 | 
				
			||||||
@ -126,12 +141,12 @@ var Struct = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return ids;
 | 
					      return ids;
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    execute: function* (op) {
 | 
					    execute: function* () {
 | 
				
			||||||
      // nop
 | 
					      // nop
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    ref: function* (op : Op, pos : number) : Insert {
 | 
					    ref: function* (op : Op, pos : number) : Insert {
 | 
				
			||||||
      var o = op.start;
 | 
					      var o = op.start;
 | 
				
			||||||
      while ( pos !== 0 || o == null) {
 | 
					      while ( pos !== 0 || o != null) {
 | 
				
			||||||
        o = (yield* this.getOperation(o)).right;
 | 
					        o = (yield* this.getOperation(o)).right;
 | 
				
			||||||
        pos--;
 | 
					        pos--;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -140,19 +155,18 @@ var Struct = {
 | 
				
			|||||||
    map: function* (o : Op, f : Function) : Array<any> {
 | 
					    map: function* (o : Op, f : Function) : Array<any> {
 | 
				
			||||||
      o = o.start;
 | 
					      o = o.start;
 | 
				
			||||||
      var res = [];
 | 
					      var res = [];
 | 
				
			||||||
      while ( pos !== 0 || o == null) {
 | 
					      while ( o != null) {
 | 
				
			||||||
        var operation = yield* this.getOperation(o);
 | 
					        var operation = yield* this.getOperation(o);
 | 
				
			||||||
        res.push(f(operation.content));
 | 
					        res.push(f(operation.content));
 | 
				
			||||||
        o = operation.right;
 | 
					        o = operation.right;
 | 
				
			||||||
        pos--;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return res;
 | 
					      return res;
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    insert: function* (op, pos : number, contents : Array<any>) {
 | 
					    insert: function* (op, pos : number, contents : Array<any>) {
 | 
				
			||||||
      var o = yield* Struct.List.ref.call(this, op, pos);
 | 
					      var o = yield* Struct.List.ref.call(this, op, pos);
 | 
				
			||||||
      var o_end = yield* this.getOperation(o.right);
 | 
					      var or = yield* this.getOperation(o.right);
 | 
				
			||||||
      for (var content of contents) {
 | 
					      for (var content of contents) {
 | 
				
			||||||
        o = yield* Struct.Insert.create.call(this, {}, user, content, o, o_end, op);
 | 
					        o = yield* Struct.Insert.create.call(this, {}, content, o, or, op);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								src/y.js
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/y.js
									
									
									
									
									
								
							@ -1,6 +1,11 @@
 | 
				
			|||||||
/* @flow */
 | 
					/* @flow */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Y (opts) { //eslint-disable-line no-unused-vars
 | 
					class Y { //eslint-disable-line no-unused-vars
 | 
				
			||||||
  var connector = opts.connector;
 | 
					  constructor (opts) {
 | 
				
			||||||
  Y.Connectors[connector.name]();
 | 
					    this.connector = new Y[opts.connector.name](opts.connector);
 | 
				
			||||||
 | 
					    this.db = new Y[opts.db.name](this, opts.db);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  transact (generator) {
 | 
				
			||||||
 | 
					    this.db.requestTransaction(generator);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user