verifiedNativeInstallRequestFromStage function

Future<VerifiedNativeInstallRequest> verifiedNativeInstallRequestFromStage({
  1. required UpdateClient session,
  2. required UpdateStageResult stageResult,
  3. required PersistedInstallTransaction receipt,
})

Claims a staged result and receipt for exactly one native dispatch.

Implementation

Future<VerifiedNativeInstallRequest> verifiedNativeInstallRequestFromStage({
  required UpdateClient session,
  required UpdateStageResult stageResult,
  required PersistedInstallTransaction receipt,
}) async {
  final retained = await claimRetainedVerifiedStageForDispatch(
    stageResult: stageResult,
    expectedPackageId: receipt.expectedPackageId,
    ownerToken: session.ownerTokenForDispatch,
    generation: stageResult.generationForDispatch,
  );
  final descriptor = stageResult.descriptor;
  if (descriptor.packageId != receipt.expectedPackageId ||
      descriptor.version != receipt.updateVersion ||
      descriptor.buildNumber != receipt.updateBuildNumber ||
      descriptor.platform != receipt.platform ||
      descriptor.channel != receipt.channel) {
    throw StateError(
      "Persisted install transaction does not match the signed release "
      "descriptor.",
    );
  }
  if (retained.stagingPath != receipt.stagingPath ||
      retained.state.markerSha256 != receipt.stageProvenanceSha256 ||
      stageResult.stageProvenanceSha256 != receipt.stageProvenanceSha256 ||
      retained.state.provenance.packageId != descriptor.packageId ||
      retained.state.provenance.artifactSha256 != descriptor.artifact.sha256) {
    throw StateError(
      "Persisted install transaction does not match the verified stage.",
    );
  }
  return _VerifiedNativeInstallRequest(
    stagingPath: receipt.stagingPath,
    expectedPackageId: receipt.expectedPackageId,
    updateVersion: receipt.updateVersion,
    updateBuildNumber: receipt.updateBuildNumber,
    platform: receipt.platform,
    channel: receipt.channel,
    expectedArtifactSha256: descriptor.artifact.sha256,
    stageProvenanceSha256: receipt.stageProvenanceSha256,
    transactionId: receipt.transactionId,
  );
}