mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-05-13 01:54:53 +00:00
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.
This commit is contained in:
+25
-25
@@ -22,9 +22,9 @@
|
||||
<meta name="twitter:title" content="MeshCore Analyzer">
|
||||
<meta name="twitter:description" content="Real-time MeshCore LoRa mesh network analyzer — live packet visualization, node tracking, channel decryption, and route analysis.">
|
||||
<meta name="twitter:image" content="https://raw.githubusercontent.com/Kpa-clawbot/meshcore-analyzer/master/public/og-image.png">
|
||||
<link rel="stylesheet" href="style.css?v=1774298100">
|
||||
<link rel="stylesheet" href="home.css?v=1774298100">
|
||||
<link rel="stylesheet" href="live.css?v=1774298100">
|
||||
<link rel="stylesheet" href="style.css?v=1774308178">
|
||||
<link rel="stylesheet" href="home.css?v=1774308178">
|
||||
<link rel="stylesheet" href="live.css?v=1774308178">
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
||||
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
|
||||
crossorigin="anonymous">
|
||||
@@ -81,27 +81,27 @@
|
||||
<main id="app" role="main"></main>
|
||||
|
||||
<script src="vendor/qrcode.js"></script>
|
||||
<script src="roles.js?v=1774298100"></script>
|
||||
<script src="customize.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="region-filter.js?v=1774298100"></script>
|
||||
<script src="hop-resolver.js?v=1774298100"></script>
|
||||
<script src="hop-display.js?v=1774298100"></script>
|
||||
<script src="app.js?v=1774298100"></script>
|
||||
<script src="home.js?v=1774298100"></script>
|
||||
<script src="packet-filter.js?v=1774511200"></script>
|
||||
<script src="packets.js?v=1774511200"></script>
|
||||
<script src="map.js?v=1774504200" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="channels.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="nodes.js?v=1774504200" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="traces.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="analytics.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="audio.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="audio-v1-constellation.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="audio-lab.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="live.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="observers.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="observer-detail.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="node-analytics.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="perf.js?v=1774298100" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="roles.js?v=1774308178"></script>
|
||||
<script src="customize.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="region-filter.js?v=1774308178"></script>
|
||||
<script src="hop-resolver.js?v=1774308178"></script>
|
||||
<script src="hop-display.js?v=1774308178"></script>
|
||||
<script src="app.js?v=1774308178"></script>
|
||||
<script src="home.js?v=1774308178"></script>
|
||||
<script src="packet-filter.js?v=1774308178"></script>
|
||||
<script src="packets.js?v=1774308178"></script>
|
||||
<script src="map.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="channels.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="nodes.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="traces.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="analytics.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="audio.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="audio-v1-constellation.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="audio-lab.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="live.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="observers.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="observer-detail.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="node-analytics.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
<script src="perf.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+7
-21
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user