Skip to content

Commit cb1fb54

Browse files
authored
fix(segmentation): correctly reassemble segmented ComplexACK responses (#71)
## Summary This PR fixes segmented response handling for BACnet `ComplexACK` messages. ## Problem Some devices return segmented `ComplexACK` responses (e.g. large object/property payloads). The client could enter an invalid APDU state during reassembly, resulting in abort/error behavior and missing response payload. ## Root Cause Segment flags/state were not handled consistently across segmented frames and final reassembled APDU processing. ## Changes - Correct segmented `ComplexACK` reassembly flow. - Clear segmented state/flags after full APDU is reassembled. - Ensure final payload is passed once through normal decode path after reassembly. ## Impact - Stabilizes reads from devices that require segmentation. - Prevents invalid state transitions/abort loops in segmented exchanges. - Improves compatibility with larger BACnet payloads. ## Validation - Verified against real-device traffic with segmented `ComplexACK`. - Confirmed reassembled response is decoded successfully. - Confirmed no regression for non-segmented responses. ## Compatibility Backward compatible. No API changes.
1 parent 9fbac5d commit cb1fb54

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

src/lib/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ export default class BACnetClient extends TypedEventEmitter<BACnetClientEvents>
361361
if (!moreFollows) {
362362
const apduBuffer = Buffer.concat(this._segmentStore)
363363
this._segmentStore = []
364-
msg.type &= ~PduConReqBit.SEGMENTED_MESSAGE
364+
msg.header.apduType &= ~PduConReqBit.SEGMENTED_MESSAGE
365365
this._handlePdu(apduBuffer, 0, apduBuffer.length, msg.header)
366366
}
367367
}
@@ -589,7 +589,7 @@ export default class BACnetClient extends TypedEventEmitter<BACnetClientEvents>
589589
| ConfirmedServiceRequestMessage
590590
| ComplexAckMessage
591591
),
592-
true,
592+
false,
593593
buffer,
594594
offset + msg.len,
595595
length - msg.len,

0 commit comments

Comments
 (0)