Using POO do not increace performances
This commit is contained in:
parent
84bb2338d1
commit
6bb7f7dc16
@ -32,73 +32,70 @@ export async function extractArchive(params: {
|
|||||||
dDone.resolve();
|
dDone.resolve();
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: See benchmark if using a class here improves the performance over anonymous functions
|
const writeFile = async (
|
||||||
class FileWriter {
|
entry: yauzl.Entry,
|
||||||
constructor(private entry: yauzl.Entry) {}
|
params: {
|
||||||
|
|
||||||
public async writeToFile(params: {
|
|
||||||
filePath: string;
|
filePath: string;
|
||||||
modifiedData?: Buffer;
|
modifiedData?: Buffer;
|
||||||
}): Promise<void> {
|
}
|
||||||
const { filePath, modifiedData } = params;
|
): Promise<void> => {
|
||||||
|
const { filePath, modifiedData } = params;
|
||||||
|
|
||||||
await fs.mkdir(pathDirname(filePath), { recursive: true });
|
await fs.mkdir(pathDirname(filePath), { recursive: true });
|
||||||
|
|
||||||
if (modifiedData !== undefined) {
|
if (modifiedData !== undefined) {
|
||||||
await fs.writeFile(filePath, modifiedData);
|
await fs.writeFile(filePath, modifiedData);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const readStream = await new Promise<stream.Readable>(resolve =>
|
const readStream = await new Promise<stream.Readable>(resolve =>
|
||||||
zipFile.openReadStream(this.entry, async (error, readStream) => {
|
zipFile.openReadStream(entry, async (error, readStream) => {
|
||||||
if (error) {
|
|
||||||
dDone.reject(error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve(readStream);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const dDoneWithFile = new Deferred<void>();
|
|
||||||
|
|
||||||
stream.pipeline(readStream, fsSync.createWriteStream(filePath), error => {
|
|
||||||
if (error) {
|
if (error) {
|
||||||
dDone.reject(error);
|
dDone.reject(error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDoneWithFile.resolve();
|
resolve(readStream);
|
||||||
});
|
})
|
||||||
|
);
|
||||||
|
|
||||||
await dDoneWithFile.pr;
|
const dDoneWithFile = new Deferred<void>();
|
||||||
}
|
|
||||||
|
|
||||||
public readFile(): Promise<Buffer> {
|
stream.pipeline(readStream, fsSync.createWriteStream(filePath), error => {
|
||||||
return new Promise<Buffer>(resolve =>
|
if (error) {
|
||||||
zipFile.openReadStream(this.entry, async (error, readStream) => {
|
dDone.reject(error);
|
||||||
if (error) {
|
return;
|
||||||
dDone.reject(error);
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const chunks: Buffer[] = [];
|
dDoneWithFile.resolve();
|
||||||
|
});
|
||||||
|
|
||||||
readStream.on("data", chunk => {
|
await dDoneWithFile.pr;
|
||||||
chunks.push(chunk);
|
};
|
||||||
});
|
|
||||||
|
|
||||||
readStream.on("end", () => {
|
const readFile = (entry: yauzl.Entry) =>
|
||||||
resolve(Buffer.concat(chunks));
|
new Promise<Buffer>(resolve =>
|
||||||
});
|
zipFile.openReadStream(entry, async (error, readStream) => {
|
||||||
|
if (error) {
|
||||||
|
dDone.reject(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
readStream.on("error", error => {
|
const chunks: Buffer[] = [];
|
||||||
dDone.reject(error);
|
|
||||||
});
|
readStream.on("data", chunk => {
|
||||||
})
|
chunks.push(chunk);
|
||||||
);
|
});
|
||||||
}
|
|
||||||
}
|
readStream.on("end", () => {
|
||||||
|
resolve(Buffer.concat(chunks));
|
||||||
|
});
|
||||||
|
|
||||||
|
readStream.on("error", error => {
|
||||||
|
dDone.reject(error);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
zipFile.on("entry", async (entry: yauzl.Entry) => {
|
zipFile.on("entry", async (entry: yauzl.Entry) => {
|
||||||
handle_file: {
|
handle_file: {
|
||||||
@ -107,12 +104,10 @@ export async function extractArchive(params: {
|
|||||||
break handle_file;
|
break handle_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
const fileWriter = new FileWriter(entry);
|
|
||||||
|
|
||||||
await onArchiveFile({
|
await onArchiveFile({
|
||||||
relativeFilePathInArchive: entry.fileName.split("/").join(pathSep),
|
relativeFilePathInArchive: entry.fileName.split("/").join(pathSep),
|
||||||
readFile: fileWriter.readFile.bind(fileWriter),
|
readFile: () => readFile(entry),
|
||||||
writeFile: fileWriter.writeToFile.bind(fileWriter)
|
writeFile: params => writeFile(entry, params)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user