From 0c67b32de5a57efcc4882ef568ddccf087b27365 Mon Sep 17 00:00:00 2001 From: Daniel Tigse Date: Fri, 10 Jan 2020 16:27:35 -0500 Subject: [PATCH] socket reliability improvement closes #1273 --- electron_app/src/reachabilityTask.js | 7 +++++++ electron_app/src/socketClient.js | 24 +++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/electron_app/src/reachabilityTask.js b/electron_app/src/reachabilityTask.js index 54332ea91..caa5b6fe4 100644 --- a/electron_app/src/reachabilityTask.js +++ b/electron_app/src/reachabilityTask.js @@ -2,6 +2,7 @@ const { SERVER_URL } = require('./utils/const'); const globalManager = require('./globalManager'); const mailboxWindow = require('./windows/mailbox'); const { processEventsQueue } = require('./eventQueueManager'); +const { restartSocketSameJWT } = require('./socketClient'); const reconnectDelay = 2000; const NETWORK_STATUS = { ONLINE: 'online', @@ -12,6 +13,7 @@ const normalPingDelayMs = 15000; const failedPingDelayMs = 5000; let pingFailedCounter = 0; let reachabilityTask = null; +let hasFailed = false; let checkingConnectionToServer = false; const setConnectionStatus = networkStatus => { @@ -57,7 +59,12 @@ const checkAlive = async force => { if (prevNetworkStatus !== NETWORK_STATUS.ONLINE) { setConnectionStatus(NETWORK_STATUS.ONLINE); } + if (hasFailed) { + hasFailed = false; + restartSocketSameJWT(); + } } catch (ex) { + hasFailed = true; pingFailedCounter++; delayTime = failedPingDelayMs; if (pingFailedCounter > 3 && prevNetworkStatus !== NETWORK_STATUS.OFFLINE) { diff --git a/electron_app/src/socketClient.js b/electron_app/src/socketClient.js index 4e9c6e0ad..ff95d5b86 100644 --- a/electron_app/src/socketClient.js +++ b/electron_app/src/socketClient.js @@ -1,6 +1,6 @@ const { client: WebSocketClient } = require('websocket'); const { SOCKET_URL } = require('./utils/const'); -let client, reconnect, messageListener, socketConnection; +let client, reconnect, messageListener, socketConnection, lastJWT; let shouldReconnect = true; const reconnectDelay = 2000; @@ -21,11 +21,9 @@ const disconnect = () => { const start = ({ jwt }) => { client = new WebSocketClient(); client.connect(`${SOCKET_URL}?token=${jwt}`, 'criptext-protocol'); - + lastJWT = jwt; client.on('connectFailed', error => { - if (shouldReconnect) { - reconnect(); - } + reconnect(); log(error); }); @@ -34,7 +32,7 @@ const start = ({ jwt }) => { log('Socket connection opened'); connection.on('error', error => { - reconnect(); + restartSocketSameJWT(); log(error); }); connection.on('close', () => { @@ -44,6 +42,11 @@ const start = ({ jwt }) => { const message = JSON.parse(data.utf8Data); messageListener(message); }); + connection.socket.setTimeout(30 * 1000); + connection.socket.on('timeout', function() { + log('Socket timeout'); + restartSocketSameJWT(); + }); }); reconnect = () => { @@ -67,6 +70,7 @@ process.on('exit', () => { }); const restartSocket = ({ jwt }) => { + lastJWT = jwt; shouldReconnect = false; disconnect(); client = null; @@ -76,9 +80,15 @@ const restartSocket = ({ jwt }) => { }, reconnectDelay * 2); }; +const restartSocketSameJWT = () => { + if (!shouldReconnect) return; + restartSocket({ jwt: lastJWT }); +}; + module.exports = { start, setMessageListener, disconnect, - restartSocket + restartSocket, + restartSocketSameJWT };