UNPKG

@furox/minecraft-java-core

Version:

A library starting minecraft game NW.js and Electron.js

78 lines (77 loc) 3 kB
"use strict"; /** * @author Luuxis * @license CC-BY-NC 4.0 - https://creativecommons.org/licenses/by-nc/4.0/ */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const node_fetch_1 = __importDefault(require("node-fetch")); const events_1 = require("events"); class download { constructor() { this.on = events_1.EventEmitter.prototype.on; this.emit = events_1.EventEmitter.prototype.emit; } async downloadFileMultiple(files, size, limit = 1, timeout = 10000) { if (limit > files.length) limit = files.length; let completed = 0; let downloaded = 0; let queued = 0; let start = new Date().getTime(); let before = 0; let speeds = []; let estimated = setInterval(() => { let duration = (new Date().getTime() - start) / 1000; let loaded = (downloaded - before) * 8; if (speeds.length >= 5) speeds = speeds.slice(1); speeds.push((loaded / duration) / 8); let speed = 0; for (let s of speeds) speed += s; speed /= speeds.length; this.emit("speed", speed); let time = (size - downloaded) / (speed); this.emit("estimated", time); start = new Date().getTime(); before = downloaded; }, 500); const downloadNext = async () => { if (queued < files.length) { let file = files[queued]; queued++; if (!fs_1.default.existsSync(file.foler)) fs_1.default.mkdirSync(file.folder, { recursive: true, mode: 0o777 }); const writer = fs_1.default.createWriteStream(file.path, { flags: 'w', mode: 0o777 }); const response = await (0, node_fetch_1.default)(file.url, { timeout: timeout }); response.body.on('data', (chunk) => { downloaded += chunk.length; this.emit('progress', downloaded, size, file.type); writer.write(chunk); }); response.body.on('end', () => { writer.end(); completed++; downloadNext(); }); } }; while (queued < limit) { downloadNext(); } return new Promise((resolve) => { const interval = setInterval(() => { if (completed === files.length) { clearInterval(estimated); clearInterval(interval); resolve(); } }, 100); }); } } exports.default = download;