mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-08-06 23:59:47 +00:00
Use longest path sibling for grouped packets
When the same packet is received multiple times (different hop counts as it propagates), use the reception with the most hops for display. Fixes routes showing incomplete paths when the first reception had fewer hops than later ones. Applies to both grouped query and individual packet detail endpoint.
This commit is contained in:
@@ -291,7 +291,7 @@ app.get('/api/packets', (req, res) => {
|
||||
if (until) { where.push('timestamp < @until'); params.until = until; }
|
||||
if (node) { where.push("(decoded_json LIKE @nodePattern OR decoded_json LIKE @nodeNamePattern)"); params.nodePattern = `%${node}%`; const n = db.db.prepare('SELECT name FROM nodes WHERE public_key = ?').get(node); params.nodeNamePattern = n ? `%${n.name}%` : `%${node}%`; }
|
||||
const clause = where.length ? 'WHERE ' + where.join(' AND ') : '';
|
||||
const packets = db.db.prepare(`SELECT hash, COUNT(DISTINCT observer_id) as observer_count, COUNT(*) as count, MAX(timestamp) as latest, (SELECT observer_id FROM packets pObs WHERE pObs.hash = packets.hash ORDER BY pObs.timestamp ASC LIMIT 1) as observer_id, (SELECT observer_name FROM packets pOn WHERE pOn.hash = packets.hash ORDER BY pOn.timestamp ASC LIMIT 1) as observer_name, (SELECT path_json FROM packets p2 WHERE p2.hash = packets.hash ORDER BY p2.timestamp DESC LIMIT 1) as path_json, (SELECT payload_type FROM packets p3 WHERE p3.hash = packets.hash ORDER BY p3.timestamp DESC LIMIT 1) as payload_type, (SELECT raw_hex FROM packets p4 WHERE p4.hash = packets.hash ORDER BY p4.timestamp DESC LIMIT 1) as raw_hex, (SELECT decoded_json FROM packets p5 WHERE p5.hash = packets.hash ORDER BY p5.timestamp DESC LIMIT 1) as decoded_json FROM packets ${clause} GROUP BY hash ORDER BY latest DESC LIMIT @limit OFFSET @offset`).all({ ...params, limit: Number(limit), offset: Number(offset) });
|
||||
const packets = db.db.prepare(`SELECT hash, COUNT(DISTINCT observer_id) as observer_count, COUNT(*) as count, MAX(timestamp) as latest, (SELECT observer_id FROM packets pObs WHERE pObs.hash = packets.hash ORDER BY pObs.timestamp ASC LIMIT 1) as observer_id, (SELECT observer_name FROM packets pOn WHERE pOn.hash = packets.hash ORDER BY pOn.timestamp ASC LIMIT 1) as observer_name, (SELECT path_json FROM packets p2 WHERE p2.hash = packets.hash ORDER BY LENGTH(path_json) DESC LIMIT 1) as path_json, (SELECT payload_type FROM packets p3 WHERE p3.hash = packets.hash ORDER BY p3.timestamp DESC LIMIT 1) as payload_type, (SELECT raw_hex FROM packets p4 WHERE p4.hash = packets.hash ORDER BY LENGTH(raw_hex) DESC LIMIT 1) as raw_hex, (SELECT decoded_json FROM packets p5 WHERE p5.hash = packets.hash ORDER BY p5.timestamp DESC LIMIT 1) as decoded_json FROM packets ${clause} GROUP BY hash ORDER BY latest DESC LIMIT @limit OFFSET @offset`).all({ ...params, limit: Number(limit), offset: Number(offset) });
|
||||
const total = db.db.prepare(`SELECT COUNT(DISTINCT hash) as count FROM packets ${clause}`).get(params).count;
|
||||
return res.json({ packets, total });
|
||||
}
|
||||
@@ -324,6 +324,15 @@ app.get('/api/packets/:id', (req, res) => {
|
||||
const packet = db.getPacket(Number(req.params.id));
|
||||
if (!packet) return res.status(404).json({ error: 'Not found' });
|
||||
|
||||
// Use the sibling with the longest path (most hops) for display
|
||||
if (packet.hash) {
|
||||
const best = db.db.prepare('SELECT id, path_json, raw_hex FROM packets WHERE hash = ? ORDER BY LENGTH(path_json) DESC LIMIT 1').get(packet.hash);
|
||||
if (best && best.path_json && best.path_json.length > (packet.path_json || '').length) {
|
||||
packet.path_json = best.path_json;
|
||||
packet.raw_hex = best.raw_hex;
|
||||
}
|
||||
}
|
||||
|
||||
const pathHops = packet.paths || [];
|
||||
let decoded;
|
||||
try { decoded = JSON.parse(packet.decoded_json); } catch { decoded = null; }
|
||||
|
||||
Reference in New Issue
Block a user