waitForVmServiceEvent function

Future<bool> waitForVmServiceEvent({
  1. required Stream<Map<String, dynamic>> events,
  2. required VmEventMatcher matches,
  3. required Duration timeout,
})

Waits for the first VM event that satisfies matches.

Implementation

Future<bool> waitForVmServiceEvent({
  required Stream<Map<String, dynamic>> events,
  required VmEventMatcher matches,
  required Duration timeout,
}) async {
  final completer = Completer<bool>();
  late final StreamSubscription<Map<String, dynamic>> subscription;
  Timer? timer;

  void complete(bool value) {
    if (completer.isCompleted) return;
    completer.complete(value);
  }

  subscription = events.listen(
    (event) {
      if (matches(event)) {
        complete(true);
      }
    },
    onError: (_) => complete(false),
    onDone: () => complete(false),
  );

  timer = Timer(timeout, () => complete(false));

  try {
    return await completer.future;
  } finally {
    timer.cancel();
    await subscription.cancel();
  }
}