grpcDecodeFrame function
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,
};
}