diff --git a/cypress/e2e/sync.spec.js b/cypress/e2e/sync.spec.js index 715861bf65d..11f17f41d06 100644 --- a/cypress/e2e/sync.spec.js +++ b/cypress/e2e/sync.spec.js @@ -111,6 +111,7 @@ describe('Sync', () => { it('recovers from a lost and closed connection', () => { let reconnect = false + // block all requests until the session is closed and reopened cy.intercept('**/apps/text/session/*/*', (req) => { if (req.url.includes('close') || req.url.includes('create') || reconnect) { req.continue() @@ -125,6 +126,11 @@ describe('Sync', () => { cy.get('#editor-container .document-status', { timeout: 30000 }) .should('contain', 'Document could not be loaded.') + // Reconnect button works - it closes and reopens the session + cy.get('#editor-container .document-status a.button') + .contains('Reconnect') + .click() + cy.wait('@syncAfterRecovery', { timeout: 60000 }) cy.get('#editor-container .document-status', { timeout: 30000 }) diff --git a/src/services/SyncService.js b/src/services/SyncService.js index 9db0a1050fa..c13481d0b72 100644 --- a/src/services/SyncService.js +++ b/src/services/SyncService.js @@ -107,6 +107,10 @@ class SyncService { } async open({ fileId, initialSession }) { + if (this.#connection && !this.#connection.isClosed) { + // We're already connected. + return + } const onChange = ({ sessions }) => { this.sessions = sessions } @@ -116,7 +120,6 @@ class SyncService { ? Promise.resolve(new Connection({ data: initialSession }, {})) : this._api.open({ fileId, baseVersionEtag: this.baseVersionEtag }) .catch(error => this._emitError(error)) - this.#connection = await connect if (!this.#connection) { this.off('change', onChange)