downloadVersionFromBinaryRepo function

Future<void> downloadVersionFromBinaryRepo({
  1. required String version,
  2. required String stagingPath,
  3. required String baseUrl,
  4. String? authUsername,
  5. String? authPassword,
})

Download a version from a binary repository.

Implementation

Future<void> downloadVersionFromBinaryRepo({
  required String version,
  required String stagingPath,
  required String baseUrl,
  String? authUsername,
  String? authPassword,
}) async {
  // Clean up any partial download
  final stagingDir = Directory(stagingPath);
  if (stagingDir.existsSync()) {
    stagingDir.deleteSync(recursive: true);
  }

  final platform = getPlatform();
  final startTime = DateTime.now().millisecondsSinceEpoch;

  // Fetch manifest to get checksum
  final client = HttpClient();
  Map<String, dynamic> manifest;
  try {
    final request = await client.getUrl(
      Uri.parse('$baseUrl/$version/manifest.json'),
    );
    if (authUsername != null && authPassword != null) {
      request.headers.set(
        'Authorization',
        'Basic ${base64Encode(utf8.encode('$authUsername:$authPassword'))}',
      );
    }
    final response = await request.close().timeout(const Duration(seconds: 10));
    final body = await response.transform(utf8.decoder).join();
    manifest = jsonDecode(body) as Map<String, dynamic>;
  } catch (e) {
    final latencyMs = DateTime.now().millisecondsSinceEpoch - startTime;
    _logDebug('Manifest fetch failed after ${latencyMs}ms: $e');
    rethrow;
  } finally {
    client.close();
  }

  final platforms = manifest['platforms'] as Map<String, dynamic>?;
  final platformInfo = platforms?[platform] as Map<String, dynamic>?;
  if (platformInfo == null) {
    throw Exception(
      'Platform $platform not found in manifest for version $version',
    );
  }

  final expectedChecksum = platformInfo['checksum'] as String;
  final binaryName = getBinaryName(platform);
  final binaryUrl = '$baseUrl/$version/$platform/$binaryName';

  // Write to staging
  await stagingDir.create(recursive: true);
  final binaryPath = p.join(stagingPath, binaryName);

  try {
    await downloadAndVerifyBinary(
      binaryUrl: binaryUrl,
      expectedChecksum: expectedChecksum,
      binaryPath: binaryPath,
      authUsername: authUsername,
      authPassword: authPassword,
    );
    final latencyMs = DateTime.now().millisecondsSinceEpoch - startTime;
    _logDebug('Binary download succeeded in ${latencyMs}ms');
  } catch (e) {
    final latencyMs = DateTime.now().millisecondsSinceEpoch - startTime;
    _logDebug('Binary download failed after ${latencyMs}ms: $e');
    rethrow;
  }
}