From 1e3da4571d5f2ba3d6573960e4d44a800b049646 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sun, 8 Dec 2024 11:03:40 -0600 Subject: [PATCH] add support for decoding all PDUs in an SDT PDU --- packages/acn/src/pdu/rlp.ts | 15 ++++++++++++--- packages/acn/src/pdu/sdt.ts | 1 + packages/acn/src/types.ts | 3 ++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/acn/src/pdu/rlp.ts b/packages/acn/src/pdu/rlp.ts index bf5c45e..4c3d132 100644 --- a/packages/acn/src/pdu/rlp.ts +++ b/packages/acn/src/pdu/rlp.ts @@ -51,12 +51,21 @@ function decode(bytes: Uint8Array): RootLayerPDU { const dataOffset = headerOffset + 16; // NOTE(jwetzell): flags/lengthH + lengthL + lengthX + vector + header const dataLength = length - (1 + 1 + (lengthFlag ? 1 : 0) + 4 + 16); - let data: SessionDataTransportPDU | Uint8Array = bytes.subarray(dataOffset, dataOffset + dataLength); + let data: SessionDataTransportPDU[] | Uint8Array = bytes.subarray(dataOffset, dataOffset + dataLength); if (vector === Protocol.SDT) { - data = pdu.sdt.decode(data); + const blocks: SessionDataTransportPDU[] = []; + + let blockDataOffset = 0; + // TODO(jwetzell): this could blow up so might need some attention later? + while (blockDataOffset < dataLength) { + const blockData = pdu.sdt.decode(bytes.subarray(dataOffset + blockDataOffset)); + blocks.push(blockData); + blockDataOffset += blockData.length; + } + data = blocks; } else { - console.error(`unhandled protocol in RLP: ${vector}`) + console.error(`unhandled protocol in RLP: ${vector}`); } return { diff --git a/packages/acn/src/pdu/sdt.ts b/packages/acn/src/pdu/sdt.ts index 3e6e8c4..e87cf7e 100644 --- a/packages/acn/src/pdu/sdt.ts +++ b/packages/acn/src/pdu/sdt.ts @@ -62,6 +62,7 @@ export function decode(bytes: Uint8Array): SessionDataTransportPDU { return { vector, + length, data, }; } diff --git a/packages/acn/src/types.ts b/packages/acn/src/types.ts index fe4eb3f..5398bac 100644 --- a/packages/acn/src/types.ts +++ b/packages/acn/src/types.ts @@ -15,7 +15,7 @@ export type ACNPacket = { export type RootLayerPDU = { vector: number; header: string; - data: SessionDataTransportPDU | Uint8Array; + data: SessionDataTransportPDU[] | Uint8Array; }; export type SDTChannelParams = { @@ -114,6 +114,7 @@ export type SDTGetSessionsData = { export type SessionDataTransportPDU = { vector: SDTVector; + length: number; // TODO(jwetzell): cleanup these types data: | SDTJoinData