splitCoalescedPackets function
Implementation
List<Uint8List> splitCoalescedPackets(Uint8List buf) {
final out = <Uint8List>[];
int i = 0;
while (i < buf.length) {
// Need at least 5 bytes for long header
if (i + 5 > buf.length) break;
final flags = buf[i];
final isLong = (flags & 0x80) != 0;
if (isLong) {
int p = i + 1;
// ---- Version (4 bytes) ----
if (p + 4 > buf.length) break;
p += 4;
// ---- DCID ----
if (p >= buf.length) break;
final dcidLen = buf[p++];
if (p + dcidLen > buf.length) break;
p += dcidLen;
// ---- SCID ----
if (p >= buf.length) break;
final scidLen = buf[p++];
if (p + scidLen > buf.length) break;
p += scidLen;
// ---- Token Length (ONLY Initial packets) ----
final packetType = (flags >> 4) & 0x03;
if (packetType == 0x00) {
// Initial packet → token field present
final token = readVarInt(buf, p);
if (token == null) break;
p += token.byteLength;
if (p + token.value > buf.length) break;
p += token.value;
}
// ---- Length field (varint) ----
final lengthField = readVarInt(buf, p);
if (lengthField == null) break;
final payloadLen = lengthField.value;
p += lengthField.byteLength;
// ---- Bounds check to avoid RangeError ----
final pktEnd = p + payloadLen;
if (pktEnd > buf.length) {
throw RangeError(
"QUIC long header claims payload length $payloadLen but only "
"${buf.length - p} bytes remain",
);
}
// ---- Extract packet ----
out.add(buf.sublist(i, pktEnd));
// Move to next packet
i = pktEnd;
continue;
}
// ------------------------------
// Short header → runs to end of UDP datagram
// ------------------------------
out.add(buf.sublist(i));
break;
}
return out;
}