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