Просмотр исходного кода

Merge pull request #2881 from overleaf/jpa-socket-io-retry-handshake

[misc] socket.io: retry the initial connection attempt

GitOrigin-RevId: e7f7e8eb233015f41b2b8c67e46c4661b8fad3c9
Chrystal Maria Griffiths 6 лет назад
Родитель
Сommit
50585a22b3

+ 1 - 0
services/web/app/views/project/editor.pug

@@ -179,6 +179,7 @@ block content
 		//- enable doc hash checking for all projects
 		//- enable doc hash checking for all projects
 		//- used in public/js/libs/sharejs.js
 		//- used in public/js/libs/sharejs.js
 		window.useShareJsHash = true
 		window.useShareJsHash = true
+		window.wsRetryHandshake = #{settings.wsRetryHandshake}
 
 
 	- if (settings.overleaf != null)
 	- if (settings.overleaf != null)
 		script(type='text/javascript').
 		script(type='text/javascript').

+ 1 - 0
services/web/config/settings.defaults.coffee

@@ -211,6 +211,7 @@ module.exports = settings =
 	wsUrlBeta: process.env['WEBSOCKET_URL_BETA']
 	wsUrlBeta: process.env['WEBSOCKET_URL_BETA']
 
 
 	wsUrlV2Percentage: parseInt(process.env['WEBSOCKET_URL_V2_PERCENTAGE'] || '0', 10)
 	wsUrlV2Percentage: parseInt(process.env['WEBSOCKET_URL_V2_PERCENTAGE'] || '0', 10)
+	wsRetryHandshake: parseInt(process.env['WEBSOCKET_RETRY_HANDSHAKE'] || '5', 10)
 
 
 	# cookie domain
 	# cookie domain
 	# use full domain for cookies to only be accessible from that domain,
 	# use full domain for cookies to only be accessible from that domain,

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

@@ -11,6 +11,7 @@
 /* global io */
 /* global io */
 
 
 import SocketIoShim from './SocketIoShim'
 import SocketIoShim from './SocketIoShim'
+
 let ConnectionManager
 let ConnectionManager
 const ONEHOUR = 1000 * 60 * 60
 const ONEHOUR = 1000 * 60 * 60
 
 
@@ -136,7 +137,14 @@ export default (ConnectionManager = (function() {
 
 
       // handle network-level websocket errors (e.g. failed dns lookups)
       // handle network-level websocket errors (e.g. failed dns lookups)
 
 
+      let connectionAttempt = 1
       let connectionErrorHandler = err => {
       let connectionErrorHandler = err => {
+        if (
+          window.wsRetryHandshake &&
+          connectionAttempt++ < window.wsRetryHandshake
+        ) {
+          return setTimeout(() => this.ide.socket.socket.connect(), 100)
+        }
         this.updateConnectionManagerState('error')
         this.updateConnectionManagerState('error')
         sl_console.log('socket.io error', err)
         sl_console.log('socket.io error', err)
         if (this.wsUrl && !window.location.href.match(/ws=fallback/)) {
         if (this.wsUrl && !window.location.href.match(/ws=fallback/)) {