uploadFileWith function

Stream<AnonFileUploadEvent> uploadFileWith({
  1. required String endpoint,
  2. required Stream<Uint8List> byteStream,
  3. required String filename,
  4. required int length,
  5. MultipartRequestClient? multipartRequestClient,
  6. AnonFileUploadResponse? mapResponseJson(
    1. Map<String, dynamic>
    )?,
})

Help function that actually uploads the file bytes with a given filename using a multipartRequestClient provider to a given AnonFiles endpoint.

Implementation

Stream<AnonFileUploadEvent> uploadFileWith({
  required String endpoint,
  required Stream<Uint8List> byteStream,
  required String filename,
  required int length,
  MultipartRequestClient? multipartRequestClient,
  AnonFileUploadResponse? Function(Map<String, dynamic>)? mapResponseJson,
}) {
  final MultipartRequestClient sendMultipartRequest =
      multipartRequestClient ?? sendMultipartRequestTo;

  late final StreamController<AnonFileUploadEvent> controller;

  Stream<AnonFileUploadEvent> upload() async* {
    yield const AnonFileUploadEvent(
      progress: 0,
      response: null,
    );

    final Uint8List raw = await sendMultipartRequest(
      endpoint,
      byteStream,
      length,
      filename: filename,
    ).reduce(
      (Uint8List previous, Uint8List element) => Uint8List.fromList(
        <int>[...previous, ...element],
      ),
    );

    final Map<String, dynamic> response =
        jsonDecode(utf8.decode(raw)) as Map<String, dynamic>;

    yield AnonFileUploadEvent(
      progress: 1,
      response: mapResponseJson?.call(response) ??
          AnonFileUploadResponse.fromJson(response),
    );
  }

  FutureOr<void> onCancel() {}

  Future<void> onListen() async {
    await controller.addStream(upload());
    await controller.close();
  }

  void onPause() {
    throw UnsupportedError(
      'Resume and cancel are not supported when uploading a file.',
    );
  }

  void onResume() {
    throw UnsupportedError(
      'Resume and cancel are not supported when uploading a file.',
    );
  }

  controller = StreamController<AnonFileUploadEvent>(
    onCancel: onCancel,
    onListen: onListen,
    onPause: onPause,
    onResume: onResume,
  );

  return controller.stream;
}