encodeRetrieveResponse static method

Uint8List encodeRetrieveResponse(
  1. RetrieveMessagesResponse response
)

Encode retrieve messages response

Implementation

static Uint8List encodeRetrieveResponse(RetrieveMessagesResponse response) {
  final data = <String, dynamic>{
    'hasMore': response.hasMore,
    'messageCount': response.messages.length,
    'messages': response.messages.map((m) => encode(m)).toList(),
  };

  final json = jsonEncode({
    'hasMore': data['hasMore'],
    'messageCount': data['messageCount'],
  });

  // Pack: JSON metadata + message frames
  final metadataBytes = utf8.encode(json);
  final metadataLength = metadataBytes.length;

  // Calculate total size
  int totalSize = 4; // metadata length (4 bytes)
  totalSize += metadataLength;
  for (final msgBytes in data['messages'] as List) {
    totalSize += 4; // message length (4 bytes)
    totalSize += (msgBytes as Uint8List).length;
  }

  final result = ByteData(totalSize);
  int offset = 0;

  // Write metadata length and data
  result.setUint32(offset, metadataLength);
  offset += 4;
  result.buffer.asUint8List().setRange(offset, offset + metadataLength, metadataBytes);
  offset += metadataLength;

  // Write each message frame
  for (final msgBytes in data['messages'] as List) {
    final bytes = msgBytes as Uint8List;
    result.setUint32(offset, bytes.length);
    offset += 4;
    result.buffer.asUint8List().setRange(offset, offset + bytes.length, bytes);
    offset += bytes.length;
  }

  return result.buffer.asUint8List();
}