From 656c8b8a070926f1fbe9d7b2f45fb5833e2fce61 Mon Sep 17 00:00:00 2001 From: you Date: Mon, 23 Mar 2026 23:23:08 +0000 Subject: [PATCH] fix: remove all /resolve-hops server API calls from packets page Was making N API calls per observer for ambiguous hops on every page load, plus another per packet detail view. All hop resolution now uses the client-side HopResolver which already handles ambiguous prefixes. Eliminates the main perf regression. --- public/index.html | 50 +++++++++++++++++++++++------------------------ public/packets.js | 28 +++++++------------------- 2 files changed, 32 insertions(+), 46 deletions(-) diff --git a/public/index.html b/public/index.html index 1fad6300..8dc5199b 100644 --- a/public/index.html +++ b/public/index.html @@ -22,9 +22,9 @@ - - - + + + @@ -81,27 +81,27 @@
- - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/packets.js b/public/packets.js index 770a1111..c1664aec 100644 --- a/public/packets.js +++ b/public/packets.js @@ -433,18 +433,8 @@ } } catch {} } - // Batch resolve — one API call per observer (typically 4-5 observers) - await Promise.all(Object.entries(hopsByObserver).map(async ([obsId, hopsSet]) => { - try { - const params = new URLSearchParams({ hops: [...hopsSet].join(','), observer: obsId }); - const result = await api(`/resolve-hops?${params}`); - if (result?.resolved) { - for (const [k, v] of Object.entries(result.resolved)) { - hopNameCache[k + ':' + obsId] = v; - } - } - } catch {} - })); + // Ambiguous hops are already resolved by HopResolver client-side + // No need for per-observer server API calls // Restore expanded group children if (groupByHash && expandedHashes.size > 0) { @@ -1206,18 +1196,14 @@ } catch {} } - // Re-resolve hops using SERVER-SIDE API with sender GPS + observer + // Re-resolve hops using client-side HopResolver with sender GPS context if (pathHops.length) { try { - const params = new URLSearchParams({ hops: pathHops.join(',') }); - if (pkt.observer_id) params.set('observer', pkt.observer_id); - if (senderLat != null) params.set('originLat', senderLat); - if (senderLon != null) params.set('originLon', senderLon); - const serverResolved = await api(`/resolve-hops?${params}`); - if (serverResolved?.resolved) { - for (const [k, v] of Object.entries(serverResolved.resolved)) { + await ensureHopResolver(); + const resolved = HopResolver.resolve(pathHops); + if (resolved) { + for (const [k, v] of Object.entries(resolved)) { hopNameCache[k] = v; - // Also store observer-scoped key for list view if (pkt.observer_id) hopNameCache[k + ':' + pkt.observer_id] = v; } }