71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import fs from "node:fs";
|
|
import websocket from "ws";
|
|
import { yauzl_promise } from "./utils/yauzl.promise.js";
|
|
import { pipeline } from "node:stream/promises";
|
|
import { platform, what_platform } from "./platform/index.js";
|
|
|
|
interface Iinfo{
|
|
name:string
|
|
buffer:Buffer
|
|
}
|
|
|
|
export class Dex {
|
|
ws: websocket;
|
|
in: any;
|
|
constructor(ws: websocket) {
|
|
this.ws = ws;
|
|
this.in = {}
|
|
}
|
|
|
|
public async Main(buffer: Buffer) {
|
|
const info = await this._getinfo(buffer)
|
|
const plat = what_platform(info)
|
|
const mpname = this.in.name
|
|
await Promise.all([
|
|
this._unzip(buffer,mpname),
|
|
platform(plat).downloadfile(this.in,`./instance/${mpname}`)
|
|
])
|
|
this.ws.send(JSON.stringify({ status: "changed", result: undefined })); //改变状态
|
|
|
|
//await this._unzip(buffer);
|
|
}
|
|
|
|
private async _getinfo(buffer: Buffer){
|
|
const important_name = ["manifest.json","modrinth.index.json"]
|
|
let contain:string = ""
|
|
const zip = await yauzl_promise(buffer);
|
|
zip.filter(e=>important_name.includes(e.fileName)).forEach(async e=>{
|
|
this.in = JSON.parse((await e.ReadEntry).toString())
|
|
contain = e.fileName
|
|
})
|
|
return contain;
|
|
}
|
|
|
|
private async _unzip(buffer: Buffer,instancename:string) {
|
|
/* 解压Zip */
|
|
const zip = await yauzl_promise(buffer);
|
|
let index = 0;
|
|
for await (const entry of zip) {
|
|
const ew = entry.fileName.endsWith("/");
|
|
if (ew) {
|
|
await fs.promises.mkdir(`./instance/${instancename}/${entry.fileName}`, {
|
|
recursive: true,
|
|
});
|
|
}
|
|
if (!ew&&entry.fileName.startsWith("overrides/")) {
|
|
const dirPath = `./instance/${instancename}/${entry.fileName.substring(
|
|
0,
|
|
entry.fileName.lastIndexOf("/")
|
|
)}`;
|
|
await fs.promises.mkdir(dirPath, { recursive: true });
|
|
const stream = await entry.openReadStream;
|
|
const write = fs.createWriteStream(`./instance/${instancename}/${entry.fileName}`);
|
|
await pipeline(stream, write);
|
|
}
|
|
this.ws.send(JSON.stringify({ status: "unzip", result: { name: entry.fileName,total: zip.length, current:index } }));
|
|
index++
|
|
}
|
|
/* 解压完成 */
|
|
}
|
|
}
|