precache static method

Future<Stream<PrecacheProgressEvent>?> precache(
  1. String url, {
  2. Map<String, Object>? headers,
  3. int cacheSegments = 2,
  4. bool downloadNow = true,
  5. bool progressListen = false,
})

Implementation

static Future<Stream<PrecacheProgressEvent>?> precache(
  String url, {
  Map<String, Object>? headers,
  int cacheSegments = 2,
  bool downloadNow = true,
  bool progressListen = false,
}) async {
  final headerMap = headers?.map((k, v) => MapEntry(k, v.toString()));

  if (!progressListen) {
    await frb.videoCachingPrecache(
      url: url,
      headers: headerMap,
      cacheSegments: cacheSegments,
      downloadNow: downloadNow,
      progressListen: false,
      sink: null,
    );
    return null;
  }

  final sink = RustStreamSink<frb.PrecacheProgressInfo>();
  final controller = StreamController<PrecacheProgressEvent>.broadcast();

  unawaited(
    frb
        .videoCachingPrecache(
          url: url,
          headers: headerMap,
          cacheSegments: cacheSegments,
          downloadNow: downloadNow,
          progressListen: true,
          sink: sink,
        )
        .then((_) {
          if (!controller.isClosed) {
            controller.close();
          }
        })
        .catchError((Object error, StackTrace stackTrace) {
          if (!controller.isClosed) {
            controller.addError(error, stackTrace);
            controller.close();
          }
        }),
  );

  sink.stream.listen(
    (info) {
      if (controller.isClosed) return;
      final event = PrecacheProgressEvent.fromInfo(info);
      controller.add(event);
    },
    onError: (Object error, StackTrace stackTrace) {
      if (!controller.isClosed) {
        controller.addError(error, stackTrace);
        controller.close();
      }
    },
  );

  return controller.stream;
}