toBytes method

  1. @override
Uint8List toBytes()
override

Serialize the frame into a byte list.

Implementation

@override
Uint8List toBytes() {
  final buffer = Uint8List(length);
  final view = ByteData.view(buffer.buffer);
  int offset = 0;

  view.setUint8(offset, FrameType.ack.code);
  offset += 1;

  view.setUint32(offset, largestAcked, Endian.big);
  offset += 4;

  view.setUint16(offset, ackDelay, Endian.big);
  offset += 2;

  // One-byte fields: a value that doesn't fit would be truncated into an ACK
  // for sequences that never arrived, so refuse it (see fromReceived).
  if (ackRanges.length > maxRanges || ackRanges.any((r) => r.gap > maxGap)) {
    throw ArgumentError('ACK range count or gap does not fit its one-byte field');
  }
  view.setUint8(offset, ackRanges.length); // Count of *additional* ranges
  offset += 1;

  view.setUint32(offset, firstAckRangeLength, Endian.big);
  offset += 4;

  for (final range in ackRanges) {
    view.setUint8(offset, range.gap);
    offset += 1;
    view.setUint32(offset, range.ackRangeLength, Endian.big);
    offset += 4;
  }
  return buffer;
}