node-tls-client-kgb
Version:
Advanced library based on node-fetch and tls-client.
181 lines (180 loc) • 7.6 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Download = void 0;
const logger_1 = require("./logger");
const https_1 = __importDefault(require("https"));
const fs_1 = __importStar(require("fs"));
class Download {
file;
path;
issueURL = "https://github.com/Sahil1337/node-tls-client/issues";
constructor(file, libPath) {
this.file = file;
this.path = libPath;
}
async init() {
try {
const latest = await this.getLatest();
if (latest) {
await this.extract(latest.browser_download_url);
logger_1.logger.success("Extracted shared library.");
}
else {
logger_1.logger.error(`Failed to find required asset: ${this.file.name}, report ${logger_1.logger.hyperlink("here", this.issueURL)}.`);
}
}
catch (error) {
logger_1.logger.error(`Initialization failed: ${error}`);
}
}
formatBytes(bytes, decimals = 2) {
if (bytes === 0)
return "0 Bytes";
const k = 1024;
const dm = decimals < 0 ? 0 : decimals;
const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
}
progress(downloaded, total) {
const percentage = (downloaded / total) * 100;
const progress = Math.floor(percentage / 2);
// const bar = "█".repeat(progress) + " ".repeat(50 - progress);
// process.stdout.clearLine(0);
// process.stdout.cursorTo(0);
// process.stdout.write(
// `${logger.stamp} DOWNLOADING:[${bar}] ${percentage.toFixed(
// 2
// )}% (${this.formatBytes(downloaded)} / ${this.formatBytes(total)})`
// );
}
async download(url, file) {
return new Promise((resolve, reject) => {
https_1.default
.get(url, (response) => {
if (response.statusCode &&
response.statusCode >= 300 &&
response.statusCode < 400 &&
response.headers.location) {
const newURL = new URL(response.headers.location, url).toString();
logger_1.logger.debug(`Fetched shared library ${logger_1.logger.hyperlink("url", newURL)}`);
this.download(newURL, file).then(resolve).catch(reject);
}
else if (response.statusCode &&
response.statusCode >= 200 &&
response.statusCode < 300) {
const totalBytes = parseInt(response.headers["content-length"] || "0", 10);
let downloadedBytes = 0;
response.pipe(file);
response.on("data", (chunk) => {
downloadedBytes += chunk.length;
this.progress(downloadedBytes, totalBytes);
});
response.on("end", () => {
file.close((err) => {
if (err) {
reject(err);
}
else {
process.stdout.write("\n");
resolve();
}
});
});
file.on("error", (err) => {
fs_1.default.unlink(this.path, () => reject(err));
});
}
else {
logger_1.logger.error(`Failed to download the file [statusCode:${response.statusCode}]`);
reject();
}
})
.on("error", (err) => {
fs_1.default.unlink(this.path, () => reject(err));
});
});
}
async extract(url) {
return new Promise((resolve, reject) => {
const file = (0, fs_1.createWriteStream)(this.path);
this.download(url, file).then(resolve).catch(reject);
});
}
async getLatest() {
return new Promise((resolve, reject) => {
const options = {
hostname: "api.github.com",
path: "/repos/bogdanfinn/tls-client/releases/latest",
method: "GET",
headers: {
"user-agent": "node-tls-client",
},
};
https_1.default
.get(options, (res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
});
res.on("end", () => {
if (res.statusCode === 200) {
try {
const response = JSON.parse(data);
const version = response.tag_name.replace("v", "");
logger_1.logger.debug(`Fetched latest version: v${version}`);
const assetName = this.file.downloadName.replace("{version}", version);
const asset = response.assets.find((asset) => asset.name === assetName);
if (!asset) {
logger_1.logger.error(`Failed to find required asset: ${this.file.name}, report ${logger_1.logger.hyperlink("here", this.issueURL)}.`);
resolve(null);
}
else {
resolve(asset);
}
}
catch (err) {
logger_1.logger.error(`Failed to parse response: ${err}`);
resolve(null);
}
}
else {
logger_1.logger.error(`Failed to fetch the latest version. Status code: ${res.statusCode}`);
resolve(null);
}
});
})
.on("error", (err) => {
logger_1.logger.error(`Failed to fetch the latest version: ${err}`);
resolve(null);
});
});
}
}
exports.Download = Download;