UNPKG

@origami-minecraft/devbuilds

Version:

Origami is a terminal-first Minecraft launcher that supports authentication, installation, and launching of Minecraft versions — with built-in support for Microsoft accounts, mod loaders, profile management, and more. Designed for power users, modders, an

61 lines (50 loc) 1.87 kB
import axios from "axios"; import fs from "fs"; import { ORIGAMi_USER_AGENT } from "../../config/defaults"; import { logger } from "../game/launch/handler"; export async function downloader(url: string, outputPath: string): Promise<void> { const progress_manager = logger.progress(); const download_progress = progress_manager.create(`Download`, 1); try { const response = await axios({ url, method: 'GET', responseType: 'stream', maxRedirects: 5, headers: { 'User-Agent': ORIGAMi_USER_AGENT, } }); const total = parseInt(response.headers['content-length'] || '1', 10); download_progress?.total(total); progress_manager.start(); let downloaded = 0; response.data.on('data', (chunk: Buffer) => { downloaded += chunk.length; if (total) { download_progress?.update(downloaded); } else { download_progress?.total(downloaded); download_progress?.update(downloaded); } }); const writer = fs.createWriteStream(outputPath); response.data.pipe(writer); await new Promise<void>((resolve, reject) => { async function _resolve(...args: any[]) { await new Promise(res => setTimeout(res, 100)); resolve(...args); } async function _reject(...args: any[]) { await new Promise(res => setTimeout(res, 100)); reject(...args); } writer.on('finish', _resolve); writer.on('error', _reject); }); download_progress?.stop(); } catch (error: any) { logger.error((error as Error).message); download_progress?.stop(true); } }