Using POO do not increace performances

This commit is contained in:
Joseph Garrone 2024-05-25 12:30:21 +02:00
parent 84bb2338d1
commit 6bb7f7dc16

View File

@ -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)
}); });
} }