binary encoding bugfixes & export BinaryEncoder + BinaryDecoder

This commit is contained in:
Kevin Jahns 2017-07-24 15:37:04 +02:00
parent c97130abc4
commit eb4fb3a225
4 changed files with 19 additions and 9 deletions

View File

@ -12,6 +12,7 @@ export default function extendConnector (Y/* :any */) {
if (opts == null) { if (opts == null) {
opts = {} opts = {}
} }
this.opts = opts
// Prefer to receive untransformed operations. This does only work if // Prefer to receive untransformed operations. This does only work if
// this client receives operations from only one other client. // this client receives operations from only one other client.
// In particular, this does not work with y-webrtc. // In particular, this does not work with y-webrtc.
@ -152,6 +153,7 @@ export default function extendConnector (Y/* :any */) {
this.currentSyncTarget = syncUser this.currentSyncTarget = syncUser
this.y.db.requestTransaction(function * () { this.y.db.requestTransaction(function * () {
let encoder = new BinaryEncoder() let encoder = new BinaryEncoder()
encoder.writeVarString(conn.opts.room || '')
encoder.writeVarString('sync step 1') encoder.writeVarString('sync step 1')
encoder.writeVarString(conn.authInfo || '') encoder.writeVarString(conn.authInfo || '')
encoder.writeVarUint(conn.protocolVersion) encoder.writeVarUint(conn.protocolVersion)
@ -197,6 +199,7 @@ export default function extendConnector (Y/* :any */) {
function broadcastOperations () { function broadcastOperations () {
if (self.broadcastOpBuffer.length > 0) { if (self.broadcastOpBuffer.length > 0) {
let encoder = new BinaryEncoder() let encoder = new BinaryEncoder()
encoder.writeVarString(self.opts.room)
encoder.writeVarString('update') encoder.writeVarString('update')
let ops = self.broadcastOpBuffer let ops = self.broadcastOpBuffer
self.broadcastOpBuffer = [] self.broadcastOpBuffer = []
@ -225,6 +228,8 @@ export default function extendConnector (Y/* :any */) {
} }
let decoder = new BinaryDecoder(buffer) let decoder = new BinaryDecoder(buffer)
let encoder = new BinaryEncoder() let encoder = new BinaryEncoder()
let roomname = decoder.readVarString() // read room name
encoder.writeVarString(roomname)
let messageType = decoder.readVarString() let messageType = decoder.readVarString()
let senderConn = this.connections.get(sender) let senderConn = this.connections.get(sender)

View File

@ -4,6 +4,7 @@ import { BinaryDecoder } from './Encoding.js'
export function formatYjsMessage (buffer) { export function formatYjsMessage (buffer) {
let decoder = new BinaryDecoder(buffer) let decoder = new BinaryDecoder(buffer)
decoder.readVarString() // read roomname
let type = decoder.readVarString() let type = decoder.readVarString()
let strBuilder = [] let strBuilder = []
strBuilder.push('\n === ' + type + ' ===\n') strBuilder.push('\n === ' + type + ' ===\n')
@ -108,7 +109,7 @@ export function logSS (decoder, strBuilder) {
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
let user = decoder.readVarUint() let user = decoder.readVarUint()
let clock = decoder.readVarUint() let clock = decoder.readVarUint()
strBuilder.push(` - ${user}: ${clock}`) strBuilder.push(` ${user}: ${clock}\n`)
} }
} }

View File

@ -1061,8 +1061,8 @@ export default function extendTransaction (Y) {
let ss = new Map() let ss = new Map()
let ssLength = decoder.readUint32() let ssLength = decoder.readUint32()
for (let i = 0; i < ssLength; i++) { for (let i = 0; i < ssLength; i++) {
let user = decoder.readUint32() let user = decoder.readVarUint()
let clock = decoder.readUint32() let clock = decoder.readVarUint()
ss.set(user, clock) ss.set(user, clock)
} }
let ops = yield * this.getOperations(ss) let ops = yield * this.getOperations(ss)
@ -1093,7 +1093,7 @@ export default function extendTransaction (Y) {
* applyOperationsUntransformed (decoder) { * applyOperationsUntransformed (decoder) {
let len = decoder.readUint32() let len = decoder.readUint32()
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
let op = decoder.readOperation() let op = Y.Struct.binaryDecodeOperation(decoder)
yield * this.os.put(op) yield * this.os.put(op)
} }
yield * this.os.iterate(this, null, null, function * (op) { yield * this.os.iterate(this, null, null, function * (op) {

View File

@ -1,4 +1,5 @@
/* global crypto */
import { BinaryDecoder, BinaryEncoder } from './Encoding.js'
/* /*
EventHandler is an helper class for constructing custom types. EventHandler is an helper class for constructing custom types.
@ -24,7 +25,10 @@
*/ */
export default function Utils (Y) { export default function Utils (Y) {
Y.utils = {} Y.utils = {
BinaryDecoder: BinaryDecoder,
BinaryEncoder: BinaryEncoder
}
Y.utils.bubbleEvent = function (type, event) { Y.utils.bubbleEvent = function (type, event) {
type.eventHandler.callEventListeners(event) type.eventHandler.callEventListeners(event)
@ -821,17 +825,17 @@ export default function Utils (Y) {
Y.utils.createSmallLookupBuffer = createSmallLookupBuffer Y.utils.createSmallLookupBuffer = createSmallLookupBuffer
function generateUserId () { function generateUserId () {
if (crypto.getRandomValue != null) { if (typeof crypto !== 'undefined' && crypto.getRandomValue != null) {
// browser // browser
let arr = new Uint32Array(1) let arr = new Uint32Array(1)
crypto.getRandomValues(arr) crypto.getRandomValues(arr)
return arr[0] return arr[0]
} else if (crypto.randomBytes != null) { } else if (typeof crypto !== 'undefined' && crypto.randomBytes != null) {
// node // node
let buf = crypto.randomBytes(4) let buf = crypto.randomBytes(4)
return new Uint32Array(buf.buffer)[0] return new Uint32Array(buf.buffer)[0]
} else { } else {
Math.ceil(Math.random() * 0xFFFFFFFF) return Math.ceil(Math.random() * 0xFFFFFFFF)
} }
} }
Y.utils.generateUserId = generateUserId Y.utils.generateUserId = generateUserId