@mc-resource/cli
Version:
a Resource Manager for Minecraft
81 lines (80 loc) • 3.9 kB
JavaScript
;
// import {promisify} from "util";
// import fs from "fs";
//
// export async function downloadFromURL(url: string) {
// const resp = await fetch(url)
// return resp.arrayBuffer()
// }
// export async function downloadAndSaveFromURL(url: string, path: string) {
// const writeFile = promisify(fs.writeFile);
// await writeFile(path, Buffer.from(await downloadFromURL(url)));
// }
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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.downloadAndSaveFromURL = downloadAndSaveFromURL;
const fs_1 = __importDefault(require("fs"));
const node_fetch_1 = __importDefault(require("node-fetch"));
require("colorts/lib/string");
function downloadAndSaveFromURL(url, path, options) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c;
const response = yield (0, node_fetch_1.default)(url);
if (!response.ok) {
throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
}
const filename = url.split('/')[url.split('/').length - 1];
const customName = (_a = options === null || options === void 0 ? void 0 : options.customName) !== null && _a !== void 0 ? _a : filename;
const fileStream = fs_1.default.createWriteStream(path);
const totalBytes = Number(response.headers.get('content-length')) || 0;
let downloadedBytes = 0;
const spinnerIcons = ['-', '\\', '|', '/'];
let spinnerIndex = 0;
const spinnerInterval = setInterval(() => {
let message;
if (totalBytes > 0) {
const progressPercent = ((downloadedBytes / totalBytes) *
100).toFixed(2);
message =
`[${spinnerIcons[spinnerIndex++ % spinnerIcons.length]}] Downloading ` +
`${customName} `.magenta +
`(${progressPercent}%)`.yellow;
}
else {
message =
`[${spinnerIcons[spinnerIndex++ % spinnerIcons.length]}] Downloading ` +
`${customName} `.magenta +
`(${downloadedBytes} bytes)`.yellow;
}
process.stdout.write(`\r${message}`);
}, 120);
(_b = response.body) === null || _b === void 0 ? void 0 : _b.on('data', (chunk) => {
downloadedBytes += chunk.length;
});
(_c = response.body) === null || _c === void 0 ? void 0 : _c.pipe(fileStream);
yield new Promise((resolve, reject) => {
var _a;
fileStream.on('finish', resolve);
fileStream.on('error', reject);
(_a = response.body) === null || _a === void 0 ? void 0 : _a.on('error', reject);
});
clearInterval(spinnerInterval);
// if (options?.printResult) {
// process.stdout.write(
// '\rSuccessfully downloaded: '.green + `${customName}\n`.yellow,
// );
// }
process.stdout.write('\r' + ' '.repeat(process.stdout.getWindowSize()[0]));
});
}