From 4578a4319761b68fafba79f6419ef67e145441e7 Mon Sep 17 00:00:00 2001 From: "pakintada@gmail.com" Date: Sat, 9 May 2026 11:02:57 +0700 Subject: [PATCH] feat: heartbeat check if connection offline - WIP price message Signed-off-by: pakintada@gmail.com --- src/lib/core/handlers/adbPayloadHandler.ts | 10 +++++ src/lib/core/handlers/messageHandler.ts | 13 ++++++ src/lib/core/stores/websocketStore.ts | 48 ++++++++++++++-------- src/lib/core/types/outMessage.ts | 15 +++++++ 4 files changed, 69 insertions(+), 17 deletions(-) diff --git a/src/lib/core/handlers/adbPayloadHandler.ts b/src/lib/core/handlers/adbPayloadHandler.ts index 631c159..75cd02c 100644 --- a/src/lib/core/handlers/adbPayloadHandler.ts +++ b/src/lib/core/handlers/adbPayloadHandler.ts @@ -60,6 +60,16 @@ async function handleAdbPayload(raw_payload: string) { addNotification('INFO:Machine Status Updated, ' + next); updateMachineStatus(next); } + break; + case 'brew-finish': + if (payload.payload) { + let plist = payload.payload.split('/'); + let pd = plist[0] ?? ''; + let total_time = plist[1] ?? ''; + + // update recipe data store + } + break; case 'error': // show error to user from brew app diff --git a/src/lib/core/handlers/messageHandler.ts b/src/lib/core/handlers/messageHandler.ts index 36fbf18..1c6e394 100644 --- a/src/lib/core/handlers/messageHandler.ts +++ b/src/lib/core/handlers/messageHandler.ts @@ -15,6 +15,7 @@ import { buildOverviewFromServer } from '$lib/data/recipeService'; import { auth } from '../client/firebase'; import { type RecipeVersion } from '$lib/models/recipe_version.model'; import { goto } from '$app/navigation'; +import { socketAlreadySendHeartbeat, socketConnectionOfflineCount } from '../stores/websocketStore'; export const messages = writable([]); @@ -207,6 +208,18 @@ const handlers: Record void> = { currentRecipeVersionsSelector.set(result); } + }, + price: (p) => { + let req_action = p.req_action; + let status = p.status; + let to = p.to; + + let content = p.content ?? []; + }, + heartbeat: (p) => { + socketConnectionOfflineCount.set(0); + socketAlreadySendHeartbeat.set(0); + console.log('heartbeat reset offline count'); } }; diff --git a/src/lib/core/stores/websocketStore.ts b/src/lib/core/stores/websocketStore.ts index 9653cf7..f459950 100644 --- a/src/lib/core/stores/websocketStore.ts +++ b/src/lib/core/stores/websocketStore.ts @@ -9,8 +9,11 @@ import { addNotification } from './noti'; import { permission } from './permissions'; let socket: WebSocket | null = null; +let reconnectTimeout: any; const ENABLE_WS_DEBUG: boolean = false; +export const socketConnectionOfflineCount = writable(0); +export const socketAlreadySendHeartbeat = writable(0); export const socketStore = writable(null); export function connectToWebsocket() { @@ -28,6 +31,8 @@ export function connectToWebsocket() { addNotification('INFO:Connected!'); if (socket) { + clearTimeout(reconnectTimeout); + // send auth message let auth_data = get(authStore); @@ -46,34 +51,43 @@ export function connectToWebsocket() { }); } - // recover messages on connect, flushing - // while (get(msgQueue).length) { - // let queue = get(msgQueue); - // let current = queue.shift(); - // if (current && socket) { - // socket.send(current); - // // set next - // msgQueue.set(queue); - // } - // } - // heartbeat 10s setInterval(() => { - if (socket) { + if (get(socketAlreadySendHeartbeat) > 0) { + let heartbeat_may_offline_count = get(socketConnectionOfflineCount); + + socketConnectionOfflineCount.set(heartbeat_may_offline_count + 1); + } + + if (get(socketConnectionOfflineCount) > 4) { + // counting offline 5 times then try reconnect + socketConnectionOfflineCount.set(0); + socketAlreadySendHeartbeat.set(0); + + connectToWebsocket(); + + return; + } + + if (socket != null) { sendMessage({ type: 'heartbeat', payload: {} }); + + let heartbeat_count = get(socketAlreadySendHeartbeat); + socketAlreadySendHeartbeat.set(heartbeat_count + 1); + } else { + // may send reconnect + console.log('check on socket health', socket); } }, 10000); if (auth.currentUser && socket == null) { console.log('try reconnect websocket ...'); // retry again - setTimeout(() => { - if (socket == null) { - connectToWebsocket(); - } + reconnectTimeout = setTimeout(() => { + connectToWebsocket(); }, 5000); } }); @@ -89,7 +103,7 @@ export function connectToWebsocket() { if (auth.currentUser && !socket) { console.log('try reconnect websocket ...'); // retry again - setTimeout(() => connectToWebsocket(), 30000); + reconnectTimeout = setTimeout(() => connectToWebsocket(), 5000); } }); diff --git a/src/lib/core/types/outMessage.ts b/src/lib/core/types/outMessage.ts index 449745e..2be6686 100644 --- a/src/lib/core/types/outMessage.ts +++ b/src/lib/core/types/outMessage.ts @@ -52,4 +52,19 @@ export type OutMessage = srv_name: string; values: any; }; + } + | { + type: 'price'; + payload: { + action: + | { + View: string; + } + | { + Edit: string; + }; + country: string; + parameters?: string; + override_file?: string; + }; };