download method
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);
}
}