add websocket ping connection check

This commit is contained in:
riqo 2021-06-08 07:57:57 -05:00
commit 25b03d501c
2 changed files with 31 additions and 1 deletions

View file

@ -42,7 +42,7 @@ const onProfile = async (
resolve(parsed.profile); resolve(parsed.profile);
} catch(e) { } catch(e) {
reject(new Error('Failed to fetch profile.')); reject(new Error('Unable to authenticate and fetch account profile.'));
} }
}) })
) )

View file

@ -3,11 +3,17 @@
import WebSocket from 'ws'; import WebSocket from 'ws';
import { getAuthPayload } from "./authPayload"; import { getAuthPayload } from "./authPayload";
import { ipcEmit } from './helpers';
let socket: WebSocket; let socket: WebSocket;
const socketUrl = "ws://127.0.0.1:8760" 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. // Run every time we want to connect to backend.
export default function useWebSockets( export default function useWebSockets(
receiveCallback: (s: string) => void, receiveCallback: (s: string) => void,
@ -45,6 +51,20 @@ export default function useWebSockets(
console.log("WS:Connected to WS Server!"); console.log("WS:Connected to WS Server!");
const jwt = getAuthPayload(); const jwt = getAuthPayload();
socket.send(JSON.stringify(jwt)); 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(); if (openCallback) openCallback();
} }
@ -59,7 +79,11 @@ export default function useWebSockets(
const onClose = (event: WebSocket.CloseEvent) => { const onClose = (event: WebSocket.CloseEvent) => {
console.log("WS:Socket closed normally.", event.wasClean) console.log("WS:Socket closed normally.", event.wasClean)
clearInterval(_connectionCheckInterval);
if (!event.wasClean) { if (!event.wasClean) {
ipcEmit('connection-alive', false);
setTimeout(createSocket, 1000); setTimeout(createSocket, 1000);
} }
} }
@ -69,8 +93,11 @@ export default function useWebSockets(
console.log("WS:WebSocket error: ", event.message); console.log("WS:WebSocket error: ", event.message);
} }
const createSocket = (): WebSocket => { const createSocket = (): WebSocket => {
if (_connectionCheckInterval) clearInterval(_connectionCheckInterval);
socket = new WebSocket(socketUrl); socket = new WebSocket(socketUrl);
// Add listeners. // Add listeners.
@ -78,6 +105,9 @@ export default function useWebSockets(
socket.addEventListener("message", onServerMessage); socket.addEventListener("message", onServerMessage);
socket.addEventListener("close", onClose); socket.addEventListener("close", onClose);
socket.addEventListener("error", onError); socket.addEventListener("error", onError);
socket.addEventListener("pong", () => {
ipcEmit('connection-alive', true);
});
return socket; return socket;