From f3960f0167f36db2438f8751007096fe6cd1ee62 Mon Sep 17 00:00:00 2001 From: Av1ralS1ngh Date: Tue, 21 Apr 2026 10:33:12 +0530 Subject: [PATCH] fix: make annotateDirtyNodesWithError return new nodes instead of mutating node.data.error and node.data.extendedError were being set directly on node objects, bypassing the immutable update pattern used elsewhere in the codebase. Both call sites (payload-limit path and network-error path) now consume the returned mapped array. --- src/lib/graphUtils.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/lib/graphUtils.ts b/src/lib/graphUtils.ts index 436c3ca..d3bd353 100644 --- a/src/lib/graphUtils.ts +++ b/src/lib/graphUtils.ts @@ -106,12 +106,10 @@ async function loadBackendLimits(baseUrl: string): Promise { function annotateDirtyNodesWithError( nodes: Node[], message: string -) { - nodes.forEach((node) => { - if (node.data?.dirty) { - node.data.error = true; - node.data.extendedError = message; - } +): Node[] { + return nodes.map((node) => { + if (!node.data?.dirty) return node; + return { ...node, data: { ...node.data, error: true, extendedError: message } }; }); } @@ -178,9 +176,8 @@ export async function recalculateGraph( const limitMessage = `Request is ${formatBytes( payloadBytes )}, over the server limit (${formatBytes(maxPayloadBytes)}).`; - annotateDirtyNodesWithError(nodes, limitMessage); return { - nodes, + nodes: annotateDirtyNodesWithError(nodes, limitMessage), version, errors: [{ nodeId: PAYLOAD_LIMIT_NODE_ID, error: limitMessage }], }; @@ -223,11 +220,8 @@ export async function recalculateGraph( ? "Backend not running. Start it with: python routes.py" : "Cannot connect to calculation service. Please try again later."; - // Mark all dirty nodes with error - annotateDirtyNodesWithError(nodes, message); - return { - nodes: nodes, + nodes: annotateDirtyNodesWithError(nodes, message), version: version, errors: [], // No system error - the node errors are enough };