From c446f7712c54d392cd6ea31c38ed31883e3c518f Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Mon, 14 Dec 2020 09:34:57 +0000 Subject: [PATCH] Merge pull request #3487 from overleaf/bg-shut-down-connection-manager shut down connection manager on out of sync GitOrigin-RevId: e191ed62a49c72e8b8ed8c9ba57ed6e0b3606abe --- .../js/ide/connection/ConnectionManager.js | 24 +++++++++++++++---- .../frontend/js/ide/editor/EditorManager.js | 3 +-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/services/web/frontend/js/ide/connection/ConnectionManager.js b/services/web/frontend/js/ide/connection/ConnectionManager.js index 05a438cd38..b74399f516 100644 --- a/services/web/frontend/js/ide/connection/ConnectionManager.js +++ b/services/web/frontend/js/ide/connection/ConnectionManager.js @@ -72,6 +72,7 @@ export default (ConnectionManager = (function() { this.connected = false this.userIsInactive = false this.gracefullyReconnecting = false + this.shuttingDown = false this.joinProjectRetryInterval = this.JOIN_PROJECT_RETRY_INTERVAL @@ -99,7 +100,11 @@ export default (ConnectionManager = (function() { }) document.querySelector('body').addEventListener('click', e => { - if (!this.connected && e.target.id !== 'try-reconnect-now-button') { + if ( + !this.shuttingDown && + !this.connected && + e.target.id !== 'try-reconnect-now-button' + ) { // user is editing, try to reconnect return this.tryReconnectWithRateLimit() } @@ -235,7 +240,8 @@ export default (ConnectionManager = (function() { if (!this.$scope.connection.state.match(/^waiting/)) { if ( !this.$scope.connection.forced_disconnect && - !this.userIsInactive + !this.userIsInactive && + !this.shuttingDown ) { this.startAutoReconnectCountdown() } else { @@ -451,8 +457,12 @@ Something went wrong connecting to your project. Please refresh if this continue return this.tryReconnect() } - disconnect() { - if (this.ide.socket.socket && !this.ide.socket.socket.connected) { + disconnect(options) { + if (options && options.permanent) { + sl_console.log('[disconnect] shutting down ConnectionManager') + this.updateConnectionManagerState('inactive') + this.shuttingDown = true // prevent reconnection attempts + } else if (this.ide.socket.socket && !this.ide.socket.socket.connected) { sl_console.log( '[socket.io] skipping disconnect because socket.io has not connected' ) @@ -548,7 +558,11 @@ Something went wrong connecting to your project. Please refresh if this continue tryReconnect() { sl_console.log('[ConnectionManager] tryReconnect') - if (this.connected || this.$scope.connection.reconnecting) { + if ( + this.connected || + this.shuttingDown || + this.$scope.connection.reconnecting + ) { return } this.updateConnectionManagerState('reconnecting') diff --git a/services/web/frontend/js/ide/editor/EditorManager.js b/services/web/frontend/js/ide/editor/EditorManager.js index db2305f86e..7387cd8bad 100644 --- a/services/web/frontend/js/ide/editor/EditorManager.js +++ b/services/web/frontend/js/ide/editor/EditorManager.js @@ -316,8 +316,7 @@ export default (EditorManager = (function() { // Do not re-join after re-connecting. sharejs_doc.leaveAndCleanUp() - - this.ide.socket.disconnect() + this.ide.connectionManager.disconnect({ permanent: true }) this.ide.reportError(error, meta) // Tell the user about the error state.