diff --git a/src/components/Editor.vue b/src/components/Editor.vue index 76893fca873..5b39b642dca 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -808,6 +808,7 @@ export default { filePath: this.relativePath, clientId: this.$ydoc.clientID, pendingStructs: this.$ydoc.store.pendingStructs, + pendingStructsRemote: this.$providers[0]?.remote.store.pendingStructs, clientVectors: [], documentState: this.$syncService?.getDocumentState(), } diff --git a/src/services/y-websocket.js b/src/services/y-websocket.js index 7fdd7da5493..5ae0fb6f5be 100644 --- a/src/services/y-websocket.js +++ b/src/services/y-websocket.js @@ -44,12 +44,24 @@ messageHandlers[messageSync] = ( ) => { encoding.writeVarUint(encoder, messageSync) const decoderForRemote = decoding.clone(decoder) + const pendingStructsBefore = provider.doc.store.pendingStructs const syncMessageType = syncProtocol.readSyncMessage( decoder, encoder, provider.doc, provider, ) + if ( + !pendingStructsBefore + && provider.doc.store.pendingStructs + && !encoder.hasContent + ) { + // The message received left pending structs behind. + // Send SyncStep1 to resync. + console.error('Failed to integrate yjs message. Trying to resync.') + encoding.writeVarUint(encoder, messageSync) + syncProtocol.writeSyncStep1(encoder, provider.doc) + } // Message came from the broadcast channel // Do not track in this.remote and do not emit sync. if (!emitSynced) { @@ -285,7 +297,7 @@ export class WebsocketProvider extends Observable { params = {}, protocols = [], WebSocketPolyfill = WebSocket, - resyncInterval = -1, + resyncInterval = 30_000, maxBackoffTime = 2500, disableBc = false, } = {}) { @@ -339,7 +351,7 @@ export class WebsocketProvider extends Observable { this._resyncInterval = 0 if (resyncInterval > 0) { this._resyncInterval = /** @type {any} */ (setInterval(() => { - if (this.ws && this.ws.readyState === WebSocket.OPEN) { + if (this.ws && this.ws.readyState === WebSocket.OPEN && doc.store.pendingStructs) { // resend sync step 1 const encoder = encoding.createEncoder() encoding.writeVarUint(encoder, messageSync)