From 7ba63d5f54d99970b53e3e219f243b7162ed69a6 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Wed, 11 Feb 2026 01:05:30 +1300 Subject: [PATCH 1/3] parse transport codes --- src/packet.js | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/packet.js b/src/packet.js index c3cfa2e..53a2f46 100644 --- a/src/packet.js +++ b/src/packet.js @@ -10,10 +10,10 @@ class Packet { static PH_VER_SHIFT = 6; static PH_VER_MASK = 0x03; // 2-bits - static ROUTE_TYPE_RESERVED1 = 0x00; // FUTURE + static ROUTE_TYPE_TRANSPORT_FLOOD = 0x00; // flood mode + transport codes static ROUTE_TYPE_FLOOD = 0x01; // flood mode, needs 'path' to be built up (max 64 bytes) static ROUTE_TYPE_DIRECT = 0x02; // direct route, 'path' is supplied - static ROUTE_TYPE_RESERVED2 = 0x03; // FUTURE + static ROUTE_TYPE_TRANSPORT_DIRECT = 0x03; // direct route + transport codes static PAYLOAD_TYPE_REQ = 0x00; // request (prefixed with dest/src hashes, MAC) (enc data: timestamp, blob) static PAYLOAD_TYPE_RESPONSE = 0x01; // response to REQ or ANON_REQ (prefixed with dest/src hashes, MAC) (enc data: timestamp, blob) @@ -27,12 +27,14 @@ class Packet { static PAYLOAD_TYPE_TRACE = 0x09; // trace a path, collecting SNR for each hop static PAYLOAD_TYPE_RAW_CUSTOM = 0x0F; // custom packet as raw bytes, for applications with custom encryption, payloads, etc - constructor(header, path, payload) { + constructor(header, path, payload, transportCode1, transportCode2) { this.header = header; this.path = path; this.payload = payload; + this.transportCode1 = transportCode1; + this.transportCode2 = transportCode2; // parsed info this.route_type = this.getRouteType(); @@ -45,12 +47,28 @@ class Packet { } static fromBytes(bytes) { + const bufferReader = new BufferReader(bytes); const header = bufferReader.readByte(); + + // check if packet has transport codes + const routeType = header & Packet.PH_ROUTE_MASK; + const hasTransportCodes = routeType === Packet.ROUTE_TYPE_TRANSPORT_FLOOD || routeType === Packet.ROUTE_TYPE_TRANSPORT_DIRECT; + + // parse transport codes + var transportCode1 = null; + var transportCode2 = null; + if(hasTransportCodes){ + transportCode1 = bufferReader.readUInt16LE(); + transportCode2 = bufferReader.readUInt16LE(); + } + const pathLen = bufferReader.readInt8(); const path = bufferReader.readBytes(pathLen); const payload = bufferReader.readRemainingBytes(); - return new Packet(header, path, payload); + + return new Packet(header, path, payload, transportCode1, transportCode2); + } getRouteType() { @@ -61,6 +79,8 @@ class Packet { switch(this.getRouteType()){ case Packet.ROUTE_TYPE_FLOOD: return "FLOOD"; case Packet.ROUTE_TYPE_DIRECT: return "DIRECT"; + case Packet.ROUTE_TYPE_TRANSPORT_FLOOD: return "TRANSPORT_FLOOD"; + case Packet.ROUTE_TYPE_TRANSPORT_DIRECT: return "TRANSPORT_DIRECT"; default: return null; } } From 438478ee3d1b27a3c54aad2e88c6d18a954981ad Mon Sep 17 00:00:00 2001 From: liamcottle Date: Wed, 11 Feb 2026 01:09:45 +1300 Subject: [PATCH 2/3] 1.11.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 80cb09b..3bef957 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@liamcottle/meshcore.js", - "version": "1.10.0", + "version": "1.11.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@liamcottle/meshcore.js", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT", "dependencies": { "@noble/curves": "^1.8.1", diff --git a/package.json b/package.json index 6aae9f0..b13a697 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@liamcottle/meshcore.js", - "version": "1.10.0", + "version": "1.11.0", "description": "", "main": "src/index.js", "type": "module", From f59b0f7ce4485b6f5d000e1e46d6f3fc341cffe1 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Wed, 11 Feb 2026 09:56:26 +1300 Subject: [PATCH 3/3] parse feature flags if present in advert app data --- src/advert.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/advert.js b/src/advert.js index 8e4bed9..5349436 100644 --- a/src/advert.js +++ b/src/advert.js @@ -9,8 +9,8 @@ class Advert { static ADV_TYPE_ROOM = 3; static ADV_LATLON_MASK = 0x10; - static ADV_BATTERY_MASK = 0x20; - static ADV_TEMPERATURE_MASK = 0x40; + static ADV_FEAT1_MASK = 0x20; + static ADV_FEAT2_MASK = 0x40; static ADV_NAME_MASK = 0x80; constructor(publicKey, timestamp, signature, appData) { @@ -81,6 +81,18 @@ class Advert { lon = bufferReader.readInt32LE(); } + // parse feat1 + var feat1 = null; + if(flags & Advert.ADV_FEAT1_MASK){ + feat1 = bufferReader.readUInt16LE(); + } + + // parse feat2 + var feat2 = null; + if(flags & Advert.ADV_FEAT2_MASK){ + feat2 = bufferReader.readUInt16LE(); + } + // parse name (remainder of app data) var name = null; if(flags & Advert.ADV_NAME_MASK){ @@ -92,6 +104,8 @@ class Advert { lat: lat, lon: lon, name: name, + feat1: feat1, + feat2: feat2, }; }