129 lines
4.5 KiB
JavaScript
129 lines
4.5 KiB
JavaScript
const { HttpsProxyAgent } = require("https-proxy-agent");
|
|
const { DownloaderHelper } = require("node-downloader-helper");
|
|
const { version } = require("./package.json");
|
|
|
|
// Get the platform and architecture based on environment variables,
|
|
// falling back to the current platform and architecture
|
|
const platform = process.env.npm_config_target_platform || process.env.npm_config_platform || process.platform;
|
|
const arch = process.env.npm_config_target_arch || process.env.npm_config_arch || process.arch;
|
|
|
|
const DOWNLOADS_BASE_URL = "https://github.com/matrix-org/matrix-rust-sdk-crypto-nodejs/releases/download";
|
|
const CURRENT_VERSION = `v${version}`;
|
|
|
|
const byteHelper = function (value) {
|
|
if (value === 0) {
|
|
return "0 b";
|
|
}
|
|
const units = ["b", "kB", "MB", "GB", "TB"];
|
|
const number = Math.floor(Math.log(value) / Math.log(1024));
|
|
return (value / Math.pow(1024, Math.floor(number))).toFixed(1) + " " + units[number];
|
|
};
|
|
|
|
function download_lib(libname) {
|
|
let startTime = new Date();
|
|
|
|
const url = `${DOWNLOADS_BASE_URL}/${CURRENT_VERSION}/${libname}`;
|
|
console.info(`Downloading lib ${libname} from ${url}`);
|
|
const dl = new DownloaderHelper(url, __dirname, {
|
|
override: true,
|
|
});
|
|
|
|
const proxy = process.env.https_proxy ?? process.env.HTTPS_PROXY;
|
|
if (proxy) {
|
|
const proxyAgent = new HttpsProxyAgent(proxy);
|
|
dl.updateOptions({
|
|
httpsRequestOptions: { agent: proxyAgent },
|
|
});
|
|
}
|
|
|
|
dl.on("end", () => console.info("Download Completed"));
|
|
dl.on("error", (err) => console.info("Download Failed", err));
|
|
dl.on("progress", (stats) => {
|
|
const progress = stats.progress.toFixed(1);
|
|
const speed = byteHelper(stats.speed);
|
|
const downloaded = byteHelper(stats.downloaded);
|
|
const total = byteHelper(stats.total);
|
|
|
|
// print every one second (`progress.throttled` can be used instead)
|
|
const currentTime = new Date();
|
|
const elaspsedTime = currentTime - startTime;
|
|
if (elaspsedTime > 1000) {
|
|
startTime = currentTime;
|
|
console.info(`${speed}/s - ${progress}% [${downloaded}/${total}]`);
|
|
}
|
|
});
|
|
dl.start().catch((err) => console.error(err));
|
|
}
|
|
|
|
function isMusl() {
|
|
// For Node 10
|
|
if (!process.report || typeof process.report.getReport !== "function") {
|
|
try {
|
|
return readFileSync("/usr/bin/ldd", "utf8").includes("musl");
|
|
} catch (e) {
|
|
return true;
|
|
}
|
|
} else {
|
|
const { glibcVersionRuntime } = process.report.getReport().header;
|
|
return !glibcVersionRuntime;
|
|
}
|
|
}
|
|
|
|
switch (platform) {
|
|
case "win32":
|
|
switch (arch) {
|
|
case "x64":
|
|
download_lib("matrix-sdk-crypto.win32-x64-msvc.node");
|
|
break;
|
|
case "ia32":
|
|
download_lib("matrix-sdk-crypto.win32-ia32-msvc.node");
|
|
break;
|
|
case "arm64":
|
|
download_lib("matrix-sdk-crypto.win32-arm64-msvc.node");
|
|
break;
|
|
default:
|
|
throw new Error(`Unsupported architecture on Windows: ${arch}`);
|
|
}
|
|
break;
|
|
case "darwin":
|
|
switch (arch) {
|
|
case "x64":
|
|
download_lib("matrix-sdk-crypto.darwin-x64.node");
|
|
break;
|
|
case "arm64":
|
|
download_lib("matrix-sdk-crypto.darwin-arm64.node");
|
|
break;
|
|
default:
|
|
throw new Error(`Unsupported architecture on macOS: ${arch}`);
|
|
}
|
|
break;
|
|
case "linux":
|
|
switch (arch) {
|
|
case "x64":
|
|
if (isMusl()) {
|
|
download_lib("matrix-sdk-crypto.linux-x64-musl.node");
|
|
} else {
|
|
download_lib("matrix-sdk-crypto.linux-x64-gnu.node");
|
|
}
|
|
break;
|
|
case "arm64":
|
|
if (isMusl()) {
|
|
throw new Error("Linux for arm64 musl isn't support at the moment");
|
|
} else {
|
|
download_lib("matrix-sdk-crypto.linux-arm64-gnu.node");
|
|
}
|
|
break;
|
|
case "arm":
|
|
download_lib("matrix-sdk-crypto.linux-arm-gnueabihf.node");
|
|
break;
|
|
case "s390x":
|
|
download_lib("matrix-sdk-crypto.linux-s390x-gnu.node");
|
|
break;
|
|
default:
|
|
throw new Error(`Unsupported architecture on Linux: ${arch}`);
|
|
}
|
|
break;
|
|
default:
|
|
throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`);
|
|
}
|