Explorar o código

Merge pull request #2687 from overleaf/jpa-fix-failing-reconnect-caused-by-backend

[frontend] ConnectionManager: fix failing reconnects (caused by backend)

GitOrigin-RevId: f66e45fcb22849c2057b24eabde319ae7781ec51
Jakob Ackermann %!s(int64=6) %!d(string=hai) anos
pai
achega
bdbbe1d596
Modificáronse 1 ficheiros con 20 adicións e 0 borrados
  1. 20 0
      services/web/frontend/js/ide/connection/ConnectionManager.js

+ 20 - 0
services/web/frontend/js/ide/connection/ConnectionManager.js

@@ -270,6 +270,8 @@ The editor will refresh in automatically in 10 seconds.\
                 this.$scope.connection.stillReconnecting = true
               }
             }, 1000)
+          } else if (state === 'reconnectFailed') {
+            // reconnect attempt failed
           } else if (state === 'authenticating') {
             // socket connection has been established, trying to authenticate
           } else if (state === 'joining') {
@@ -507,6 +509,24 @@ Something went wrong connecting to your project. Please refresh if this continue
         }
         this.updateConnectionManagerState('reconnecting')
         sl_console.log('[ConnectionManager] Starting new connection')
+
+        const removeHandler = () => {
+          this.ide.socket.removeListener('error', handleFailure)
+          this.ide.socket.removeListener('connect', handleSuccess)
+        }
+        const handleFailure = () => {
+          sl_console.log('[ConnectionManager] tryReconnect: failed')
+          removeHandler()
+          this.updateConnectionManagerState('reconnectFailed')
+          this.tryReconnectWithRateLimit({ force: true })
+        }
+        const handleSuccess = () => {
+          sl_console.log('[ConnectionManager] tryReconnect: success')
+          removeHandler()
+        }
+        this.ide.socket.on('error', handleFailure)
+        this.ide.socket.on('connect', handleSuccess)
+
         // use socket.io connect() here to make a single attempt, the
         // reconnect() method makes multiple attempts
         this.ide.socket.socket.connect()