mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-06-07 17:51:39 +00:00
03e384bbc4
## Summary Fixes #538 — `null is not an object (evaluating 'pathHops.length')` crash on ADVERT packet detail. ## Root Cause `getParsedPath` caches its result as `p._parsedPath`. If another code path (e.g., object spread, API response) sets `_parsedPath = null`, the cache check (`!== undefined`) passes and returns `null` — causing `.length` to crash. Same pattern exists for `getParsedDecoded`. ## Changes ### `public/packet-helpers.js` - `getParsedPath`: cached return now uses `|| []` to guard against null cache - `getParsedDecoded`: cached return now uses `|| {}` to guard against null cache ### `public/packets.js` - `renderDetail()` (line ~1440): defensive `|| []` / `|| {}` on getParsedPath/getParsedDecoded calls - `buildFlatRowHtml()` (line ~1103): same defensive guards ### `test-frontend-helpers.js` - Added test: cached `_parsedPath = null` returns `[]` - Added test: cached `_parsedDecoded = null` returns `{}` ## Testing All 428 frontend helper tests pass. All 62 packet filter tests pass. Co-authored-by: you <you@example.com>
44 lines
1.5 KiB
JavaScript
44 lines
1.5 KiB
JavaScript
/* === CoreScope — packet-helpers.js (shared packet utilities) === */
|
|
'use strict';
|
|
|
|
/**
|
|
* Cached JSON.parse helpers for packet data (issue #387).
|
|
* Avoids repeated parsing of path_json / decoded_json on the same packet object.
|
|
* Results are cached as _parsedPath / _parsedDecoded properties on the packet.
|
|
*
|
|
* Handles pre-parsed objects (non-string values) gracefully — returns them as-is.
|
|
*/
|
|
|
|
window.getParsedPath = function getParsedPath(p) {
|
|
if (p._parsedPath !== undefined) return p._parsedPath || [];
|
|
var raw = p.path_json;
|
|
if (typeof raw !== 'string') {
|
|
p._parsedPath = Array.isArray(raw) ? raw : [];
|
|
return p._parsedPath;
|
|
}
|
|
try { p._parsedPath = JSON.parse(raw) || []; } catch (e) { p._parsedPath = []; }
|
|
return p._parsedPath;
|
|
};
|
|
|
|
/**
|
|
* Clear cached _parsedPath/_parsedDecoded from a packet object.
|
|
* Must be called after spreading a parent packet into an observation/child,
|
|
* otherwise the child inherits stale cached values from the parent (issue #504).
|
|
*/
|
|
window.clearParsedCache = function clearParsedCache(p) {
|
|
delete p._parsedPath;
|
|
delete p._parsedDecoded;
|
|
return p;
|
|
};
|
|
|
|
window.getParsedDecoded = function getParsedDecoded(p) {
|
|
if (p._parsedDecoded !== undefined) return p._parsedDecoded || {};
|
|
var raw = p.decoded_json;
|
|
if (typeof raw !== 'string') {
|
|
p._parsedDecoded = (raw && typeof raw === 'object') ? raw : {};
|
|
return p._parsedDecoded;
|
|
}
|
|
try { p._parsedDecoded = JSON.parse(raw) || {}; } catch (e) { p._parsedDecoded = {}; }
|
|
return p._parsedDecoded;
|
|
};
|