export async function downloadAndValidateBinary()

in src/core/download-binary-helper.ts [20:71]


export async function downloadAndValidateBinary(
  releaseMetadata: BinaryMetadata,
  binaryName: string,
  outputFolder: string,
  id: string,
  platform: "win-x64" | "osx-x64" | "linux-x64",
) {
  const downloadFilename = path.basename(releaseMetadata.files[platform].url);
  const url = releaseMetadata.files[platform].url;
  const spinner = ora({ prefixText: chalk.dim.gray(`[swa]`) });

  spinner.start(`Downloading ${url}@${id}`);

  const response = await fetch(url);

  if (response.status !== 200) {
    spinner.fail();
    throw new Error(`Failed to download ${binaryName} binary from url ${url}. File not found (${response.status})`);
  }

  createBinaryDirectoryIfNotExists(id, outputFolder);

  const isPosix = platform === "linux-x64" || platform === "osx-x64";
  const outputFile = path.join(outputFolder, id, downloadFilename);

  const writableStream = fs.createWriteStream(outputFile, { mode: isPosix ? 0o755 : undefined });

  await stp.pipeline(response.body, writableStream);

  const computedHash = computeChecksumfromFile(outputFile).toLowerCase();
  const releaseChecksum = releaseMetadata.files[platform].sha.toLowerCase();
  if (computedHash !== releaseChecksum) {
    try {
      // in case of a failure, we remove the file
      fs.unlinkSync(outputFile);
    } catch {
      logger.silly(`Not able to delete ${downloadFilename}, please delete manually.`);
    }

    spinner.fail();
    throw new Error(`Checksum mismatch for ${binaryName}! Expected ${releaseChecksum}, got ${computedHash}.`);
  } else {
    spinner.succeed();

    logger.silly(`Checksum match: ${computedHash}`);
    logger.silly(`Saved binary to ${outputFile}`);

    saveMetadata(releaseMetadata, outputFile, computedHash, binaryName);
  }

  return outputFile;
}