]> Repos - mime-chat/commitdiff
add websocket ping connection check
authorriqo <hernandeze2@xavier.edu>
Tue, 8 Jun 2021 12:57:57 +0000 (07:57 -0500)
committerriqo <hernandeze2@xavier.edu>
Tue, 8 Jun 2021 12:57:57 +0000 (07:57 -0500)
src/background/ipc/account.ts
src/background/websockets.ts

index 589850918e77e263388a4a566082eb89286cf389..4bf64119c3010e071cf5000bc4f5942180db6785 100644 (file)
@@ -42,7 +42,7 @@ const onProfile = async (
             resolve(parsed.profile);
 
         } catch(e) {
-            reject(new Error('Failed to fetch profile.'));
+            reject(new Error('Unable to authenticate and fetch account profile.'));
         }
     })
 )
index 70eb7ff00515fdd295f854bc8f8469e51ce9913f..dec02037be0c4946db3a0af55c601b091d53a258 100644 (file)
@@ -3,11 +3,17 @@
 
 import WebSocket from 'ws';
 import { getAuthPayload } from "./authPayload";
+import { ipcEmit } from './helpers';
 
 let socket: WebSocket;
 
 const socketUrl = "ws://127.0.0.1:8760"
 
+const _connectionCheckTimeout = 4000;
+const _reconnectTimeout = 1000;
+let _connectionCheckInterval: ReturnType<typeof setTimeout>;
+
+
 // Run every time we want to connect to backend.
 export default function useWebSockets(
     receiveCallback: (s: string) => void,
@@ -45,6 +51,20 @@ export default function useWebSockets(
         console.log("WS:Connected to WS Server!");
         const jwt = getAuthPayload();
         socket.send(JSON.stringify(jwt));
+
+        // ping server
+        _connectionCheckInterval = setInterval(() => {
+
+            if (socket) socket.ping(null, true, (e: Error) => {
+                if (e) {
+                    ipcEmit('connection-alive', false);
+                    socket.close();
+                    setTimeout(createSocket, 1000);
+                }
+            });
+
+        }, _connectionCheckTimeout);
+
         if (openCallback) openCallback();
 
     }
@@ -59,7 +79,11 @@ export default function useWebSockets(
 
     const onClose = (event: WebSocket.CloseEvent) => {
         console.log("WS:Socket closed normally.", event.wasClean)
+
+        clearInterval(_connectionCheckInterval);
+
         if (!event.wasClean) {
+            ipcEmit('connection-alive', false);
             setTimeout(createSocket, 1000);
         }
     }
@@ -69,8 +93,11 @@ export default function useWebSockets(
         console.log("WS:WebSocket error: ", event.message);
     }
 
+
     const createSocket = (): WebSocket => {
 
+        if (_connectionCheckInterval) clearInterval(_connectionCheckInterval);
+
         socket = new WebSocket(socketUrl);
 
         // Add listeners.
@@ -78,6 +105,9 @@ export default function useWebSockets(
         socket.addEventListener("message", onServerMessage);
         socket.addEventListener("close", onClose);
         socket.addEventListener("error", onError);
+        socket.addEventListener("pong", () => {
+            ipcEmit('connection-alive', true);
+        });
 
         return socket;