diff --git a/src/Connector.js b/src/Connector.js index cde7f81f..3ad0f68e 100644 --- a/src/Connector.js +++ b/src/Connector.js @@ -333,6 +333,7 @@ export default function extendConnector (Y/* :any */) { }) this.syncStep2 = defer.promise let m /* :MessageSyncStep2 */ = message + // apply operations first db.requestTransaction(function * () { yield * this.applyDeleteSet(m.deleteSet) if (m.osUntransformed != null) { @@ -340,27 +341,15 @@ export default function extendConnector (Y/* :any */) { } else { this.store.apply(m.os) } - /* - * This just sends the complete hb after some time - * Mostly for debugging.. - * - db.requestTransaction(function * () { - var ops = yield* this.getOperations(m.stateSet) - if (ops.length > 0) { - if (!broadcastHB) { // TODO: consider to broadcast here.. - conn.send(sender, { - type: 'update', - ops: ops - }) - } else { - // broadcast only once! - conn.broadcastOps(ops) - } - } - }) - */ defer.resolve() }) + /* then apply ds + db.whenTransactionsFinished().then(() => { + db.requestTransaction(function * () { + yield * this.applyDeleteSet(m.deleteSet) + }) + defer.resolve() + })*/ return this.syncStep2 } else if (message.type === 'sync done') { var self = this diff --git a/src/Database.js b/src/Database.js index e7c60922..a6c15fbd 100644 --- a/src/Database.js +++ b/src/Database.js @@ -80,6 +80,10 @@ export default function extendDatabase (Y /* :any */) { function garbageCollect () { return os.whenTransactionsFinished().then(function () { if (os.gcTimeout > 0 && (os.gc1.length > 0 || os.gc2.length > 0)) { + // debug + if (os.y.connector.isSynced === false) { + debugger + } if (!os.y.connector.isSynced) { console.warn('gc should be empty when not synced!') } diff --git a/src/Transaction.js b/src/Transaction.js index aad43054..e58e348c 100644 --- a/src/Transaction.js +++ b/src/Transaction.js @@ -996,6 +996,7 @@ export default function extendTransaction (Y) { op = Y.Struct[op.struct].encode(o) op.right = newright if (missingOrigins.length > 0) { + debugger console.log('This should not happen .. :( please report this') } missingOrigins = [op] diff --git a/tests-lib/helper.js b/tests-lib/helper.js index a4f437be..fa13f102 100644 --- a/tests-lib/helper.js +++ b/tests-lib/helper.js @@ -12,23 +12,34 @@ export let Y = _Y Y.extend(yMemory, yArray, yMap, yTest) -export async function garbageCollectAllUsers (t, users) { +export async function garbageCollectUsers (t, users) { await flushAll(t, users) await Promise.all(users.map(u => u.db.emptyGarbageCollector())) } export async function compareUsers (t, users) { - var unsynced = users.filter(u => !u.connector.isSynced) - unsynced.forEach(u => u.reconnect()) + // disconnect all except user 0 + await Promise.all(users.slice(1).map(async u => + u.disconnect() + )) + if (users[0].connector.testRoom == null) { + await wait(100) + } + // reconnect all + await Promise.all(users.map(u => u.reconnect())) if (users[0].connector.testRoom != null) { // flush for sync if test-connector - await users[0].connector.testRoom.flushAll(users) } - await Promise.all(unsynced.map(u => { - return new Promise(function (resolve) { + if (users[0].connector.testRoom == null) { + await wait(100) + } + await users[0].connector.testRoom.flushAll(users) + await Promise.all(users.map(u => + new Promise(function (resolve) { u.connector.whenSynced(resolve) }) - })) + )) + await flushAll(t, users) // types must be equal before garbage collect var userTypeContents = users.map(u => u.share.array._content.map(c => c.val || JSON.stringify(c.type))) @@ -37,9 +48,10 @@ export async function compareUsers (t, users) { await u.db.garbageCollect() await u.db.garbageCollect() u.db.requestTransaction(function * () { - data.os = yield * this.getOperationsUntransformed() - data.os = data.os.untransformed.map((op) => { - return Y.Struct[op.struct].encode(op) + var os = yield * this.getOperationsUntransformed() + data.os = os.untransformed.map((op) => { + op = Y.Struct[op.struct].encode(op) + delete op.origin }) data.ds = yield * this.getDeleteSet() data.ss = yield * this.getStateSet()