downloadUpdate method
Downloads, verifies, and stages the active release descriptor.
A successful call moves state to UpdateReadyToInstall. Failures move state to UpdateFailed and are rethrown.
Implementation
Future<void> downloadUpdate() async {
final descriptor = _activeDescriptor;
final client = _client;
if (descriptor == null || client == null) {
throw StateError("No zip-first update is available.");
}
_stagingPath = null;
_diagnosticsRecorder.record(
stage: UpdateDiagnosticStage.download,
level: UpdateDiagnosticLevel.info,
message: "Downloading update artifact from ${descriptor.artifact.url}",
);
_state = UpdateDownloading(
receivedBytes: 0,
totalBytes: descriptor.artifact.length,
);
emitUpdateTelemetry(
telemetry,
UpdateTelemetryEvent.downloadStarted(
source: descriptor.artifact.url,
version: descriptor.version,
channel: descriptor.channel,
platform: descriptor.platform,
),
);
notifyListeners();
try {
final result = await client.downloadVerifyAndStage(
descriptor: descriptor,
onProgress: (receivedBytes, totalBytes) {
_state = UpdateDownloading(
receivedBytes: receivedBytes,
totalBytes: totalBytes ?? descriptor.artifact.length,
);
notifyListeners();
},
);
_stagingPath = result.stagingPath;
_diagnosticsRecorder
..record(
stage: UpdateDiagnosticStage.verify,
level: UpdateDiagnosticLevel.info,
message: "Update artifact verified.",
)
..record(
stage: UpdateDiagnosticStage.stage,
level: UpdateDiagnosticLevel.info,
message: "Update staged at ${result.stagingPath}",
);
_state = UpdateReadyToInstall(stagingPath: result.stagingPath);
notifyListeners();
} on Object catch (error) {
_diagnosticsRecorder.record(
stage: UpdateDiagnosticStage.download,
level: UpdateDiagnosticLevel.error,
message: "Download failed.",
error: error,
);
_state = UpdateFailed(
error,
report: _buildProblemReport(error, updateVersion: descriptor.version),
);
emitUpdateTelemetry(
telemetry,
UpdateTelemetryEvent.downloadFailed(
source: descriptor.artifact.url,
version: descriptor.version,
channel: descriptor.channel,
platform: descriptor.platform,
error: error,
),
);
notifyListeners();
rethrow;
}
}