sendAndRead method

Future<Uint8List> sendAndRead({
  1. required List<int> request,
  2. Duration timeout = const Duration(seconds: 1),
  3. Duration quietWindow = const Duration(milliseconds: 150),
})

Send bytes and collect response until quiet or timeout.

Implementation

Future<Uint8List> sendAndRead({required List<int> request, Duration timeout = const Duration(seconds: 1), Duration quietWindow = const Duration(milliseconds: 150)}) async {
  if (!_inner.isOpen) throw StateError('Port not open');
  // ensure listening
  startListening();

  final completer = Completer<Uint8List>();
  final acc = <int>[];
  Timer? quiet;
  late StreamSubscription sub;

  void finish() async {
    if (!completer.isCompleted) completer.complete(Uint8List.fromList(acc));
    await sub.cancel();
    quiet?.cancel();
  }

  // Listen to payloads only (from _onBytes)
  sub = onData.listen((e) {
    acc.addAll(e.bytes);
    quiet?.cancel();
    quiet = Timer(quietWindow, finish);
  });

  final hard = Timer(timeout, finish);

  final ok = await writeAll(request);
  if (!ok) {
    hard.cancel();
    await sub.cancel();
    return Uint8List(0);
  }

  final res = await completer.future;
  hard.cancel();
  return res;
}