grpcDecodeFrameWithFlags function

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

Decode a single frame from buffer at offset, exposing the full flag byte.

This is the flag-byte-aware sibling of grpcDecodeFrame (which only reports the compression bool). Returns a map with:

  • messageBytes (List<int>): the decoded message payload.
  • flags (int): the raw flag byte (test with grpcFlagIsCompressed / grpcFlagIsEndOfStream).
  • compressed (bool): convenience for flags & grpcFlagCompressed.
  • endOfStream (bool): convenience for flags & grpcFlagEndOfStream (the Connect streaming end-of-stream marker).
  • bytesRead (int): total bytes consumed (header + payload).

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

Implementation

Map<String, Object?> grpcDecodeFrameWithFlags(List<int> buffer, int offset) {
  if (offset + _headerSize > buffer.length) {
    throw RangeError('Incomplete gRPC frame header at offset $offset');
  }
  var flags = buffer[offset] & 0xFF;
  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,
    'flags': flags,
    'compressed': grpcFlagIsCompressed(flags),
    'endOfStream': grpcFlagIsEndOfStream(flags),
    'bytesRead': _headerSize + length,
  };
}