httpDownloadStream function

Stream<DownloadStreamProgress> httpDownloadStream(
  1. TClient client,
  2. String path, {
  3. required String savePath,
  4. TClientToken? token,
  5. Map<String, String>? query,
  6. Map<String, String>? headers,
})

Implementation

Stream<DownloadStreamProgress> httpDownloadStream(
  TClient client,
  String path, {
  required String savePath,
  TClientToken? token,
  Map<String, String>? query,
  Map<String, String>? headers,
}) {
  final controller = StreamController<DownloadStreamProgress>();
  (() async {
    try {
      controller.add(
        DownloadStreamProgress(progressStatus: StreamProgressStatus.preparing),
      );

      await client.download(
        path,
        savePath: savePath,
        token: token,
        query: query,
        headers: headers,
        onReceiveProgressSpeed: (receive, total, speed, eta) {
          controller.add(
            DownloadStreamProgress(
              progressStatus: StreamProgressStatus.progress,
              eta: eta,
              receive: receive,
              total: total,
              speed: speed,
            ),
          );
        },
        onCancelCallback: (message) {
          controller.add(
            DownloadStreamProgress(
              progressStatus: StreamProgressStatus.error,
              errorMessage: message,
              isCanceled: true,
            ),
          );
          controller.close();
        },
        onError: (message) {
          controller.add(
            DownloadStreamProgress(
              progressStatus: StreamProgressStatus.error,
              errorMessage: message,
            ),
          );
          controller.close();
        },
      );

      controller.add(
        DownloadStreamProgress(progressStatus: StreamProgressStatus.done),
      );
      controller.close();
    } catch (e) {
      controller.add(
        DownloadStreamProgress(
          progressStatus: StreamProgressStatus.error,
          errorMessage: e.toString(),
          isCanceled: true,
        ),
      );
      controller.close();
    }
  })();

  return controller.stream;
}