From 83a42271ad03901f18f16515c6f9e1953c2a9226 Mon Sep 17 00:00:00 2001
From: Kevin Jahns <kevin.jahns@rwth-aachen.de>
Date: Wed, 23 Mar 2016 14:33:51 +0100
Subject: [PATCH] fix remaining memory leaks

---
 README.md          | 10 +++++++++-
 package.json       |  2 +-
 src/Connector.js   | 10 +++++++---
 src/SpecHelper.js  |  4 ++++
 src/Transaction.js | 33 +++++++++++----------------------
 5 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/README.md b/README.md
index 7c79014d..44bfba75 100644
--- a/README.md
+++ b/README.md
@@ -177,8 +177,16 @@ If you want to see an issue fixed, please subscribe to the thread (or remind me
 
 ## Changelog
 
+### 10.0.0
+
+* Support for more complex types (a type can be a composition of several types)
+* Fixes several memory leaks
+
 ### 9.0.0
-There were several rolling updates from 0.6 to 0.8. We'll now follow the semver versioning scheme. This is all what this jump from 0.8 to 9.0 is about.
+There were several rolling updates from 0.6 to 0.8. We consider Yjs stable since a long time, 
+and intend to continue stable releases. From this release forward y-* modules will implement peer-dependencies for npm, and dependencies for bower.
+Furthermore, incompatible yjs instances will now throw errors when syncing - this feature was influenced by #48. The versioning jump was influenced by react (see [here](https://facebook.github.io/react/blog/2016/02/19/new-versioning-scheme.html))
+
 
 ### 0.6.0
 This is a complete rewrite of the 0.5 version of Yjs. Since Yjs 0.6.0 it is possible to work asynchronously on a persistent database, which enables offline support.
diff --git a/package.json b/package.json
index 919ad4b6..f64c4085 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "yjs",
-  "version": "9.1.0",
+  "version": "10.0.0",
   "description": "A framework for real-time p2p shared editing on arbitrary complex data types",
   "main": "./src/y.js",
   "scripts": {
diff --git a/src/Connector.js b/src/Connector.js
index 00c74e89..a8fb9a40 100644
--- a/src/Connector.js
+++ b/src/Connector.js
@@ -19,6 +19,8 @@ module.exports = function (Y/* :any */) {
     userId: UserId;
     send: Function;
     broadcast: Function;
+    broadcastOpBuffer: Array<Operation>;
+    protocolVersion: number;
     */
     /*
       opts contains the following information:
@@ -51,7 +53,7 @@ module.exports = function (Y/* :any */) {
       this.broadcastedHB = false
       this.syncStep2 = Promise.resolve()
       this.broadcastOpBuffer = []
-      this.protocolVersion = 8
+      this.protocolVersion = 10
     }
     reconnect () {
     }
@@ -150,7 +152,8 @@ module.exports = function (Y/* :any */) {
           conn.send(syncUser, {
             type: 'sync step 1',
             stateSet: stateSet,
-            deleteSet: deleteSet
+            deleteSet: deleteSet,
+            protocolVersion: conn.protocolVersion
           })
         })
       } else {
@@ -234,7 +237,8 @@ module.exports = function (Y/* :any */) {
             type: 'sync step 2',
             os: ops,
             stateSet: currentStateSet,
-            deleteSet: ds
+            deleteSet: ds,
+            protocolVersion: this.protocolVersion
           })
           if (this.forwardToSyncingClients) {
             conn.syncingClients.push(sender)
diff --git a/src/SpecHelper.js b/src/SpecHelper.js
index 72435424..02f4e32d 100644
--- a/src/SpecHelper.js
+++ b/src/SpecHelper.js
@@ -182,6 +182,10 @@ g.compareAllUsers = async(function * compareAllUsers (users) {
   for (var uid = 0; uid < users.length; uid++) {
     var u = users[uid]
     u.db.requestTransaction(function * () {
+      var sv = yield* this.getStateVector()
+      for (var s of sv) {
+        yield* this.updateState(s.user)
+      }
       // compare deleted ops against deleteStore
       yield* this.os.iterate(this, null, null, function * (o) {
         if (o.deleted === true) {
diff --git a/src/Transaction.js b/src/Transaction.js
index b8ef6a46..3a5344a7 100644
--- a/src/Transaction.js
+++ b/src/Transaction.js
@@ -156,30 +156,19 @@ module.exports = function (Y/* :any */) {
     * deleteList (start) {
       while (start != null) {
         start = yield* this.getOperation(start)
-        if (start.gc) {
-          break
-        } else {
+        if (!start.gc) {
           start.gc = true
           start.deleted = true
           yield* this.setOperation(start)
           yield* this.markDeleted(start.id, 1)
           if (start.opContent != null) {
             yield* this.deleteOperation(start.opContent)
-            /*
-            yield* this.deleteOperation(start.opContent)
-            var opContent = yield* this.getOperation(start.opContent)
-            opContent.gc = true
-            yield* this.setOperation(opContent)
-            if (this.store.y.connector.isSynced) {            
-              this.store.gc1.push(opContent.id)
-            }
-            */
           }
           if (this.store.y.connector.isSynced){
             this.store.gc1.push(start.id)
           }
-          start = start.right
         }
+        start = start.right
       }
     }
 
@@ -561,15 +550,15 @@ module.exports = function (Y/* :any */) {
             // so we have to set right here
             yield* this.setOperation(right)
           }
-          // o may originate in another operation.
-          // Since o is deleted, we have to reset o.origin's `originOf` property
-          if (o.origin != null) {
-            var origin = yield* this.getOperation(o.origin)
-            origin.originOf = origin.originOf.filter(function (_id) {
-              return !Y.utils.compareIds(id, _id)
-            })
-            yield* this.setOperation(origin)
-          }
+        }
+        // o may originate in another operation.
+        // Since o is deleted, we have to reset o.origin's `originOf` property
+        if (o.origin != null) {
+          var origin = yield* this.getOperation(o.origin)
+          origin.originOf = origin.originOf.filter(function (_id) {
+            return !Y.utils.compareIds(id, _id)
+          })
+          yield* this.setOperation(origin)
         }
         var parent
         if (o.parent != null){ 
-- 
GitLab