diff --git a/bin/readSyncMessageFork.js b/bin/readSyncMessageFork.js new file mode 100644 index 0000000..9bb09ab --- /dev/null +++ b/bin/readSyncMessageFork.js @@ -0,0 +1,31 @@ +// @ts-nocheck +const syncProtocol = require('y-protocols/dist/sync.cjs') + +const decoding = require('lib0/dist/decoding.cjs') + +/** + * @param {decoding.Decoder} decoder A message received from another client + * @param {encoding.Encoder} encoder The reply message. Will not be sent if empty. + * @param {Y.Doc} doc + * @param {boolean} readOnly If true, updates will be silently ignored instead of applied. + * @param {any} transactionOrigin + */ +const readSyncMessage = (decoder, encoder, doc, readOnly = false, transactionOrigin) => { + const messageType = decoding.readVarUint(decoder) + switch (messageType) { + case syncProtocol.messageYjsSyncStep1: + syncProtocol.readSyncStep1(decoder, encoder, doc) + break + case syncProtocol.messageYjsSyncStep2: + if (!readOnly) syncProtocol.readSyncStep2(decoder, doc, transactionOrigin) + break + case syncProtocol.messageYjsUpdate: + if (!readOnly) syncProtocol.readUpdate(decoder, doc, transactionOrigin) + break + default: + throw new Error('Unknown message type') + } + return messageType +} + +module.exports = { readSyncMessage } diff --git a/bin/utils.js b/bin/utils.js index d9c1543..d79acab 100644 --- a/bin/utils.js +++ b/bin/utils.js @@ -12,6 +12,7 @@ const debounce = require('lodash.debounce') const callbackHandler = require('./callback.js').callbackHandler const isCallbackSet = require('./callback.js').isCallbackSet +const readSyncMessage = require('./readSyncMessageFork.js').readSyncMessage const CALLBACK_DEBOUNCE_WAIT = parseInt(process.env.CALLBACK_DEBOUNCE_WAIT) || 2000 const CALLBACK_DEBOUNCE_MAXWAIT = parseInt(process.env.CALLBACK_DEBOUNCE_MAXWAIT) || 10000 @@ -181,7 +182,7 @@ const messageListener = async (conn, doc, message) => { await doc.whenSynced } encoding.writeVarUint(encoder, messageSync) - syncProtocol.readSyncMessage(decoder, encoder, doc, null) + readSyncMessage(decoder, encoder, doc, conn.readOnly, null) if (encoding.length(encoder) > 1) { send(doc, conn, encoding.toUint8Array(encoder)) }