Skip to content

add solution#229

Open
6ORSH wants to merge 1 commit intomate-academy:masterfrom
6ORSH:develop
Open

add solution#229
6ORSH wants to merge 1 commit intomate-academy:masterfrom
6ORSH:develop

Conversation

@6ORSH
Copy link
Copy Markdown

@6ORSH 6ORSH commented Apr 15, 2026

No description provided.

Copy link
Copy Markdown

@mateacademy-ai-mentor mateacademy-ai-mentor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary

I am requesting changes because the implementation does not satisfy the explicit Streams requirement on the server side [CHECKLIST ITEM #11], even though most other functional requirements are correctly met.

Critical issues that must be fixed:

  • In src/createServer.js, the upload handler currently reads the entire file into memory using fs.readFile and then compresses it with buffer-based helpers like zlib.gzip, zlib.deflate, and zlib.brotliCompress; this violates the requirement to use streaming I/O and will not scale for large files. Instead, you should switch to a streaming pipeline such as:
    • const readStream = fs.createReadStream(filePath);
    • const compressor = zlib.createGzip() / zlib.createDeflate() / zlib.createBrotliCompress() chosen from your compressionTypes map.
    • Pipe them into the response: readStream.pipe(compressor).pipe(res);, setting Content-Type and Content-Disposition headers before starting the pipe, and adding .on('error', ...) handlers on the streams to send a 400/500 and cleanly end the response.
  • The compressionTypes mappings in both src/createServer.js and the logic tied to src/index.html currently refer to callback-based functions (e.g. zlib.gzip); these need to be updated to store the corresponding stream factory functions (zlib.createGzip, zlib.createDeflate, zlib.createBrotliCompress) so that your request handler can consistently create transform streams instead of compressing buffers.

Minor improvements (optional but recommended):

  • When setting the Content-Disposition header, quote the filename (e.g. attachment; filename="${safeName}.${ext}") to avoid issues with spaces or special characters.

Your form, routing, validation, and extension mapping are all well done, so once you refactor the compression path to use Node.js streams as described, your solution will fully align with the task requirements.


✨ Please rate this review in the Platform's notification center1. I will be grateful for your feedback! ✨

Important

Fix the issues, commit the changes, and then re-request my review using the Re-request review button2 in the Reviewers tab.

Tip

If you have any comments about this review, please leave a message in the Add a comment section below and mention me with the @mateacademy-ai-mentor tag3.
I will read your message during my next review of your pull request. Please do not reply directly to my comments, as that feature is not supported yet.

Caution

Do not close the pull request until the review is complete. Closing it early can lead to unexpected behavior and disrupt the review process.

Footnotes

  1. Rate AI review example

  2. Re-request AI review example

  3. Add AI review comments example

Comment thread src/createServer.js
Comment on lines +105 to +126
fs.readFile(filePath, (readError, fileBuffer) => {
if (readError) {
sendBadRequest(response);

return;
}

const { compress, extension } = compressionTypes[compressionType];

compress(fileBuffer, (compressError, compressed) => {
if (compressError) {
sendBadRequest(response);

return;
}

response.writeHead(200, {
'Content-Type': 'application/octet-stream',
'Content-Disposition': `attachment; filename=${filename}.${extension}`,
});
response.end(compressed);
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The server reads the entire uploaded file into memory using fs.readFile and then calls the non-stream zlib functions. This doesn't meet checklist item #11 which requires using Streams. Consider using fs.createReadStream(filePath) and piping it through the appropriate zlib transform (zlib.createGzip(), zlib.createDeflate(), or zlib.createBrotliCompress()) into the HTTP response to stream the compressed data.

Comment thread src/createServer.js
Comment on lines +9 to +22
const compressionTypes = {
gzip: {
compress: zlib.gzip,
extension: 'gz',
},
deflate: {
compress: zlib.deflate,
extension: 'dfl',
},
br: {
compress: zlib.brotliCompress,
extension: 'br',
},
};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The compressionTypes object maps to zlib.gzip, zlib.deflate, and zlib.brotliCompress (buffer-based functions). To comply with the Streams requirement (checklist item #11) replace these with the streaming compressors (zlib.createGzip, zlib.createDeflate, zlib.createBrotliCompress) and update the request handling to pipe streams instead of compressing buffers.

Comment thread src/index.html
Comment on lines +9 to +22
<h1>Compress a file</h1>
<form action="/compress" method="post" enctype="multipart/form-data">
<label>
Choose file:
<input type="file" name="file" required />
</label>
<br />
<label>
Compression type:
<select name="compressionType" required>
<option value="gzip">gzip</option>
<option value="deflate">deflate</option>
<option value="br">br</option>
</select>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

compressionTypes maps compress to the callback-based zlib functions (zlib.gzip, zlib.deflate, zlib.brotliCompress). To use streams you should instead store the stream factory functions (zlib.createGzip, zlib.createDeflate, zlib.createBrotliCompress) or otherwise adapt the code to create appropriate transform streams. This change is necessary for implementing streaming compression (checklist item #11).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants