From 55bff3af0073fa8d173bcbca3b79c282ebc96f98 Mon Sep 17 00:00:00 2001 From: Carter Date: Fri, 6 Mar 2026 13:04:46 -0600 Subject: [PATCH] guarding component web socket a little better --- src/pages/Device.tsx | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/pages/Device.tsx b/src/pages/Device.tsx index 281842d..0fb59a9 100644 --- a/src/pages/Device.tsx +++ b/src/pages/Device.tsx @@ -172,15 +172,25 @@ export default function DevicePage() { // Streams all component changes for this device. // When the backend receives a new reading and updates a component, // this fires and updates the component in state without a page refresh. - useWebSocket<{ key: string; component: Component }>({ - path: `/v1/live/devices/${deviceID}/components`, + useWebSocket<{ key: string; component: Component } | null>({ + path: `/live/devices/${deviceID}/components`, parse: (e) => { - const raw = JSON.parse(e.data); - const comp = Component.any(raw); - return { key: comp.key(), component: comp }; + try { + const raw = JSON.parse(e.data); + const comp = Component.any(raw); + if (!comp?.settings) { + console.warn("[ws] received component without settings:", raw); + return null; + } + return { key: comp.key(), component: comp }; + } catch (err) { + console.warn("[ws] failed to parse component:", err); + return null; + } }, - onMessage: ({ key, component }) => { - // Functional update so we always work with the latest state + onMessage: (data) => { + if (!data) return; + const { key, component } = data; setComponents((prev) => { const updated = new Map(prev); updated.set(key, component);