express-fileupload
Advanced tools
Comparing version 1.1.7-alpha.1 to 1.1.7-alpha.2
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) |
1211375
35
2226