grpcEncodeFrame function

List<int> grpcEncodeFrame(
  1. List<int> messageBytes, {
  2. bool compressed = false,
})

Encode a gRPC frame: 1-byte compression flag + 4-byte big-endian length + message bytes.

messageBytes is the raw protobuf-encoded message payload. compressed indicates whether the payload has been compressed; false writes 0x00, true writes 0x01.

Returns the complete length-prefixed frame as a byte list.

Implementation

List<int> grpcEncodeFrame(List<int> messageBytes, {bool compressed = false}) {
  var length = messageBytes.length;
  var frame = List<int>.filled(_headerSize + length, 0);
  // Byte 0: compression flag.
  frame[0] = compressed ? 1 : 0;
  // Bytes 1-4: message length, big-endian.
  frame[1] = (length >>> 24) & 0xFF;
  frame[2] = (length >>> 16) & 0xFF;
  frame[3] = (length >>> 8) & 0xFF;
  frame[4] = length & 0xFF;
  // Bytes 5+: message payload.
  for (var i = 0; i < length; i++) {
    frame[_headerSize + i] = messageBytes[i];
  }
  return frame;
}