From c876847effd7739a5c764a23b17c228f7a801a85 Mon Sep 17 00:00:00 2001 From: "pakintada@gmail.com" Date: Thu, 26 Feb 2026 12:49:08 +0700 Subject: [PATCH] fix: case too many connection on websocket Signed-off-by: pakintada@gmail.com --- src/lib/core/handlers/messageHandler.ts | 19 ++++++++++++++++++- src/lib/core/stores/websocketStore.ts | 12 +++++++----- src/routes/(authed)/+layout.svelte | 12 ++++++++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/lib/core/handlers/messageHandler.ts b/src/lib/core/handlers/messageHandler.ts index c4110c0..45d7366 100644 --- a/src/lib/core/handlers/messageHandler.ts +++ b/src/lib/core/handlers/messageHandler.ts @@ -9,6 +9,7 @@ import { recipeStreamMeta } from '../stores/recipeStore'; import { buildOverviewFromServer } from '$lib/data/recipeService'; +import { auth } from '../client/firebase'; export const messages = writable([]); @@ -118,7 +119,23 @@ const handlers: Record void> = { } } }, - stream_patch_update: (p) => {} + stream_patch_update: (p) => {}, + notify: (p) => { + let noti_level = p.level ?? 'INFO'; + let msg = p.msg ?? `Notify from ${p.from}`; + let target = p.to; + + if (target) { + // + let currentUsername = auth.currentUser?.displayName; + if (currentUsername && currentUsername === target) { + addNotification(`${noti_level}:${msg}`); + } + } else { + // broadcast to all + addNotification(`${noti_level}:${msg}`); + } + } }; export function handleIncomingMessages(raw: string) { diff --git a/src/lib/core/stores/websocketStore.ts b/src/lib/core/stores/websocketStore.ts index ac7c243..9e27eb1 100644 --- a/src/lib/core/stores/websocketStore.ts +++ b/src/lib/core/stores/websocketStore.ts @@ -4,13 +4,15 @@ import { get, writable } from 'svelte/store'; import { handleIncomingMessages } from '../handlers/messageHandler'; import { queue as msgQueue } from '../handlers/ws_messageSender'; -export const socketStore = writable(null, (set) => { +export const socketStore = writable(null); + +export function connectToWebsocket() { if (browser) { console.log('connecting to ', env.PUBLIC_WSS); const socket = new WebSocket(`${env.PUBLIC_WSS}`); socket.addEventListener('open', () => { - set(socket); + socketStore.set(socket); // recover messages on connect, flushing while (get(msgQueue).length) { @@ -29,12 +31,12 @@ export const socketStore = writable(null, (set) => { }); socket.addEventListener('close', () => { - set(null); + socketStore.set(null); }); socket.addEventListener('error', (e) => { console.log('WebSocket error: ', e); - set(null); + socketStore.set(null); }); return () => { @@ -43,4 +45,4 @@ export const socketStore = writable(null, (set) => { } }; } -}); +} diff --git a/src/routes/(authed)/+layout.svelte b/src/routes/(authed)/+layout.svelte index 1c696d1..9ef40a7 100644 --- a/src/routes/(authed)/+layout.svelte +++ b/src/routes/(authed)/+layout.svelte @@ -7,8 +7,20 @@ import '../layout.css'; import ErrorLayout from '$lib/components/error-layout.svelte'; import { sidebarStore } from '$lib/core/stores/sidebar'; + import { onMount } from 'svelte'; + import { auth } from '$lib/core/stores/auth'; + import { get } from 'svelte/store'; + import { connectToWebsocket } from '$lib/core/stores/websocketStore'; let { children } = $props(); + + onMount(() => { + let currentUser = get(auth); + console.log(`on mount layout current user: ${JSON.stringify(currentUser)}`); + if (currentUser) { + connectToWebsocket(); + } + });