frameLargePayload function

Uint8List frameLargePayload(
  1. Uint8List payload,
  2. int sequenceID
)

Frames a payload of mysqlMaxPacketPayloadLength bytes or more as packets of mysqlMaxPacketPayloadLength bytes followed by a shorter (possibly empty) one, with consecutive sequence ids. The length field used to be truncated instead, which desynchronized the connection.

Implementation

Uint8List frameLargePayload(Uint8List payload, int sequenceID) {
  final packets = payload.length ~/ mysqlMaxPacketPayloadLength + 1;
  final out = Uint8List(payload.length + packets * 4);
  var source = 0;
  var target = 0;
  for (var i = 0; i < packets; i++) {
    final remaining = payload.length - source;
    final length = remaining < mysqlMaxPacketPayloadLength
        ? remaining
        : mysqlMaxPacketPayloadLength;
    out[target] = length & 0xff;
    out[target + 1] = (length >> 8) & 0xff;
    out[target + 2] = (length >> 16) & 0xff;
    out[target + 3] = (sequenceID + i) & 0xff;
    out.setRange(target + 4, target + 4 + length, payload, source);
    source += length;
    target += 4 + length;
  }
  return out;
}