parseMessage static method

WireMessage parseMessage(
  1. Uint8List messageBytes
)

Parse a complete message from bytes (header + payload)

Implementation

static WireMessage parseMessage(Uint8List messageBytes) {
  if (messageBytes.length < messageHeaderSize) {
    throw WireException('Message too short for header');
  }

  // Parse header
  final header = MessageHeader.deserialize(messageBytes);

  // Validate payload length
  if (messageBytes.length < messageHeaderSize + header.payloadLength) {
    throw WireException(
      'Message shorter than expected: ${messageBytes.length} < ${messageHeaderSize + header.payloadLength}',
      header.command,
    );
  }

  // Extract and validate payload
  final payload = messageBytes.sublist(
    messageHeaderSize,
    messageHeaderSize + header.payloadLength,
  );

  // Verify checksum
  final expectedChecksum = _calculateChecksum(payload);
  if (!_checksumsEqual(header.checksum, expectedChecksum)) {
    final expectedHex = expectedChecksum.map((b) => b.toRadixString(16).padLeft(2, '0')).join('');
    final actualHex = header.checksum.map((b) => b.toRadixString(16).padLeft(2, '0')).join('');
    throw WireException(
      'Invalid checksum: expected 0x$expectedHex, got 0x$actualHex',
      header.command,
    );
  }

  // Deserialize the message
  return deserializeMessage(
    header.command,
    payload,
    70001, // Default protocol version
    MessageEncoding.base,
  );
}