From fc8c663fc325cbd657a0744abebdc0bc733ea129 Mon Sep 17 00:00:00 2001 From: Patrick Skillen Date: Mon, 1 Jun 2026 10:16:06 +0100 Subject: [PATCH] feat(meshcore): forward path_hash_size and path_hash_mode on ingest --- src/meshcore/serializers.py | 7 +++++ test/test_meshcore_path_hashes.py | 44 +++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/meshcore/serializers.py b/src/meshcore/serializers.py index e1347d1..9c708d4 100644 --- a/src/meshcore/serializers.py +++ b/src/meshcore/serializers.py @@ -79,6 +79,11 @@ def _build_from_envelope(envelope: dict[str, Any]) -> dict[str, Any]: payload = envelope.get("payload") or {} attributes = envelope.get("attributes") or {} + path_hash_size = payload.get("path_hash_size") + if path_hash_size is None: + path_hash_size = 2 + path_hash_mode = payload.get("path_hash_mode") + base: dict[str, Any] = { "event_type": event_type, "rx_time": _rx_time_from_payload(payload, attributes), @@ -86,6 +91,8 @@ def _build_from_envelope(envelope: dict[str, Any]) -> dict[str, Any]: "rx_snr": payload.get("snr"), "route_typename": payload.get("route_typename"), "path_hashes": _path_hashes(payload), + "path_hash_size": int(path_hash_size) if path_hash_size is not None else None, + "path_hash_mode": int(path_hash_mode) if path_hash_mode is not None else None, "pkt_hash": payload.get("pkt_hash"), "raw": _json_safe(envelope), } diff --git a/test/test_meshcore_path_hashes.py b/test/test_meshcore_path_hashes.py index 452b335..768bf74 100644 --- a/test/test_meshcore_path_hashes.py +++ b/test/test_meshcore_path_hashes.py @@ -1,6 +1,6 @@ -"""Unit tests for MeshCore path hash splitting (_path_hashes).""" +"""Unit tests for MeshCore path hash splitting (_path_hashes) and ingest envelope.""" -from src.meshcore.serializers import _path_hashes +from src.meshcore.serializers import MeshCorePacketSerializer, _path_hashes def test_path_hashes_two_byte_default(): @@ -26,3 +26,43 @@ def test_path_hashes_missing_path_returns_none(): def test_path_hashes_list_passthrough(): payload = {"path": ["aa", "bb"]} assert _path_hashes(payload) == ["aa", "bb"] + + +def test_channel_message_envelope_includes_path_hash_size_and_mode(): + serializer = MeshCorePacketSerializer() + envelope = { + "protocol": "meshcore", + "event_type": "channel_message", + "payload": { + "text": "hi", + "channel_idx": 0, + "path": "aabb", + "path_hash_size": 1, + "path_hash_mode": 2, + "recv_time": 1700000000.0, + }, + "attributes": {}, + } + result = serializer.serialise_raw_packet(envelope) + assert result["path_hashes"] == ["aa", "bb"] + assert result["path_hash_size"] == 1 + assert result["path_hash_mode"] == 2 + + +def test_contact_message_envelope_defaults_path_hash_size_to_two(): + serializer = MeshCorePacketSerializer() + envelope = { + "protocol": "meshcore", + "event_type": "contact_message", + "payload": { + "text": "dm", + "pubkey_prefix": "ab" * 6, + "channel_idx": 0, + "path": "f3bcf1", + "recv_time": 1700000000.0, + }, + "attributes": {}, + } + result = serializer.serialise_raw_packet(envelope) + assert result["path_hash_size"] == 2 + assert result["path_hash_mode"] is None