decode static method

OBPFrame decode(
  1. Uint8List data
)

Decode frame from bytes

Implementation

static OBPFrame decode(Uint8List data) {
  if (data.length < HEADER_SIZE) {
    throw FormatException('Frame too short: ${data.length} < $HEADER_SIZE');
  }

  final buffer = ByteData.sublistView(data);
  int offset = 0;

  // Check magic
  final magic = buffer.getUint32(offset, Endian.big);
  if (magic != MAGIC) {
    throw FormatException('Invalid magic: 0x${magic.toRadixString(16)} != 0x${MAGIC.toRadixString(16)}');
  }
  offset += 4;

  // Version
  final version = buffer.getUint8(offset);
  if (version != VERSION) {
    throw FormatException('Unsupported version: $version != $VERSION');
  }
  offset += 1;

  // Type
  final typeValue = buffer.getUint8(offset);
  final type = OBPMessageType.fromValue(typeValue);
  offset += 1;

  // Flags
  final flagsValue = buffer.getUint8(offset);
  final flags = OBPFlags.fromValue(flagsValue);
  offset += 1;

  // Reserved (skip)
  offset += 1;

  // Length
  final length = buffer.getUint32(offset, Endian.big);
  if (length > MAX_PAYLOAD_SIZE) {
    throw FormatException('Payload too large: $length > $MAX_PAYLOAD_SIZE');
  }
  offset += 4;

  // Stream ID
  final streamId = buffer.getUint32(offset, Endian.big);
  offset += 4;

  // Check total frame size
  if (data.length < HEADER_SIZE + length) {
    throw FormatException('Incomplete frame: ${data.length} < ${HEADER_SIZE + length}');
  }

  // Extract payload
  final payload = data.sublist(HEADER_SIZE, HEADER_SIZE + length);

  return OBPFrame(
    version: version,
    type: type,
    flags: flags,
    streamId: streamId,
    payload: payload,
  );
}