grpcDecodeFrameWithFlags function
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 forflags & grpcFlagCompressed.endOfStream(bool): convenience forflags & 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,
};
}