freebsd-ports/net-im/signal-desktop/files/fetch-prebuild.js

88 lines
2.2 KiB
JavaScript

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
/* eslint-disable no-console */
const https = require('https');
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const tar = require('tar');
const { Transform } = require('stream');
const { pipeline } = require('stream/promises');
const VERSION = process.env.npm_package_version;
const URL = process.env.npm_package_config_prebuildUrl.replace(
'${npm_package_version}', // eslint-disable-line no-template-curly-in-string
VERSION
);
const HASH = process.env.npm_package_config_prebuildChecksum;
const tmpFile = path.join(__dirname, 'unverified-prebuild.tmp');
const finalFile = path.join(__dirname, 'prebuild.tar.gz');
async function main() {
return;
if (!HASH) {
console.log('(no checksum provided; assuming local build)');
process.exit(0);
}
await downloadIfNeeded();
console.log('extracting...');
await tar.extract({ file: finalFile, onwarn: process.emitWarning });
}
async function downloadIfNeeded() {
if (fs.statSync(finalFile, { throwIfNoEntry: false })) {
const hash = crypto.createHash('sha256');
await pipeline(fs.createReadStream(finalFile), hash);
if (hash.digest('hex') === HASH) {
console.log('local build artifact is up-to-date');
return;
}
console.log('local build artifact is outdated');
}
await download();
}
function download() {
console.log(`downloading ${URL}`);
return new Promise((resolve, reject) => {
https.get(URL, async res => {
try {
const out = fs.createWriteStream(tmpFile);
const hash = crypto.createHash('sha256');
const t = new Transform({
transform(chunk, encoding, callback) {
hash.write(chunk, encoding);
callback(null, chunk);
},
});
await pipeline(res, t, out);
const actualDigest = hash.digest('hex');
if (actualDigest !== HASH) {
fs.unlinkSync(tmpFile);
throw new Error(
`Digest mismatch. Expected ${HASH} got ${actualDigest}`
);
}
fs.renameSync(tmpFile, finalFile);
resolve();
} catch (error) {
reject(error);
}
});
});
}
main();