From 759ae56bdc1d992a87070f6476d2d4c5de1f2ced Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sat, 7 Dec 2024 11:41:03 -0600 Subject: [PATCH] add sdt NAK data decoding --- README.md | 2 +- packages/acn/src/models.ts | 20 +++++++++++++++++++- packages/acn/src/pdu/sdt.ts | 26 +++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fa46500..1293b2d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ not sure how far I will take this but messing around with E1.17 ACN protocol - [x] JOIN_REFUSE - [x] JOIN_ACCEPT - [x] LEAVING - - [ ] NAK + - [x] NAK - [x] REL_WRAP - [x] UNREL_WRAP - [x] GET_SESSIONS diff --git a/packages/acn/src/models.ts b/packages/acn/src/models.ts index addb466..e9a49e3 100644 --- a/packages/acn/src/models.ts +++ b/packages/acn/src/models.ts @@ -111,6 +111,15 @@ export type SDTAckData = { reliableSequenceNumber: number; }; +export type SDTNakData = { + leaderComponenetID: string; + channelNumber: number; + memberID: number; + reliableSequenceNumber: number; + firstMissedSequence: number; + lastMissedSequence: number; +}; + export type SDTGetSessionsData = { componentID: string; }; @@ -118,7 +127,16 @@ export type SDTGetSessionsData = { export type SessionDataTransportPDU = { vector: SessionDataTransportVectors; // TODO(jwetzell): cleanup these types - data: SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | SDTLeavingData | SDTGetSessionsData | Uint8Array; + data: + | SDTJoinData + | SDTJoinAcceptData + | SDTJoinRefuseData + | SDTWrapperData + | SDTAckData + | SDTLeavingData + | SDTGetSessionsData + | SDTNakData + | Uint8Array; }; export type SDTClientBlock = { diff --git a/packages/acn/src/pdu/sdt.ts b/packages/acn/src/pdu/sdt.ts index 02e2a34..a5e593d 100644 --- a/packages/acn/src/pdu/sdt.ts +++ b/packages/acn/src/pdu/sdt.ts @@ -6,6 +6,7 @@ import { SDTJoinData, SDTJoinRefuseData, SDTLeavingData, + SDTNakData, SDTWrapperData, SessionDataTransportPDU, SessionDataTransportVectors, @@ -125,7 +126,16 @@ function decodeClientBlock(bytes: Uint8Array) { function decodeData( vector: SessionDataTransportVectors, bytes: Uint8Array -): SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | SDTLeavingData | SDTGetSessionsData | Uint8Array { +): + | SDTJoinData + | SDTJoinAcceptData + | SDTJoinRefuseData + | SDTWrapperData + | SDTAckData + | SDTLeavingData + | SDTGetSessionsData + | SDTNakData + | Uint8Array { const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); switch (vector) { case SessionDataTransportVectors.JOIN: { @@ -212,8 +222,18 @@ function decodeData( } case SessionDataTransportVectors.GET_SESSIONS: { return { - componentID: toHex(bytes.subarray(0, 16)) - } + componentID: toHex(bytes.subarray(0, 16)), + }; + } + case SessionDataTransportVectors.NAK: { + return { + leaderComponentID: toHex(bytes.subarray(0, 16)), + channelNumber: view.getUint16(16), + memberID: view.getUint16(18), + reliableSequenceNumber: view.getUint32(20), + firstMissedSequence: view.getUint32(24), + lastMissedSequence: view.getUint32(28), + }; } default: console.error(`unhandled SDT vector: ${vector}`);