uploadPart method

Future<ETagResponse> uploadPart(
  1. int me,
  2. List<int> chunk
)

Implementation

Future<ETagResponse> uploadPart(int me, List<int> chunk) async {
  log.info("  Upload part $me size ${chunk.length}");

  Dio _dio = Dio(
    BaseOptions(baseUrl: params.apiBasePath!, headers: {
      "Authorization": "Bearer ${params.apiToken}",
    }),
  );

  final stream = Stream<List<int>>.fromIterable(
      chunk.chunked(1024 * 1024).map((e) => [...e])).asBroadcastStream();
  var resp = await _dio.post<Map<String, dynamic>>(
    "/uploads/$uploadId/parts",
    data: stream,
    onSendProgress: (completed, outof) async {
      log.info("  Buffered $completed/$outof bytes");
      sendUpdate(message: "Buffered $completed/$outof bytes");
      _bytesProcessed[me] = completed;
      await notifyProgress();
    },
    onReceiveProgress: (completed, outof) async {
      log.info("  Received $completed/$outof bytes");
      sendUpdate(message: "Received $completed/$outof bytes");
    },
    options: Options(
      contentType: "application/octet-stream",
      method: "POST",
      headers: {
        Headers.contentLengthHeader: chunk.length,
        "partnumber": me,
        "pathname": params.keyName,
      },
    ),
  );

  var etag = ETagResponse.fromJson(resp.data);

  message = "Completed upload for part: ${_currentPart - 1}";

  _bytesProcessed[me] = chunk.length;
  notifyProgress();

  log.info(" -> $me: ${etag.partName}");
  return etag;
}