diff --git a/src/Connectors/Test.js b/src/Connectors/Test.js index 1a04b330..8c14b047 100644 --- a/src/Connectors/Test.js +++ b/src/Connectors/Test.js @@ -14,7 +14,7 @@ module.exports = function (Y) { }, addUser: function (connector) { this.users[connector.userId] = connector - this.buffers[connector.userId] = [] + this.buffers[connector.userId] = {} for (var uname in this.users) { if (uname !== connector.userId) { var u = this.users[uname] @@ -32,14 +32,27 @@ module.exports = function (Y) { }, flushOne: function flushOne () { var bufs = [] - for (var i in globalRoom.buffers) { - if (globalRoom.buffers[i].length > 0) { - bufs.push(i) + for (var receiver in globalRoom.buffers) { + let buff = globalRoom.buffers[receiver] + var push = false + for (let sender in buff) { + if (buff[sender].length > 0) { + push = true + break + } + } + if (push) { + bufs.push(receiver) } } if (bufs.length > 0) { var userId = getRandom(bufs) - var m = globalRoom.buffers[userId].shift() + let buff = globalRoom.buffers[userId] + let sender = getRandom(Object.keys(buff)) + var m = buff[sender].shift() + if (buff[sender].length === 0) { + delete buff[sender] + } var user = globalRoom.users[userId] user.receiveMessage(m[0], m[1]) return user.y.db.whenTransactionsFinished() @@ -99,12 +112,19 @@ module.exports = function (Y) { send (userId, message) { var buffer = globalRoom.buffers[userId] if (buffer != null) { - buffer.push(JSON.parse(JSON.stringify([this.userId, message]))) + if (buffer[this.userId] == null) { + buffer[this.userId] = [] + } + buffer[this.userId].push(JSON.parse(JSON.stringify([this.userId, message]))) } } broadcast (message) { for (var key in globalRoom.buffers) { - globalRoom.buffers[key].push(JSON.parse(JSON.stringify([this.userId, message]))) + var buff = globalRoom.buffers[key] + if (buff[this.userId] == null) { + buff[this.userId] = [] + } + buff[this.userId].push(JSON.parse(JSON.stringify([this.userId, message]))) } } isDisconnected () { @@ -127,8 +147,13 @@ module.exports = function (Y) { flush () { var self = this return async(function * () { - while (globalRoom.buffers[self.userId].length > 0) { - var m = globalRoom.buffers[self.userId].shift() + var buff = globalRoom.buffers[self.userId] + while (Object.keys(buff).length > 0) { + var sender = getRandom(Object.keys(buff)) + var m = buff[sender].shift() + if (buff[sender].length === 0) { + delete buff[sender] + } this.receiveMessage(m[0], m[1]) } yield self.whenTransactionsFinished() diff --git a/src/SpecHelper.js b/src/SpecHelper.js index 682bf99e..3a1ac1c9 100644 --- a/src/SpecHelper.js +++ b/src/SpecHelper.js @@ -60,11 +60,7 @@ function getRandom (o) { if (o instanceof Array) { return o[Math.floor(Math.random() * o.length)] } else if (o.constructor === Object) { - var ks = [] - for (var key in o) { - ks.push(key) - } - return o[getRandom(ks)] + return o[getRandom(Object.keys(o))] } } g.getRandom = getRandom @@ -79,7 +75,7 @@ g.getRandomNumber = getRandomNumber function getRandomString () { var tokens = 'abcdefäö' // ü\n\n\n\n\n\n\n' - return tokens[getRandomNumber(tokens.length - 1)] + return tokens[getRandomNumber(tokens.length)] } g.getRandomString = getRandomString diff --git a/src/Transaction.js b/src/Transaction.js index 1bb4ea03..10132855 100644 --- a/src/Transaction.js +++ b/src/Transaction.js @@ -409,7 +409,7 @@ module.exports = function (Y/* :any */) { if (parentDeleted) { op.gc = true if (!op.deleted) { - yield* this.markDeleted(op.id, delLength) + yield* this.markDeleted(op.id, opLength) op.deleted = true if (op.opContent != null) { yield* this.deleteOperation(op.opContent)