diff --git a/src/Connector.js b/src/Connector.js index 38b08231..3033d0d6 100644 --- a/src/Connector.js +++ b/src/Connector.js @@ -42,6 +42,11 @@ export default function extendConnector (Y/* :any */) { if (opts.generateUserId !== false) { this.setUserId(Y.utils.generateUserId()) } + if (opts.maxBufferLength == null) { + this.maxBufferLength = -1 + } else { + this.maxBufferLength = opts.maxBufferLength + } } reconnect () { @@ -197,14 +202,19 @@ export default function extendConnector (Y/* :any */) { encoder.writeVarString(self.opts.room) encoder.writeVarString('update') let ops = self.broadcastOpBuffer - self.broadcastOpBuffer = [] let length = ops.length - encoder.writeUint32(length) - for (var i = 0; i < length; i++) { + let encoderPosLen = encoder.pos + encoder.writeUint32(0) + for (var i = 0; i < length && (self.maxBufferLength < 0 || encoder.length < self.maxBufferLength); i++) { let op = ops[i] Y.Struct[op.struct].binaryEncode(encoder, op) } + encoder.setUint32(encoderPosLen, i) + self.broadcastOpBuffer = ops.slice(i) self.broadcast(encoder.createBuffer()) + if (i !== length) { + setTimeout(broadcastOperations, 100) + } } } if (this.broadcastOpBuffer.length === 0) { diff --git a/src/Encoding.js b/src/Encoding.js index bceb3431..6bbbc292 100644 --- a/src/Encoding.js +++ b/src/Encoding.js @@ -8,6 +8,10 @@ export class BinaryEncoder { this.data = [] } + get length () { + return this.data.length + } + get pos () { return this.data.length }