From 14bd23d54ec3553b5b9877053660c0bb8818c4f6 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 4 Jan 2026 08:24:08 -0800 Subject: [PATCH] Handle some JSON parsing issues --- src/widgets/truenas/proxy.js | 14 +++++++++++--- src/widgets/truenas/widget.js | 17 +++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/widgets/truenas/proxy.js b/src/widgets/truenas/proxy.js index 3d3dd5821..d02c97268 100644 --- a/src/widgets/truenas/proxy.js +++ b/src/widgets/truenas/proxy.js @@ -28,9 +28,17 @@ function waitForEvent(ws, handler, { event = "message", parseJson = true } = {}) const handleEvent = (payload) => { try { - const parsed = parseJson ? JSON.parse(payload.toString()) : payload; - if (parseJson) logger.info("Received TrueNAS websocket message: %o", parsed); - else logger.info("Received TrueNAS websocket message: %o", payload); + let parsed = payload; + if (parseJson) { + if (Buffer.isBuffer(payload)) { + parsed = JSON.parse(payload.toString()); + } else if (typeof payload === "string") { + parsed = JSON.parse(payload); + } + logger.info("Received TrueNAS websocket message: %o", parsed); + } else { + logger.info("Received TrueNAS websocket message: %o", payload); + } const handlerResult = handler(parsed); if (handlerResult !== undefined) { cleanup(); diff --git a/src/widgets/truenas/widget.js b/src/widgets/truenas/widget.js index e41da9ea9..040ffa5bb 100644 --- a/src/widgets/truenas/widget.js +++ b/src/widgets/truenas/widget.js @@ -10,9 +10,12 @@ const widget = { alerts: { endpoint: "alert/list", wsMethod: "alert.list", - map: (data) => ({ - pending: jsonArrayFilter(data, (item) => item?.dismissed === false).length, - }), + map: (data) => { + if (Array.isArray(data)) { + return { pending: data.filter((item) => item?.dismissed === false).length }; + } + return { pending: jsonArrayFilter(data, (item) => item?.dismissed === false).length }; + }, }, status: { endpoint: "system/info", @@ -22,12 +25,14 @@ const widget = { pools: { endpoint: "pool", wsMethod: "pool.query", - map: (data) => - asJson(data).map((entry) => ({ + map: (data) => { + const list = Array.isArray(data) ? data : asJson(data); + return list.map((entry) => ({ id: entry.name, name: entry.name, healthy: entry.healthy, - })), + })); + }, }, dataset: { endpoint: "pool/dataset",