download method

Future<ApiResponse<String>> download({
  1. required String endpoint,
  2. required String savePath,
  3. Map<String, dynamic>? queryParams,
  4. void onProgress(
    1. int received,
    2. int total
    )?,
})

Implementation

Future<ApiResponse<String>> download({
  required String endpoint,
  required String savePath,
  Map<String, dynamic>? queryParams,
  void Function(int received, int total)? onProgress,
}) async {
  final url = _buildUrl(endpoint, queryParams);
  final rid = _rid();
  _setLoading(true);
  final sw = Stopwatch()..start();

  try {
    if (!await ConnectivityService.isConnected()) {
      throw const NoInternetException();
    }

    final token = await TokenManager.getToken();
    AutoPilotLogger.logRequest(method: 'DOWNLOAD', url: url, requestId: rid);
    _cfg.onRequestSent?.call(url, 'DOWNLOAD');

    final uri = Uri.parse(url);
    final req = await _httpClient!.getUrl(uri);
    req.headers.set('Accept', '*/*');
    if (token != null) {
      req.headers.set('Authorization', '${_cfg.tokenType} $token');
    }
    _cfg.globalHeaders.forEach((k, v) => req.headers.set(k, v));

    final response =
        await req.close().timeout(Duration(seconds: _cfg.timeoutSeconds));

    final total = response.contentLength;
    int received = 0;
    final sink = File(savePath).openWrite();

    await for (final chunk in response) {
      sink.add(chunk);
      received += chunk.length;
      onProgress?.call(received, total);
    }
    await sink.close();

    sw.stop();
    AutoPilotLogger.logResponse(
      url: url,
      statusCode: 200,
      responseTime: sw.elapsed,
      requestId: rid,
    );
    _cfg.onResponseReceived?.call(url, 200, sw.elapsed);

    return ApiResponse<String>.success(
      data: savePath,
      statusCode: 200,
      responseTime: sw.elapsed,
    );
  } catch (e) {
    sw.stop();
    return _handleError(e, url, rid, sw.elapsed);
  } finally {
    _setLoading(false);
  }
}