httpUploadStream function

Stream<UploadStreamProgress> httpUploadStream(
  1. TClient client, {
  2. required String path,
  3. required File file,
  4. TClientToken? token,
})

Implementation

Stream<UploadStreamProgress> httpUploadStream(
  TClient client, {
  required String path,
  required File file,
  TClientToken? token,
}) {
  final controller = StreamController<UploadStreamProgress>();
  (() async {
    try {
      controller.add(
        UploadStreamProgress(
          progressStatus: StreamProgressStatus.preparing,
          total: file.lengthSync(),
        ),
      );
      await client.upload(
        path,
        file: file,
        token: token,
        onUploadProgress: (sent, total) {
          double progress = total > 0 ? (sent / total) : 0.0;
          controller.add(
            UploadStreamProgress(
              progressStatus: StreamProgressStatus.progress,
              total: total,
              loaded: sent,
              progress: progress,
            ),
          );
        },
        onError: (message) {
          controller.add(
            UploadStreamProgress(
              progressStatus: StreamProgressStatus.error,
              total: file.lengthSync(),
              errorMessage: message,
              isCanceled: true,
            ),
          );
          controller.close();
        },
        onCancelCallback: (message) {
          controller.add(
            UploadStreamProgress(
              progressStatus: StreamProgressStatus.error,
              total: file.lengthSync(),
              errorMessage: message,
              isCanceled: true,
            ),
          );
          controller.close();
        },
      );
      controller.add(
        UploadStreamProgress(progressStatus: StreamProgressStatus.done),
      );
    } catch (e) {
      controller.add(
        UploadStreamProgress(
          progressStatus: StreamProgressStatus.error,
          total: file.lengthSync(),
          errorMessage: e.toString(),
          isCanceled: true,
        ),
      );
      controller.close();
    }
  })();

  return controller.stream;
}