Socket
Socket
Sign inDemoInstall

express-fileupload

Package Overview
Dependencies
3
Maintainers
2
Versions
48
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.1.7-alpha.1 to 1.1.7-alpha.2

lib/uploadtimer.js

26

lib/memHandler.js
const crypto = require('crypto');
const {debugLog} = require('./utilities');
const { debugLog } = require('./utilities');

@@ -12,24 +12,32 @@ /**

module.exports = (options, fieldname, filename) => {
let buffers = [];
let fileSize = 0; // eslint-disable-line
let hash = crypto.createHash('md5');
const buffers = [];
const hash = crypto.createHash('md5');
let fileSize = 0;
let completed = false;
const getBuffer = () => Buffer.concat(buffers, fileSize);
const emptyFunc = () => '';
return {
dataHandler: (data) => {
if (completed === true) {
debugLog(options, `Error: got ${fieldname}->${filename} data chunk for completed upload!`);
return;
}
buffers.push(data);
hash.update(data);
fileSize += data.length;
debugLog(options, `Uploading ${fieldname} -> ${filename}, bytes: ${fileSize}`);
debugLog(options, `Uploading ${fieldname}->${filename}, bytes:${fileSize}...`);
},
getBuffer: getBuffer,
getFilePath: emptyFunc,
getFilePath: () => '',
getFileSize: () => fileSize,
getHash: () => hash.digest('hex'),
complete: getBuffer,
cleanup: emptyFunc,
complete: () => {
debugLog(options, `Upload ${fieldname}->${filename} completed, bytes:${fileSize}.`);
completed = true;
return getBuffer();
},
cleanup: () => { completed = true; },
getWritePromise: () => Promise.resolve()
};
};
const Busboy = require('busboy');
const UploadTimer = require('./uploadtimer');
const fileFactory = require('./fileFactory');

@@ -59,13 +60,7 @@ const memHandler = require('./memHandler');

: memHandler(options, field, filename); // Upload into RAM.
// Define upload timer settings and clear/set functions.
let uploadTimer = null;
const timeout = options.uploadTimeout;
const clearUploadTimer = () => clearTimeout(uploadTimer);
const setUploadTimer = () => {
clearUploadTimer();
uploadTimer = setTimeout(() => {
debugLog(options, `Upload timeout ${field}->${filename}, bytes:${getFileSize()}`);
cleanup();
}, timeout);
};
// Define upload timer.
const uploadTimer = new UploadTimer(options.uploadTimeout, () => {
debugLog(options, `Upload timeout ${field}->${filename}, bytes:${getFileSize()}`);
cleanup();
});

@@ -75,3 +70,3 @@ file.on('limit', () => {

// Reset upload timer in case of file limit reached.
clearUploadTimer();
uploadTimer.clear();
// Run a user defined limit handler if it has been set.

@@ -88,3 +83,3 @@ if (isFunc(options.limitHandler)) return options.limitHandler(req, res, next);

file.on('data', (data) => {
setUploadTimer(); // Set upload timer each time new data chunk came.
uploadTimer.set(); // Refresh upload timer each time new data chunk came.
dataHandler(data); // Handle new piece of data.

@@ -97,3 +92,3 @@ });

// Reset upload timer in case of end event.
clearUploadTimer();
uploadTimer.clear();
// Add file instance to the req.files

@@ -119,3 +114,3 @@ req.files = buildFields(req.files, field, fileFactory({

// Reset upload timer in case of errors.
clearUploadTimer();
uploadTimer.clear();
debugLog(options, `Error ${field}->${filename}, bytes:${getFileSize()}, error:${err}`);

@@ -129,28 +124,21 @@ cleanup();

// Set new upload timeout for a new file.
setUploadTimer();
uploadTimer.set();
});
busboy.on('finish', () => {
const handler = (err) => {
if (options.parseNested) {
req.body = processNested(req.body);
req.files = processNested(req.files);
}
next(err);
};
if (options.parseNested) {
req.body = processNested(req.body);
req.files = processNested(req.files);
}
if (req[waitFlushProperty]) {
Promise.all(req[waitFlushProperty])
.then(() => {
delete req[waitFlushProperty];
handler();
})
.catch(err => {
delete req[waitFlushProperty];
debugLog(options, `Error wait flush error:${err}`);
handler(err);
});
} else {
handler();
}
if (!req[waitFlushProperty]) return next();
Promise.all(req[waitFlushProperty])
.then(() => {
delete req[waitFlushProperty];
next();
}).catch(err => {
delete req[waitFlushProperty];
debugLog(options, `Error while waiting files flush: ${err}`);
next(err);
});
});

@@ -157,0 +145,0 @@

@@ -14,3 +14,3 @@ const fs = require('fs');

const tempFilePath = path.join(dir, getTempFilename());
checkAndMakeDir({createParentPath: true}, tempFilePath);
checkAndMakeDir({ createParentPath: true }, tempFilePath);

@@ -21,4 +21,6 @@ debugLog(options, `Temporary file path is ${tempFilePath}`);

const writeStream = fs.createWriteStream(tempFilePath);
let fileSize = 0; // eslint-disable-line
const promise = new Promise((resolve, reject) => {
let fileSize = 0;
let completed = false;
const writePromise = new Promise((resolve, reject) => {
writeStream.on('finish', () => {

@@ -28,3 +30,3 @@ resolve();

writeStream.on('error', (err) => {
debugLog(options, `Error write temp file error:${err}`);
debugLog(options, `Error write temp file: ${err}`);
reject(err);

@@ -36,2 +38,6 @@ });

dataHandler: (data) => {
if (completed === true) {
debugLog(options, `Error: got ${fieldname}->${filename} data chunk for completed upload!`);
return;
}
writeStream.write(data);

@@ -46,3 +52,5 @@ hash.update(data);

complete: () => {
debugLog(options, `Upload ${fieldname}->${filename} completed, bytes:${fileSize}.`);
writeStream.end();
completed = true;
// Return empty buff since data was uploaded into a temp file.

@@ -54,8 +62,7 @@ return Buffer.concat([]);

writeStream.end();
completed = true;
deleteFile(tempFilePath, (err) => { if (err) throw err; });
},
getWritePromise: () => {
return promise;
}
getWritePromise: () => writePromise
};
};
{
"name": "express-fileupload",
"version": "1.1.7-alpha.1",
"version": "1.1.7-alpha.2",
"author": "Richard Girges <richardgirges@gmail.com>",

@@ -5,0 +5,0 @@ "description": "Simple express file upload middleware that wraps around Busboy",

@@ -5,3 +5,3 @@ # express-fileupload

[![npm](https://img.shields.io/npm/v/express-fileupload.svg)](https://www.npmjs.org/package/express-fileupload)
[![Build Status](https://travis-ci.org/richardgirges/express-fileupload.svg?branch=master)](https://travis-ci.org/richardgirges/express-fileupload)
[![Build Status](https://travis-ci.com/richardgirges/express-fileupload.svg?branch=master)](https://travis-ci.com/richardgirges/express-fileupload)
[![downloads per month](http://img.shields.io/npm/dm/express-fileupload.svg)](https://www.npmjs.org/package/express-fileupload)

@@ -8,0 +8,0 @@ [![Coverage Status](https://img.shields.io/coveralls/richardgirges/express-fileupload.svg)](https://coveralls.io/r/richardgirges/express-fileupload)

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc