@furox/minecraft-java-core
Version:
A library starting minecraft game NW.js and Electron.js
78 lines (77 loc) • 3 kB
JavaScript
;
/**
* @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;