grpcDecodeFrame function

Map<String, Object?> grpcDecodeFrame(
  1. List<int> buffer,
  2. int offset
)

Decode a single gRPC frame from buffer starting at offset.

Returns a map with:

  • messageBytes (List<int>): the decoded message payload.
  • compressed (bool): whether the compression flag was set.
  • bytesRead (int): total bytes consumed (header + payload), so the caller can advance the read position.

Throws RangeError if buffer does not contain a complete frame at the given offset.

Implementation

Map<String, Object?> grpcDecodeFrame(List<int> buffer, int offset) {
  if (offset + _headerSize > buffer.length) {
    throw RangeError('Incomplete gRPC frame header at offset $offset');
  }
  var compressed = buffer[offset] != 0;
  var length =
      ((buffer[offset + 1] << 24) |
          (buffer[offset + 2] << 16) |
          (buffer[offset + 3] << 8) |
          buffer[offset + 4]) &
      0xFFFFFFFF;
  if (offset + _headerSize + length > buffer.length) {
    throw RangeError(
      'Incomplete gRPC frame payload at offset $offset: '
      'expected $length bytes, '
      'have ${buffer.length - offset - _headerSize}',
    );
  }
  var messageBytes = buffer.sublist(
    offset + _headerSize,
    offset + _headerSize + length,
  );
  return {
    'messageBytes': messageBytes,
    'compressed': compressed,
    'bytesRead': _headerSize + length,
  };
}