done purchases remove, ocr scan, read image
This commit is contained in:
28
express-server/node_modules/multer/lib/counter.js
generated
vendored
Normal file
28
express-server/node_modules/multer/lib/counter.js
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
var EventEmitter = require('events').EventEmitter
|
||||
|
||||
function Counter () {
|
||||
EventEmitter.call(this)
|
||||
this.value = 0
|
||||
}
|
||||
|
||||
Counter.prototype = Object.create(EventEmitter.prototype)
|
||||
|
||||
Counter.prototype.increment = function increment () {
|
||||
this.value++
|
||||
}
|
||||
|
||||
Counter.prototype.decrement = function decrement () {
|
||||
if (--this.value === 0) this.emit('zero')
|
||||
}
|
||||
|
||||
Counter.prototype.isZero = function isZero () {
|
||||
return (this.value === 0)
|
||||
}
|
||||
|
||||
Counter.prototype.onceZero = function onceZero (fn) {
|
||||
if (this.isZero()) return fn()
|
||||
|
||||
this.once('zero', fn)
|
||||
}
|
||||
|
||||
module.exports = Counter
|
67
express-server/node_modules/multer/lib/file-appender.js
generated
vendored
Normal file
67
express-server/node_modules/multer/lib/file-appender.js
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
var objectAssign = require('object-assign')
|
||||
|
||||
function arrayRemove (arr, item) {
|
||||
var idx = arr.indexOf(item)
|
||||
if (~idx) arr.splice(idx, 1)
|
||||
}
|
||||
|
||||
function FileAppender (strategy, req) {
|
||||
this.strategy = strategy
|
||||
this.req = req
|
||||
|
||||
switch (strategy) {
|
||||
case 'NONE': break
|
||||
case 'VALUE': break
|
||||
case 'ARRAY': req.files = []; break
|
||||
case 'OBJECT': req.files = Object.create(null); break
|
||||
default: throw new Error('Unknown file strategy: ' + strategy)
|
||||
}
|
||||
}
|
||||
|
||||
FileAppender.prototype.insertPlaceholder = function (file) {
|
||||
var placeholder = {
|
||||
fieldname: file.fieldname
|
||||
}
|
||||
|
||||
switch (this.strategy) {
|
||||
case 'NONE': break
|
||||
case 'VALUE': break
|
||||
case 'ARRAY': this.req.files.push(placeholder); break
|
||||
case 'OBJECT':
|
||||
if (this.req.files[file.fieldname]) {
|
||||
this.req.files[file.fieldname].push(placeholder)
|
||||
} else {
|
||||
this.req.files[file.fieldname] = [placeholder]
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
return placeholder
|
||||
}
|
||||
|
||||
FileAppender.prototype.removePlaceholder = function (placeholder) {
|
||||
switch (this.strategy) {
|
||||
case 'NONE': break
|
||||
case 'VALUE': break
|
||||
case 'ARRAY': arrayRemove(this.req.files, placeholder); break
|
||||
case 'OBJECT':
|
||||
if (this.req.files[placeholder.fieldname].length === 1) {
|
||||
delete this.req.files[placeholder.fieldname]
|
||||
} else {
|
||||
arrayRemove(this.req.files[placeholder.fieldname], placeholder)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
FileAppender.prototype.replacePlaceholder = function (placeholder, file) {
|
||||
if (this.strategy === 'VALUE') {
|
||||
this.req.file = file
|
||||
return
|
||||
}
|
||||
|
||||
delete placeholder.fieldname
|
||||
objectAssign(placeholder, file)
|
||||
}
|
||||
|
||||
module.exports = FileAppender
|
180
express-server/node_modules/multer/lib/make-middleware.js
generated
vendored
Normal file
180
express-server/node_modules/multer/lib/make-middleware.js
generated
vendored
Normal file
@ -0,0 +1,180 @@
|
||||
var is = require('type-is')
|
||||
var Busboy = require('busboy')
|
||||
var extend = require('xtend')
|
||||
var onFinished = require('on-finished')
|
||||
var appendField = require('append-field')
|
||||
|
||||
var Counter = require('./counter')
|
||||
var MulterError = require('./multer-error')
|
||||
var FileAppender = require('./file-appender')
|
||||
var removeUploadedFiles = require('./remove-uploaded-files')
|
||||
|
||||
function drainStream (stream) {
|
||||
stream.on('readable', stream.read.bind(stream))
|
||||
}
|
||||
|
||||
function makeMiddleware (setup) {
|
||||
return function multerMiddleware (req, res, next) {
|
||||
if (!is(req, ['multipart'])) return next()
|
||||
|
||||
var options = setup()
|
||||
|
||||
var limits = options.limits
|
||||
var storage = options.storage
|
||||
var fileFilter = options.fileFilter
|
||||
var fileStrategy = options.fileStrategy
|
||||
var preservePath = options.preservePath
|
||||
|
||||
req.body = Object.create(null)
|
||||
|
||||
var busboy
|
||||
|
||||
try {
|
||||
busboy = new Busboy({ headers: req.headers, limits: limits, preservePath: preservePath })
|
||||
} catch (err) {
|
||||
return next(err)
|
||||
}
|
||||
|
||||
var appender = new FileAppender(fileStrategy, req)
|
||||
var isDone = false
|
||||
var readFinished = false
|
||||
var errorOccured = false
|
||||
var pendingWrites = new Counter()
|
||||
var uploadedFiles = []
|
||||
|
||||
function done (err) {
|
||||
if (isDone) return
|
||||
isDone = true
|
||||
|
||||
req.unpipe(busboy)
|
||||
drainStream(req)
|
||||
busboy.removeAllListeners()
|
||||
|
||||
onFinished(req, function () { next(err) })
|
||||
}
|
||||
|
||||
function indicateDone () {
|
||||
if (readFinished && pendingWrites.isZero() && !errorOccured) done()
|
||||
}
|
||||
|
||||
function abortWithError (uploadError) {
|
||||
if (errorOccured) return
|
||||
errorOccured = true
|
||||
|
||||
pendingWrites.onceZero(function () {
|
||||
function remove (file, cb) {
|
||||
storage._removeFile(req, file, cb)
|
||||
}
|
||||
|
||||
removeUploadedFiles(uploadedFiles, remove, function (err, storageErrors) {
|
||||
if (err) return done(err)
|
||||
|
||||
uploadError.storageErrors = storageErrors
|
||||
done(uploadError)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function abortWithCode (code, optionalField) {
|
||||
abortWithError(new MulterError(code, optionalField))
|
||||
}
|
||||
|
||||
// handle text field data
|
||||
busboy.on('field', function (fieldname, value, fieldnameTruncated, valueTruncated) {
|
||||
if (fieldnameTruncated) return abortWithCode('LIMIT_FIELD_KEY')
|
||||
if (valueTruncated) return abortWithCode('LIMIT_FIELD_VALUE', fieldname)
|
||||
|
||||
// Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6)
|
||||
if (limits && limits.hasOwnProperty('fieldNameSize')) {
|
||||
if (fieldname.length > limits.fieldNameSize) return abortWithCode('LIMIT_FIELD_KEY')
|
||||
}
|
||||
|
||||
appendField(req.body, fieldname, value)
|
||||
})
|
||||
|
||||
// handle files
|
||||
busboy.on('file', function (fieldname, fileStream, filename, encoding, mimetype) {
|
||||
// don't attach to the files object, if there is no file
|
||||
if (!filename) return fileStream.resume()
|
||||
|
||||
// Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6)
|
||||
if (limits && limits.hasOwnProperty('fieldNameSize')) {
|
||||
if (fieldname.length > limits.fieldNameSize) return abortWithCode('LIMIT_FIELD_KEY')
|
||||
}
|
||||
|
||||
var file = {
|
||||
fieldname: fieldname,
|
||||
originalname: filename,
|
||||
encoding: encoding,
|
||||
mimetype: mimetype
|
||||
}
|
||||
|
||||
var placeholder = appender.insertPlaceholder(file)
|
||||
|
||||
fileFilter(req, file, function (err, includeFile) {
|
||||
if (err) {
|
||||
appender.removePlaceholder(placeholder)
|
||||
return abortWithError(err)
|
||||
}
|
||||
|
||||
if (!includeFile) {
|
||||
appender.removePlaceholder(placeholder)
|
||||
return fileStream.resume()
|
||||
}
|
||||
|
||||
var aborting = false
|
||||
pendingWrites.increment()
|
||||
|
||||
Object.defineProperty(file, 'stream', {
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
value: fileStream
|
||||
})
|
||||
|
||||
fileStream.on('error', function (err) {
|
||||
pendingWrites.decrement()
|
||||
abortWithError(err)
|
||||
})
|
||||
|
||||
fileStream.on('limit', function () {
|
||||
aborting = true
|
||||
abortWithCode('LIMIT_FILE_SIZE', fieldname)
|
||||
})
|
||||
|
||||
storage._handleFile(req, file, function (err, info) {
|
||||
if (aborting) {
|
||||
appender.removePlaceholder(placeholder)
|
||||
uploadedFiles.push(extend(file, info))
|
||||
return pendingWrites.decrement()
|
||||
}
|
||||
|
||||
if (err) {
|
||||
appender.removePlaceholder(placeholder)
|
||||
pendingWrites.decrement()
|
||||
return abortWithError(err)
|
||||
}
|
||||
|
||||
var fileInfo = extend(file, info)
|
||||
|
||||
appender.replacePlaceholder(placeholder, fileInfo)
|
||||
uploadedFiles.push(fileInfo)
|
||||
pendingWrites.decrement()
|
||||
indicateDone()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
busboy.on('error', function (err) { abortWithError(err) })
|
||||
busboy.on('partsLimit', function () { abortWithCode('LIMIT_PART_COUNT') })
|
||||
busboy.on('filesLimit', function () { abortWithCode('LIMIT_FILE_COUNT') })
|
||||
busboy.on('fieldsLimit', function () { abortWithCode('LIMIT_FIELD_COUNT') })
|
||||
busboy.on('finish', function () {
|
||||
readFinished = true
|
||||
indicateDone()
|
||||
})
|
||||
|
||||
req.pipe(busboy)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = makeMiddleware
|
23
express-server/node_modules/multer/lib/multer-error.js
generated
vendored
Normal file
23
express-server/node_modules/multer/lib/multer-error.js
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
var util = require('util')
|
||||
|
||||
var errorMessages = {
|
||||
'LIMIT_PART_COUNT': 'Too many parts',
|
||||
'LIMIT_FILE_SIZE': 'File too large',
|
||||
'LIMIT_FILE_COUNT': 'Too many files',
|
||||
'LIMIT_FIELD_KEY': 'Field name too long',
|
||||
'LIMIT_FIELD_VALUE': 'Field value too long',
|
||||
'LIMIT_FIELD_COUNT': 'Too many fields',
|
||||
'LIMIT_UNEXPECTED_FILE': 'Unexpected field'
|
||||
}
|
||||
|
||||
function MulterError (code, field) {
|
||||
Error.captureStackTrace(this, this.constructor)
|
||||
this.name = this.constructor.name
|
||||
this.message = errorMessages[code]
|
||||
this.code = code
|
||||
if (field) this.field = field
|
||||
}
|
||||
|
||||
util.inherits(MulterError, Error)
|
||||
|
||||
module.exports = MulterError
|
28
express-server/node_modules/multer/lib/remove-uploaded-files.js
generated
vendored
Normal file
28
express-server/node_modules/multer/lib/remove-uploaded-files.js
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
function removeUploadedFiles (uploadedFiles, remove, cb) {
|
||||
var length = uploadedFiles.length
|
||||
var errors = []
|
||||
|
||||
if (length === 0) return cb(null, errors)
|
||||
|
||||
function handleFile (idx) {
|
||||
var file = uploadedFiles[idx]
|
||||
|
||||
remove(file, function (err) {
|
||||
if (err) {
|
||||
err.file = file
|
||||
err.field = file.fieldname
|
||||
errors.push(err)
|
||||
}
|
||||
|
||||
if (idx < length - 1) {
|
||||
handleFile(idx + 1)
|
||||
} else {
|
||||
cb(null, errors)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
handleFile(0)
|
||||
}
|
||||
|
||||
module.exports = removeUploadedFiles
|
Reference in New Issue
Block a user