diff --git a/Sources/SwiftNetwork/QUIC/StreamSendBuffer.swift b/Sources/SwiftNetwork/QUIC/StreamSendBuffer.swift index a690804..dfc440e 100644 --- a/Sources/SwiftNetwork/QUIC/StreamSendBuffer.swift +++ b/Sources/SwiftNetwork/QUIC/StreamSendBuffer.swift @@ -192,38 +192,36 @@ struct StreamSendBuffer: ~Copyable { acknowledgedOffset = storageStartOffset } - // Record the newly acked range - acknowledgedDataRanges.insert(contentsOf: acknowledgedOffset.. oldStartOffset else { - // No change, ignore + // ACK is contiguous with storageStartOffset and in-order + if acknowledgedOffset == storageStartOffset { + var newStartOffset = totalAcknowledgedOffset + var consumed = 0 + while consumed < acknowledgedDataRanges.ranges.count + && acknowledgedDataRanges.ranges[consumed].lowerBound <= newStartOffset + { + newStartOffset = max(newStartOffset, acknowledgedDataRanges.ranges[consumed].upperBound) + consumed += 1 + } + // Remove the consumed in one shot + if consumed > 0 { + acknowledgedDataRanges.remove(contentsOf: 0..