From 4aa1ad89a0e2d489bc6b85ab3291719e080757ad Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Mon, 25 Jul 2022 21:45:41 -0700 Subject: socket reconnection logic --- src/lib/socket.js | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'src/lib/socket.js') diff --git a/src/lib/socket.js b/src/lib/socket.js index 978c053a..0360acd5 100644 --- a/src/lib/socket.js +++ b/src/lib/socket.js @@ -1,4 +1,4 @@ -import { rate } from "$lib/store"; +import { rate, ws } from '$lib/store'; export const messages = (data) => ({ rate() { rate.set(data); @@ -8,3 +8,44 @@ export const messages = (data) => ({ console.log(data); } }); + +const token = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImJvYiIsImlhdCI6MTY1ODc5NDkxMX0._zFTEADrbLffcXa5sIMrJtJ483VdIiYmsdt2ofibxu4'; +const initialReconnectDelay = 1000; +const maxReconnectDelay = 16000; + +let currentReconnectDelay = initialReconnectDelay; +let socket; + +export function connect() { + socket = new WebSocket('ws://localhost:3119/ws'); + socket.addEventListener('open', onWebsocketOpen); + socket.addEventListener('close', onWebsocketClose); + socket.addEventListener('message', onWebsocketMessage); + + ws.set(socket); +} + +function onWebsocketMessage(msg) { + let { type, data } = JSON.parse(msg.data); + messages(data)[type] && messages(data)[type](); +} + +function onWebsocketOpen() { + currentReconnectDelay = initialReconnectDelay; + socket.send(JSON.stringify({ type: 'login', data: token })); +} + +function onWebsocketClose() { + ws.set(null); + setTimeout(() => { + reconnectToWebsocket(); + }, currentReconnectDelay + Math.floor(Math.random() * 3000)); +} + +function reconnectToWebsocket() { + if (currentReconnectDelay < maxReconnectDelay) { + currentReconnectDelay *= 2; + } + connect(); +} -- cgit v1.2.3