diff --git a/packages/acn/src/models.ts b/packages/acn/src/models.ts index 0a4df2f..0eae7e9 100644 --- a/packages/acn/src/models.ts +++ b/packages/acn/src/models.ts @@ -88,6 +88,14 @@ export type SDTJoinRefuseData = { refuseCode: number; }; +export type SDTLeavingData = { + leaderComponentID: string; + channelNumber: number; + memberID: number; + reliableSequenceNumber: number; + reasonCode: number; +}; + export type SDTWrapperData = { channelNumber: number; totalSequenceNumber: number; @@ -106,7 +114,7 @@ export type SDTAckData = { export type SessionDataTransportPDU = { vector: SessionDataTransportVectors; // TODO(jwetzell): cleanup these types - data: SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | Uint8Array; + data: SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | SDTLeavingData| Uint8Array; }; export type SDTClientBlock = { diff --git a/packages/acn/src/pdu/sdt.ts b/packages/acn/src/pdu/sdt.ts index de68d41..72eefec 100644 --- a/packages/acn/src/pdu/sdt.ts +++ b/packages/acn/src/pdu/sdt.ts @@ -1,4 +1,4 @@ -import { Protocols, SDTAckData, SDTJoinAcceptData, SDTJoinData, SDTJoinRefuseData, SDTWrapperData, SessionDataTransportPDU, SessionDataTransportVectors, TransportLayerAddress } from '../models'; +import { Protocols, SDTAckData, SDTJoinAcceptData, SDTJoinData, SDTJoinRefuseData, SDTLeavingData, SDTWrapperData, SessionDataTransportPDU, SessionDataTransportVectors, TransportLayerAddress } from '../models'; import { toHex } from '../utils'; // TODO(jwetzell): work out flag inheritance, will need previous PDU @@ -114,7 +114,7 @@ function decodeClientBlock(bytes: Uint8Array) { } -function decodeData(vector: SessionDataTransportVectors, bytes: Uint8Array): SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | Uint8Array { +function decodeData(vector: SessionDataTransportVectors, bytes: Uint8Array): SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | SDTLeavingData | Uint8Array { const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength) switch (vector) { case SessionDataTransportVectors.JOIN: { @@ -190,6 +190,15 @@ function decodeData(vector: SessionDataTransportVectors, bytes: Uint8Array): SDT reliableSequenceNumber: view.getUint32(0), }; } + case SessionDataTransportVectors.LEAVING: { + return { + leaderComponentID: toHex(bytes.subarray(0, 16)), + channelNumber: view.getUint16(16), + memberID: view.getUint16(18), + reliableSequenceNumber: view.getUint32(20), + reasonCode: view.getUint8(24), + }; + } default: console.error(`unhandled SDT vector: ${vector}`); return bytes;