fix: filter WebSocket packets by time window on packets page

WS broadcast pushes all packets regardless of the selected time
window filter. This caused old packets to appear in the table even
when the API correctly returned zero results for the time range.

Add time window check to the WS packet filter — drops packets
with timestamps older than the selected window cutoff.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Kpa-clawbot
2026-03-31 23:09:42 -07:00
parent e7232c0d29
commit e2556eaaff
2 changed files with 35 additions and 28 deletions
+28 -28
View File
@@ -22,9 +22,9 @@
<meta name="twitter:title" content="CoreScope">
<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/corescope/master/public/og-image.png">
<link rel="stylesheet" href="style.css?v=1775023114">
<link rel="stylesheet" href="home.css?v=1775023114">
<link rel="stylesheet" href="live.css?v=1775023114">
<link rel="stylesheet" href="style.css?v=1775023782">
<link rel="stylesheet" href="home.css?v=1775023782">
<link rel="stylesheet" href="live.css?v=1775023782">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin="anonymous">
@@ -81,30 +81,30 @@
<main id="app" role="main"></main>
<script src="vendor/qrcode.js"></script>
<script src="roles.js?v=1775023114"></script>
<script src="customize.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="region-filter.js?v=1775023114"></script>
<script src="hop-resolver.js?v=1775023114"></script>
<script src="hop-display.js?v=1775023114"></script>
<script src="app.js?v=1775023114"></script>
<script src="home.js?v=1775023114"></script>
<script src="packet-filter.js?v=1775023114"></script>
<script src="packets.js?v=1775023114"></script>
<script src="geo-filter-overlay.js?v=1775023114"></script>
<script src="map.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="channels.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="nodes.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="traces.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="analytics.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v1-constellation.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v2-constellation.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-lab.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="live.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observers.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observer-detail.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="compare.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="node-analytics.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="perf.js?v=1775023114" onerror="console.error('Failed to load:', this.src)"></script>
<script src="roles.js?v=1775023782"></script>
<script src="customize.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="region-filter.js?v=1775023782"></script>
<script src="hop-resolver.js?v=1775023782"></script>
<script src="hop-display.js?v=1775023782"></script>
<script src="app.js?v=1775023782"></script>
<script src="home.js?v=1775023782"></script>
<script src="packet-filter.js?v=1775023782"></script>
<script src="packets.js?v=1775023782"></script>
<script src="geo-filter-overlay.js?v=1775023782"></script>
<script src="map.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="channels.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="nodes.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="traces.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="analytics.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v1-constellation.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v2-constellation.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-lab.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="live.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observers.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observer-detail.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="compare.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="node-analytics.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
<script src="perf.js?v=1775023782" onerror="console.error('Failed to load:', this.src)"></script>
</body>
</html>
+7
View File
@@ -324,6 +324,13 @@
// Check if new packets pass current filters
const filtered = newPkts.filter(p => {
// Respect time window filter — drop packets outside the selected window
const windowMin = savedTimeWindowMin;
if (windowMin > 0) {
const cutoff = new Date(Date.now() - windowMin * 60000).toISOString();
const pktTime = p.latest || p.timestamp || p.first_seen;
if (pktTime && pktTime < cutoff) return false;
}
if (filters.type) { const types = filters.type.split(',').map(Number); if (!types.includes(p.payload_type)) return false; }
if (filters.observer) { const obsSet = new Set(filters.observer.split(',')); if (!obsSet.has(p.observer_id)) return false; }
if (filters.hash && p.hash !== filters.hash) return false;