blake3
Version:
BLAKE3 hashing for JavaScript: native Node bindings (where available) and WebAssembly
85 lines • 4.03 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const path_1 = require("path");
const stream_1 = require("stream");
const https_1 = require("https");
const versions_1 = require("./versions");
/**
* Post-install script. Downloads the binary for the current Node.js version
* from the Gitub releases page, if it's available.
*/
const builtPlatforms = {
win32: 'windows-latest',
linux: 'ubuntu-latest',
darwin: 'macos-latest',
};
const { version } = require('../../package.json');
const repoUrl = process.env.BLAKE3_REPO_URL || 'https://github.com/connor4312/blake3';
const issueUrl = `${repoUrl}/issues/new`;
const targets = require('../../targets.json');
function install() {
return __awaiter(this, void 0, void 0, function* () {
const majorVersion = versions_1.getMajorVersion(process.version);
if (Number(majorVersion) < Number(versions_1.minNodeVersion)) {
console.error('Your Node.js release is out of LTS and BLAKE3 bindings are not built for it. Update it to use native BLAKE3 bindings.');
return fallback();
}
let apiVersion = targets[process.version];
if (!apiVersion) {
console.error(`API version for node ${process.platform} not explicitly built, falling back to latest. If this does not work, open an issue at ${issueUrl}`);
apiVersion = Object.values(targets)[0];
}
const platform = builtPlatforms[process.platform];
if (!platform) {
console.error(`BLAKE3 bindings are not built for your platform (${process.platform})`);
return fallback();
}
console.log(`Retrieving native BLAKE3 bindings for Node v${majorVersion} on ${process.platform}...`);
yield download(`${repoUrl}/releases/download/v${version}/${platform}-${apiVersion}.node`);
useNativeImport();
console.log('BLAKE3 bindings retrieved');
});
}
function fallback() {
console.error('BLAKE3 will use slower WebAssembly bindings when required in Node.js');
}
function download(url) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise(resolve => {
const onError = (err) => {
console.error(`Could not download binding from ${url}: ${err.stack || err.message}`);
resolve(false);
};
const req = https_1.get(url, res => {
if (res.headers.location) {
resolve(download(res.headers.location));
return;
}
if (!res.statusCode || res.statusCode >= 300) {
console.error(`Unexpected ${res.statusCode} from ${url}`);
resolve(false);
return;
}
stream_1.pipeline(res, fs_1.createWriteStream(path_1.join(__dirname, '..', 'native.node')), err => err ? onError(err) : resolve(true));
});
req.on('error', onError);
});
});
}
function useNativeImport() {
const indexFile = path_1.join(__dirname, '..', 'index.js');
const contents = fs_1.readFileSync(indexFile, 'utf-8');
fs_1.writeFileSync(indexFile, contents.replace('"./node"', '"./node-native"'));
}
install().catch(fallback);
//# sourceMappingURL=install.js.map
;