watchUntil method

Future<CloudMediaItem> watchUntil(
  1. String mediaId,
  2. CloudMediaStatus targetStatus, {
  3. Duration timeout = const Duration(seconds: 60),
})

Wait until a media item reaches targetStatus.

Throws TimeoutException if the target is not reached within timeout.

final synced = await watcher.watchUntil(
  item.id,
  CloudMediaStatus.synced,
  timeout: Duration(minutes: 2),
);
print(synced.downloadUrl);

Implementation

Future<CloudMediaItem> watchUntil(
  String mediaId,
  CloudMediaStatus targetStatus, {
  Duration timeout = const Duration(seconds: 60),
}) async {
  final completer = Completer<CloudMediaItem>();
  late StreamSubscription<CloudMediaItem> sub;

  sub = CloudMedia.watch(mediaId).listen((item) {
    if (item.status == targetStatus && !completer.isCompleted) {
      completer.complete(item);
      sub.cancel();
    }
  });

  Future.delayed(timeout, () {
    if (!completer.isCompleted) {
      sub.cancel();
      completer.completeError(
          TimeoutException('watchUntil timed out after $timeout'));
    }
  });

  return completer.future;
}