downloadVersionFromBinaryRepo function
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;
}
}