read method

void read(
  1. Stream<List<int>> stream, {
  2. required void onData(
    1. Uint8List event
    ),
  3. required void onError(
    1. Object exception
    ),
})

Implementation

void read(
  Stream<List<int>> stream, {
  required void Function(Uint8List event) onData,
  required void Function(Object exception) onError,
}) {
  unawaited(subscription?.cancel());
  subscription = stream.listen(
    (data) {
      // Packets always start with the command & sequence
      final reader = ByteDataReader();
      reader.add(data);
      final command = reader.readUint8();

      if (command != dataCla) {
        return;
      }

      final sequence = reader.readUint16();

      if (sequence != currentSequence) {
        reset();
        return;
      }

      if (currentSequence == 0) {
        // Read the length
        remainingBytes = reader.readUint16();
      }

      remainingBytes -= reader.remainingLength;
      payload.addAll(reader.read(reader.remainingLength));

      if (remainingBytes == 0) {
        final data = Uint8List.fromList(payload);
        reset();

        onData(data);
      } else if (remainingBytes > 0) {
        // wait for next message
        currentSequence += 1;
      } else {
        reset();
      }
    },
    onError: (ex) {
      onError.call(ex);
    },
  );
}