downloadUpdate method

Future<void> downloadUpdate()

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