diff --git a/package.json b/package.json
index 1d03d64..612a995 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"devDependencies": {
"@faker-js/faker": "^8.4.1",
"@mate-academy/eslint-config": "latest",
- "@mate-academy/scripts": "^1.8.6",
+ "@mate-academy/scripts": "^2.1.3",
"axios": "^1.7.2",
"eslint": "^8.57.0",
"eslint-plugin-jest": "^28.6.0",
@@ -26,9 +26,13 @@
"form-data": "^4.0.0",
"formidable": "^3.5.1",
"jest": "^29.7.0",
+ "nodemon": "^3.1.11",
"prettier": "^3.3.2"
},
"mateAcademy": {
"projectType": "javascript"
+ },
+ "dependencies": {
+ "busboy": "^1.6.0"
}
}
diff --git a/src/createServer.js b/src/createServer.js
index 1cf1dda..293f813 100644
--- a/src/createServer.js
+++ b/src/createServer.js
@@ -1,8 +1,123 @@
+/* eslint-disable no-console */
'use strict';
+const http = require('http');
+const Busboy = require('busboy');
+const zlib = require('zlib');
+
function createServer() {
- /* Write your code here */
- // Return instance of http.Server class
+ const compressionTypes = {
+ gzip: () => zlib.createGzip(),
+ deflate: () => zlib.createDeflate(),
+ br: () => zlib.createBrotliCompress(),
+ };
+
+ return http.createServer((req, res) => {
+ if (req.method === 'GET' && req.url === '/') {
+ res.statusCode = 200;
+ res.setHeader('Content-Type', 'text/html');
+
+ res.end(`
+
+
+
+ File Compression
+
+
+ File Compression
+
+
+
+ `);
+
+ return;
+ }
+
+ if (req.method === 'GET' && req.url === '/compress') {
+ res.statusCode = 400;
+ res.end('Incorrect method');
+
+ return;
+ }
+
+ if (req.method === 'POST' && req.url === '/compress') {
+ const busboy = Busboy({ headers: req.headers });
+ const fields = {};
+ let fileBuffer = null;
+ let fileName = null;
+
+ busboy.on('field', (name, value) => {
+ fields[name] = value;
+ });
+
+ busboy.on('file', (fieldname, file, info) => {
+ const chunks = [];
+
+ fileName = info.filename;
+
+ file.on('data', (chunk) => chunks.push(chunk));
+
+ file.on('end', () => {
+ fileBuffer = Buffer.concat(chunks);
+ });
+ });
+
+ busboy.on('finish', () => {
+ const { compressionType } = fields;
+
+ if (
+ !fileBuffer ||
+ !compressionType ||
+ !compressionTypes[compressionType]
+ ) {
+ res.statusCode = 400;
+ res.end('Form Invalid');
+
+ return;
+ }
+
+ const compressor = compressionTypes[compressionType]();
+ const extensions = { gzip: '.gzip', deflate: '.deflate', br: '.br' };
+ const compressedFileName = `${fileName}${extensions[compressionType]}`;
+
+ res.statusCode = 200;
+ res.setHeader('Content-Type', 'application/octet-stream');
+
+ res.setHeader(
+ 'Content-Disposition',
+ `attachment; filename=${compressedFileName}`,
+ );
+
+ const { Readable } = require('stream');
+
+ Readable.from(fileBuffer).pipe(compressor).pipe(res);
+ });
+
+ req.pipe(busboy);
+
+ return;
+ }
+
+ res.statusCode = 404;
+ res.end('Not found');
+ });
}
module.exports = {