From 5db66bc8889edd8cb90352bb02c66875dda9626c Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 11 Mar 2026 17:50:08 -0400 Subject: [PATCH] feat: upgrade launcher WebSocket to V3 protocol - New element_websocket_v3.svelte: - URL path /v3/ws/group/{id}/client/{id} - Auth via ?api_key=...&jwt=... query params (browsers can't set WS headers) - Strict WS_Message_V3 schema: msg_type + target fields - 45s heartbeat to maintain Redis presence TTL - Self-echo detection via from_id (server-stamped) - Target 'group' (was 'all'), 'direct' (was 'dm') - launcher/+layout.svelte: - Swap Element_websocket_v2 -> Element_websocket_v3 - Add api_key and jwt props for V3 auth - Fix handle_ws_recv: type -> msg_type (V3 schema) - Remove unused 'type' prop passed to element --- src/lib/elements/element_websocket_v3.svelte | 401 ++++++++++++++++++ .../(launcher)/launcher/+layout.svelte | 10 +- 2 files changed, 407 insertions(+), 4 deletions(-) create mode 100644 src/lib/elements/element_websocket_v3.svelte diff --git a/src/lib/elements/element_websocket_v3.svelte b/src/lib/elements/element_websocket_v3.svelte new file mode 100644 index 00000000..9b0f331f --- /dev/null +++ b/src/lib/elements/element_websocket_v3.svelte @@ -0,0 +1,401 @@ + + + +
+ + + + + + +
+

WebSocket V3 — {ws_connect_status ?? 'not connected'}

+

Group: {group_id} · Client: {String(client_id).slice(-8)}

+
+ + {#if !hide__ws_form} +
+ + + + +
+ {/if} + + {#if !hide__ws_commands} +
+

Commands received:

+
    + {#each ws_received_list_cmd as item} +
  • + {item.cmd} + {#if item.from_id}from {item.from_id}{/if} +
  • + {/each} +
+
+ {/if} + + {#if !hide__ws_messages} +
+

Messages received:

+
    + {#each ws_received_list_other as item} +
  • + [{item.msg_type}] + {item.msg ?? ''} + {#if item.from_id}from {item.from_id}{/if} +
  • + {/each} +
+
+ {/if} +
diff --git a/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte b/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte index 9b28dcd7..83ed17be 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte @@ -54,7 +54,7 @@ import Launcher_cfg from '../launcher_cfg.svelte'; import Launcher_menu from '../launcher_menu.svelte'; import Launcher_session_view from '../launcher_session_view.svelte'; - import Element_websocket_v2 from '$lib/elements/element_websocket_v2.svelte'; + import Element_websocket_v3 from '$lib/elements/element_websocket_v3.svelte'; // *** Set initial variables // NOTE: Derived from data.account_id (prop) instead of $slct.account_id (store) @@ -288,7 +288,8 @@ function handle_ws_recv(ws_recv_status: any) { if (log_lvl) console.log('*** handle_ws_recv() ***', ws_recv_status); - if (ws_recv_status.type == 'cmd' && ws_recv_status.cmd) { + // V3 schema uses msg_type instead of type + if (ws_recv_status.msg_type == 'cmd' && ws_recv_status.cmd) { let cmd = ws_recv_status.cmd; if ($events_loc.launcher.controller != 'remote') return; @@ -1001,15 +1002,16 @@ {#if $events_loc.launcher.controller_group_code && $events_loc.launcher.ws_connect} -