diff --git a/src/Connector.js b/src/Connector.js index 3faee8b8..dbf85047 100644 --- a/src/Connector.js +++ b/src/Connector.js @@ -140,8 +140,8 @@ export default class AbstractConnector { if (!(buffer instanceof ArrayBuffer || buffer instanceof Uint8Array)) { throw new Error('Expected Message to be an ArrayBuffer or Uint8Array - don\'t use this method to send custom messages') } - this.log('%s: Send \'%y\' to %s', y.userID, buffer, uid) - this.logMessage('Message: %Y', [y, buffer]) + this.log('User%s to User%s: Send \'%y\'', y.userID, uid, buffer) + this.logMessage('User%s to User%s: Send %Y', y.userID, uid, [y, buffer]) } broadcast (buffer) { @@ -149,8 +149,8 @@ export default class AbstractConnector { if (!(buffer instanceof ArrayBuffer || buffer instanceof Uint8Array)) { throw new Error('Expected Message to be an ArrayBuffer or Uint8Array - don\'t use this method to send custom messages') } - this.log('%s: Broadcast \'%y\'', y.userID, buffer) - this.logMessage('Message: %Y', [y, buffer]) + this.log('User%s: Broadcast \'%y\'', y.userID, buffer) + this.logMessage('User%s: Broadcast: %Y', y.userID, [y, buffer]) } /* @@ -216,8 +216,8 @@ export default class AbstractConnector { encoder.writeVarString(roomname) let messageType = decoder.readVarString() let senderConn = this.connections.get(sender) - this.log('%s: Receive \'%s\' from %s', userID, messageType, sender) - this.logMessage('Message: %Y', [y, buffer]) + this.log('User%s from User%s: Receive \'%s\'', userID, sender, messageType) + this.logMessage('User%s from User%s: Receive %Y', userID, sender, [y, buffer]) if (senderConn == null && !skipAuth) { throw new Error('Received message from unknown peer!') } diff --git a/src/MessageHandler/integrateRemoteStructs.js b/src/MessageHandler/integrateRemoteStructs.js index d3246cd6..074c6b3b 100644 --- a/src/MessageHandler/integrateRemoteStructs.js +++ b/src/MessageHandler/integrateRemoteStructs.js @@ -1,6 +1,7 @@ import { getStruct } from '../Util/structReferences.js' import BinaryDecoder from '../Binary/Decoder.js' import Delete from '../Struct/Delete.js' +import { logID } from './messageToString.js' class MissingEntry { constructor (decoder, missing, struct) { @@ -17,7 +18,7 @@ class MissingEntry { */ function _integrateRemoteStructHelper (y, struct) { struct._integrate(y) - if (!(struct instanceof Delete)) { + if (struct.constructor !== Delete) { let msu = y._missingStructs.get(struct._id.user) if (msu != null) { let len = struct._length @@ -46,11 +47,10 @@ export function stringifyStructs (y, decoder, strBuilder) { let Constr = getStruct(reference) let struct = new Constr() let missing = struct._fromBinary(y, decoder) - let logMessage = struct._logString() + let logMessage = ' ' + struct._logString() if (missing.length > 0) { - logMessage += missing.map(id => `ID (user: ${id.user}, clock: ${id.clock})`).join(', ') + logMessage += ' .. missing: ' + missing.map(logID).join(', ') } - logMessage += '\n' strBuilder.push(logMessage) } } diff --git a/src/MessageHandler/messageToString.js b/src/MessageHandler/messageToString.js index fa4ff5a3..82045d2e 100644 --- a/src/MessageHandler/messageToString.js +++ b/src/MessageHandler/messageToString.js @@ -2,13 +2,16 @@ import BinaryDecoder from '../Binary/Decoder.js' import { stringifyStructs } from './integrateRemoteStructs.js' import { stringifySyncStep1 } from './syncStep1.js' import { stringifySyncStep2 } from './syncStep2.js' +import ID from '../Util/ID.js' +import RootID from '../Util/RootID.js' +import Y from '../Y.js' export function messageToString ([y, buffer]) { let decoder = new BinaryDecoder(buffer) decoder.readVarString() // read roomname let type = decoder.readVarString() let strBuilder = [] - strBuilder.push('\n === ' + type + ' ===\n') + strBuilder.push('\n === ' + type + ' ===') if (type === 'update') { stringifyStructs(y, decoder, strBuilder) } else if (type === 'sync step 1') { @@ -26,3 +29,20 @@ export function messageToRoomname (buffer) { decoder.readVarString() // roomname return decoder.readVarString() // messageType } + +export function logID (id) { + if (id !== null && id._id != null) { + id = id._id + } + if (id === null) { + return '()' + } else if (id instanceof ID) { + return `(${id.user},${id.clock})` + } else if (id instanceof RootID) { + return `(${id.name},${id.type})` + } else if (id.constructor === Y) { + return `y` + } else { + throw new Error('This is not a valid ID!') + } +} diff --git a/src/MessageHandler/syncStep1.js b/src/MessageHandler/syncStep1.js index 7908eeea..3992862a 100644 --- a/src/MessageHandler/syncStep1.js +++ b/src/MessageHandler/syncStep1.js @@ -7,18 +7,17 @@ import { RootFakeUserID } from '../Util/RootID.js' export function stringifySyncStep1 (y, decoder, strBuilder) { let auth = decoder.readVarString() let protocolVersion = decoder.readVarUint() - strBuilder.push(` - - auth: "${auth}" - - protocolVersion: ${protocolVersion} -`) + strBuilder.push(` - auth: "${auth}"`) + strBuilder.push(` - protocolVersion: ${protocolVersion}`) // write SS - strBuilder.push(' == SS: \n') + let ssBuilder = [] let len = decoder.readUint32() for (let i = 0; i < len; i++) { let user = decoder.readVarUint() let clock = decoder.readVarUint() - strBuilder.push(` ${user}: ${clock}\n`) + ssBuilder.push(`(${user}:${clock})`) } + strBuilder.push(' == SS: ' + ssBuilder.join(',')) } export function sendSyncStep1 (connector, syncUser) { diff --git a/src/MessageHandler/syncStep2.js b/src/MessageHandler/syncStep2.js index 713cf243..eda109de 100644 --- a/src/MessageHandler/syncStep2.js +++ b/src/MessageHandler/syncStep2.js @@ -2,10 +2,9 @@ import { stringifyStructs, integrateRemoteStructs } from './integrateRemoteStruc import { readDeleteSet } from './deleteSet.js' export function stringifySyncStep2 (y, decoder, strBuilder) { - strBuilder.push(' - auth: ' + decoder.readVarString() + '\n') - strBuilder.push(' == OS: \n') + strBuilder.push(' - auth: ' + decoder.readVarString()) // write DS to string - strBuilder.push(' == DS: \n') + strBuilder.push(' == DS:') let len = decoder.readUint32() for (let i = 0; i < len; i++) { let user = decoder.readVarUint() @@ -18,6 +17,7 @@ export function stringifySyncStep2 (y, decoder, strBuilder) { strBuilder.push(`[${from}, ${to}, ${gc}]`) } } + strBuilder.push(' == OS:') stringifyStructs(y, decoder, strBuilder) } diff --git a/src/Store/DeleteStore.js b/src/Store/DeleteStore.js index 68aa01a2..9256fecf 100644 --- a/src/Store/DeleteStore.js +++ b/src/Store/DeleteStore.js @@ -13,6 +13,18 @@ class DSNode { } export default class DeleteStore extends Tree { + logTable () { + const deletes = [] + this.iterate(null, null, function (n) { + deletes.push({ + user: n._id.user, + clock: n._id.clock, + len: n.len, + gc: n.gc + }) + }) + console.table(deletes) + } isDeleted (id) { var n = this.findWithUpperBound(id) return n !== null && n._id.user === id.user && id.clock < n._id.clock + n.len diff --git a/src/Store/OperationStore.js b/src/Store/OperationStore.js index 73daf212..7cc5f887 100644 --- a/src/Store/OperationStore.js +++ b/src/Store/OperationStore.js @@ -1,12 +1,30 @@ import Tree from '../Util/Tree.js' import RootID from '../Util/RootID.js' import { getStruct } from '../Util/structReferences.js' +import { logID } from '../MessageHandler/messageToString.js' export default class OperationStore extends Tree { constructor (y) { super() this.y = y } + logTable () { + const items = [] + this.iterate(null, null, function (item) { + items.push({ + id: logID(item), + origin: logID(item._origin === null ? null : item._origin._lastId), + left: logID(item._left === null ? null : item._left._lastId), + right: logID(item._right), + right_origin: logID(item._right_origin), + parent: logID(item._parent), + parentSub: item._parentSub, + deleted: item._deleted, + content: JSON.stringify(item._content) + }) + }) + console.table(items) + } get (id) { let struct = this.find(id) if (struct === null && id instanceof RootID) { diff --git a/src/Store/StateStore.js b/src/Store/StateStore.js index 13a91f32..a4492f2c 100644 --- a/src/Store/StateStore.js +++ b/src/Store/StateStore.js @@ -5,6 +5,15 @@ export default class StateStore { this.y = y this.state = new Map() } + logTable () { + const entries = [] + for (let [user, state] of this.state) { + entries.push({ + user, state + }) + } + console.table(entries) + } getNextID (len) { const user = this.y.userID const state = this.getState(user) diff --git a/src/Struct/Item.js b/src/Struct/Item.js index 7b9d81d3..c7ceffed 100644 --- a/src/Struct/Item.js +++ b/src/Struct/Item.js @@ -297,7 +297,4 @@ export default class Item { } return missing } - _logString () { - return `left: ${this._left}, origin: ${this._origin}, right: ${this._right}, parent: ${this._parent}, parentSub: ${this._parentSub}` - } } diff --git a/src/Struct/ItemJSON.js b/src/Struct/ItemJSON.js index d62403de..f17b9bae 100644 --- a/src/Struct/ItemJSON.js +++ b/src/Struct/ItemJSON.js @@ -1,4 +1,5 @@ import { splitHelper, default as Item } from './Item.js' +import { logID } from '../MessageHandler/messageToString.js' export default class ItemJSON extends Item { constructor () { @@ -27,8 +28,7 @@ export default class ItemJSON extends Item { } } _logString () { - let s = super._logString() - return 'ItemJSON: ' + s + return `ItemJSON(id:${logID(this._id)},content:${JSON.stringify(this._content)},left:${logID(this._left)},origin:${logID(this._origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${logID(this._parentSub)})` } _splitAt (y, diff) { if (diff === 0) { diff --git a/src/Struct/ItemString.js b/src/Struct/ItemString.js index bef915b6..eaa504f8 100644 --- a/src/Struct/ItemString.js +++ b/src/Struct/ItemString.js @@ -1,4 +1,5 @@ import { splitHelper, default as Item } from './Item.js' +import { logID } from '../MessageHandler/messageToString.js' export default class ItemString extends Item { constructor () { @@ -18,8 +19,7 @@ export default class ItemString extends Item { encoder.writeVarString(this._content) } _logString () { - let s = super._logString() - return 'ItemString: ' + s + return `ItemJSON(id:${logID(this._id)},content:${JSON.stringify(this._content)},left:${logID(this._left)},origin:${logID(this._origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${logID(this._parentSub)})` } _splitAt (y, diff) { if (diff === 0) { diff --git a/src/Type/YArray.js b/src/Type/YArray.js index f4a4c3c8..8673d117 100644 --- a/src/Type/YArray.js +++ b/src/Type/YArray.js @@ -1,5 +1,6 @@ import Type from '../Struct/Type.js' import ItemJSON from '../Struct/ItemJSON.js' +import { logID } from '../MessageHandler/messageToString.js' class YArrayEvent { constructor (yarray, remote) { @@ -203,7 +204,6 @@ export default class YArray extends Type { this.insertAfter(left, content) } _logString () { - let s = super._logString() - return 'YArray: ' + s + return `YArray(id:${logID(this._id)},start:${logID(this._start)},left:${logID(this._left)},origin:${logID(this._origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${logID(this._parentSub)})` } } diff --git a/src/Type/YMap.js b/src/Type/YMap.js index 76ae00f0..473f04ff 100644 --- a/src/Type/YMap.js +++ b/src/Type/YMap.js @@ -1,6 +1,7 @@ import Type from '../Struct/Type.js' import Item from '../Struct/Item.js' import ItemJSON from '../Struct/ItemJSON.js' +import { logID } from '../MessageHandler/messageToString.js' class YMapEvent { constructor (ymap, subs, remote) { @@ -82,7 +83,6 @@ export default class YMap extends Type { } } _logString () { - let s = super._logString() - return 'YMap: ' + s + return `YMap(id:${logID(this._id)},mapSize:${this._map.size},left:${logID(this._left)},origin:${logID(this._origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${logID(this._parentSub)})` } } diff --git a/src/Type/YText.js b/src/Type/YText.js index ce88adb5..86f1951f 100644 --- a/src/Type/YText.js +++ b/src/Type/YText.js @@ -1,5 +1,6 @@ import ItemString from '../Struct/ItemString.js' import YArray from './YArray.js' +import { logID } from '../MessageHandler/messageToString.js' export default class YText extends YArray { constructor (string) { @@ -50,4 +51,7 @@ export default class YText extends YArray { item._integrate(this._y) }) } + _logString () { + return `YText(id:${logID(this._id)},start:${logID(this._start)},left:${logID(this._left)},origin:${logID(this._origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${logID(this._parentSub)})` + } } diff --git a/src/Type/y-xml/YXmlFragment.js b/src/Type/y-xml/YXmlFragment.js index 8366f122..a86823a1 100644 --- a/src/Type/y-xml/YXmlFragment.js +++ b/src/Type/y-xml/YXmlFragment.js @@ -5,6 +5,7 @@ import { defaultDomFilter, applyChangesFromDom, reflectChangesOnDom } from './ut import YArray from '../YArray.js' import YXmlText from './YXmlText.js' import YXmlEvent from './YXmlEvent.js' +import { logID } from '../../MessageHandler/messageToString.js' function domToYXml (parent, doms) { const types = [] @@ -151,4 +152,7 @@ export default class YXmlFragment extends YArray { this._domObserverListener(this._domObserver.takeRecords()) } } + _logString () { + return `YXml(id:${logID(this._id)},parent:${logID(this._parent)},parentSub:${this._parentSub})` + } }