68 lines
1.7 KiB
JavaScript
68 lines
1.7 KiB
JavaScript
const fs = require("fs");
|
|
const https = require("https");
|
|
const path = require("path");
|
|
const zlib = require("zlib");
|
|
const pkg = require("./package.json");
|
|
|
|
const MAX_DOWNLOAD_ATTEMPTS = 4;
|
|
|
|
const binaryName = [process.platform, process.arch].join("__");
|
|
const binaryPath = path.join(__dirname, "index.node");
|
|
|
|
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
|
|
class StatusError extends Error {
|
|
constructor(status) {
|
|
super(`Bad status of ${status}`);
|
|
this.status = status;
|
|
}
|
|
}
|
|
|
|
const fetch = (url) =>
|
|
new Promise((resolve, reject) => {
|
|
const stream = https.get(url, (resp) => {
|
|
if (!resp.statusCode || resp.statusCode < 200 || resp.statusCode > 299) {
|
|
return reject(new StatusError(resp.statusCode));
|
|
}
|
|
const parts = [];
|
|
resp.on("data", (chunk) => parts.push(chunk));
|
|
resp.on("end", () => resolve(Buffer.concat(parts)));
|
|
});
|
|
stream.on("error", reject);
|
|
});
|
|
|
|
const downloadNativeBinary = async () => {
|
|
for (let attempt = 0; ; attempt++) {
|
|
let binary;
|
|
try {
|
|
binary = await fetch(
|
|
`https://wilsonl.in/minify-html/bin/nodejs/${pkg.version}/${
|
|
pkg.name.split("/")[1]
|
|
}/${binaryName}.node.gz`
|
|
);
|
|
} catch (e) {
|
|
if (e instanceof StatusError && attempt < MAX_DOWNLOAD_ATTEMPTS) {
|
|
await wait(Math.random() * 2500 + 500);
|
|
continue;
|
|
}
|
|
throw e;
|
|
}
|
|
|
|
fs.writeFileSync(binaryPath, zlib.gunzipSync(binary));
|
|
break;
|
|
}
|
|
};
|
|
|
|
if (
|
|
!fs.existsSync(path.join(__dirname, ".no-postinstall")) &&
|
|
!fs.existsSync(binaryPath)
|
|
) {
|
|
downloadNativeBinary().then(
|
|
() => console.log(`Downloaded ${pkg.name}`),
|
|
(err) => {
|
|
console.error(`Failed to download ${pkg.name}: ${err}`);
|
|
process.exit(1);
|
|
}
|
|
);
|
|
}
|