From 5bfd9f4af28435bdff4c7e8cbb481969a849f590 Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Mon, 9 Mar 2026 12:45:51 -0700 Subject: [PATCH] Use updated meshcore-decoder library with TRACE patch and fixup frontend routing display on packet list --- LICENSES.md | 2 +- frontend/package-lock.docker.json | 28 ++++++++++++++++++----- frontend/package.json | 2 +- frontend/src/components/RawPacketList.tsx | 8 +++---- frontend/src/test/rawPacketList.test.tsx | 27 ++++++++++++++++++++++ 5 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 frontend/src/test/rawPacketList.test.tsx diff --git a/LICENSES.md b/LICENSES.md index d72941d..e7caa58 100644 --- a/LICENSES.md +++ b/LICENSES.md @@ -562,7 +562,7 @@ THE SOFTWARE. -### @michaelhart/meshcore-decoder (0.2.7) — MIT +### @michaelhart/meshcore-decoder (0.3.0) — MIT
Full license text diff --git a/frontend/package-lock.docker.json b/frontend/package-lock.docker.json index 521db13..b760184 100644 --- a/frontend/package-lock.docker.json +++ b/frontend/package-lock.docker.json @@ -1,16 +1,16 @@ { "name": "remoteterm-meshcore-frontend", - "version": "2.7.1", + "version": "2.7.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "remoteterm-meshcore-frontend", - "version": "2.7.1", + "version": "2.7.9", "dependencies": { "@codemirror/lang-python": "^6.2.1", "@codemirror/theme-one-dark": "^6.1.3", - "@michaelhart/meshcore-decoder": "npm:meshcore-decoder-multibyte-patch@0.2.7", + "@michaelhart/meshcore-decoder": "npm:meshcore-decoder-multibyte-patch@0.3.0", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-label": "^2.1.8", @@ -1345,9 +1345,9 @@ }, "node_modules/@michaelhart/meshcore-decoder": { "name": "meshcore-decoder-multibyte-patch", - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/meshcore-decoder-multibyte-patch/-/meshcore-decoder-multibyte-patch-0.2.7.tgz", - "integrity": "sha512-sk0SIsIg3wSaQKAmdROTzZw7xebRXwaR1d5O+Z6l+Ya956hcSel+8AOmSJUBo7kVA7MmCsHWtTdb9majDmRl0w==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/meshcore-decoder-multibyte-patch/-/meshcore-decoder-multibyte-patch-0.3.0.tgz", + "integrity": "sha512-qcGsi1/PbtCTQbZ7rf9G3iSk55eouiGaroeS1ZS+jiKWBELZPV3++xjRup2+xX0rjQtnX5Gg4SCcLvF7Y0M6Sg==", "license": "MIT", "dependencies": { "@noble/ed25519": "^2.3.0", @@ -5000,6 +5000,22 @@ "crypto-js": "^4.2.0" } }, + "node_modules/meshcore-hashtag-cracker/node_modules/@michaelhart/meshcore-decoder": { + "name": "meshcore-decoder-multibyte-patch", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/meshcore-decoder-multibyte-patch/-/meshcore-decoder-multibyte-patch-0.2.7.tgz", + "integrity": "sha512-sk0SIsIg3wSaQKAmdROTzZw7xebRXwaR1d5O+Z6l+Ya956hcSel+8AOmSJUBo7kVA7MmCsHWtTdb9majDmRl0w==", + "license": "MIT", + "dependencies": { + "@noble/ed25519": "^2.3.0", + "chalk": "^4.1.2", + "commander": "^12.0.0", + "crypto-js": "^4.2.0" + }, + "bin": { + "meshcore-decoder": "dist/cli.js" + } + }, "node_modules/meshoptimizer": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 3bca246..a45bb48 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,7 +17,7 @@ "dependencies": { "@codemirror/lang-python": "^6.2.1", "@codemirror/theme-one-dark": "^6.1.3", - "@michaelhart/meshcore-decoder": "npm:meshcore-decoder-multibyte-patch@0.2.7", + "@michaelhart/meshcore-decoder": "npm:meshcore-decoder-multibyte-patch@0.3.0", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-label": "^2.1.8", diff --git a/frontend/src/components/RawPacketList.tsx b/frontend/src/components/RawPacketList.tsx index 3c79384..ad26c16 100644 --- a/frontend/src/components/RawPacketList.tsx +++ b/frontend/src/components/RawPacketList.tsx @@ -157,9 +157,9 @@ function getRouteTypeColor(routeType: string): string { return 'bg-info/20 text-info'; case 'Direct': return 'bg-success/20 text-success'; - case 'Transport Flood': + case 'TransportFlood': return 'bg-purple-500/20 text-purple-400'; - case 'Transport Direct': + case 'TransportDirect': return 'bg-orange-500/20 text-orange-400'; default: return 'bg-muted text-muted-foreground'; @@ -173,9 +173,9 @@ function getRouteTypeLabel(routeType: string): string { return 'F'; case 'Direct': return 'D'; - case 'Transport Flood': + case 'TransportFlood': return 'TF'; - case 'Transport Direct': + case 'TransportDirect': return 'TD'; default: return '?'; diff --git a/frontend/src/test/rawPacketList.test.tsx b/frontend/src/test/rawPacketList.test.tsx new file mode 100644 index 0000000..4b558b8 --- /dev/null +++ b/frontend/src/test/rawPacketList.test.tsx @@ -0,0 +1,27 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +import { RawPacketList } from '../components/RawPacketList'; +import type { RawPacket } from '../types'; + +function createPacket(overrides: Partial = {}): RawPacket { + return { + id: 1, + timestamp: 1700000000, + data: '000000000000', + payload_type: 'REQ', + snr: null, + rssi: null, + decrypted: false, + decrypted_info: null, + ...overrides, + }; +} + +describe('RawPacketList', () => { + it('renders TF badge for transport-flood packets', () => { + render(); + + expect(screen.getByText('TF')).toBeInTheDocument(); + }); +});