diff --git a/package-lock.json b/package-lock.json index 96d76df5..69f58b0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "y-websocket", - "version": "1.3.11", + "version": "1.3.12", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0ae89b1e..c17a2ac9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "y-websocket", - "version": "1.3.11", + "version": "1.3.12", "description": "Websockets provider for Yjs", "main": "./dist/y-websocket.cjs", "module": "./src/y-websocket.js", diff --git a/src/y-websocket.js b/src/y-websocket.js index 611dc080..cbbd0f96 100644 --- a/src/y-websocket.js +++ b/src/y-websocket.js @@ -97,7 +97,9 @@ const setupWS = provider => { websocket.onmessage = event => { provider.wsLastMessageReceived = time.getUnixTime() - const encoder = readMessage(provider, new Uint8Array(event.data), true) + let _event = event + provider.eventPreProcess(_event) + const encoder = readMessage(provider, _event.data, true) if (encoding.length(encoder) > 1) { websocket.send(encoding.toUint8Array(encoder)) } @@ -166,6 +168,16 @@ const broadcastMessage = (provider, buf) => { } } +/** + * @function + * @param {object} event + * @return {object} + */ +const eventPreProcess = (event) => { + event.data = new Uint8Array(event.data) + return event +} + /** * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document. * The document name is attached to the provided url. I.e. the following example @@ -190,8 +202,16 @@ export class WebsocketProvider extends Observable { * @param {Object} [opts.params] * @param {typeof WebSocket} [opts.WebSocketPolyfill] Optionall provide a WebSocket polyfill * @param {number} [opts.resyncInterval] Request server state every `resyncInterval` milliseconds + * @param {eventPreProcess} [opts.customEventPreProcess] Optional pre-processing on incomeing messages */ - constructor (serverUrl, roomname, doc, { connect = true, awareness = new awarenessProtocol.Awareness(doc), params = {}, WebSocketPolyfill = WebSocket, resyncInterval = -1 } = {}) { + constructor (serverUrl, roomname, doc, { + connect = true, + awareness = new awarenessProtocol.Awareness(doc), + params = {}, + WebSocketPolyfill = WebSocket, + resyncInterval = -1, + customEventPreProcess = eventPreProcess + } = {}) { super() // ensure that url is always ends with / while (serverUrl[serverUrl.length - 1] === '/') { @@ -210,6 +230,7 @@ export class WebsocketProvider extends Observable { this.wsUnsuccessfulReconnects = 0 this.messageHandlers = messageHandlers.slice() this.mux = mutex.createMutex() + this.eventPreProcess = customEventPreProcess || eventPreProcess /** * @type {boolean} */