sendAndRead method

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

Implementation

Future<Uint8List> sendAndRead({required List<int> request, Duration timeout = const Duration(seconds: 1), Duration quietWindow = const Duration(milliseconds: 120)}) async {
  await sendBytes(request);
  // Accumulate until quiet or timeout
  final completer = Completer<Uint8List>();
  final chunks = <int>[];
  Timer? quiet;
  late final StreamSubscription sub;

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

  final hard = Timer(timeout, finish);
  sub = onData.listen((evt) {
    // log("Listen");
    chunks.addAll(evt.bytes);
    quiet?.cancel();
    quiet = Timer(quietWindow, finish);
  });

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