85 lines
2.1 KiB
JavaScript
Executable file
85 lines
2.1 KiB
JavaScript
Executable file
'use strict'
|
|
|
|
const WritableStream = require('node:stream').Writable
|
|
const { inherits } = require('node:util')
|
|
const Dicer = require('../deps/dicer/lib/Dicer')
|
|
|
|
const MultipartParser = require('./types/multipart')
|
|
const UrlencodedParser = require('./types/urlencoded')
|
|
const parseParams = require('./utils/parseParams')
|
|
|
|
function Busboy (opts) {
|
|
if (!(this instanceof Busboy)) { return new Busboy(opts) }
|
|
|
|
if (typeof opts !== 'object') {
|
|
throw new TypeError('Busboy expected an options-Object.')
|
|
}
|
|
if (typeof opts.headers !== 'object') {
|
|
throw new TypeError('Busboy expected an options-Object with headers-attribute.')
|
|
}
|
|
if (typeof opts.headers['content-type'] !== 'string') {
|
|
throw new TypeError('Missing Content-Type-header.')
|
|
}
|
|
|
|
const {
|
|
headers,
|
|
...streamOptions
|
|
} = opts
|
|
|
|
this.opts = {
|
|
autoDestroy: false,
|
|
...streamOptions
|
|
}
|
|
WritableStream.call(this, this.opts)
|
|
|
|
this._done = false
|
|
this._parser = this.getParserByHeaders(headers)
|
|
this._finished = false
|
|
}
|
|
inherits(Busboy, WritableStream)
|
|
|
|
Busboy.prototype.emit = function (ev) {
|
|
if (ev === 'finish') {
|
|
if (!this._done) {
|
|
this._parser?.end()
|
|
return
|
|
} else if (this._finished) {
|
|
return
|
|
}
|
|
this._finished = true
|
|
}
|
|
WritableStream.prototype.emit.apply(this, arguments)
|
|
}
|
|
|
|
Busboy.prototype.getParserByHeaders = function (headers) {
|
|
const parsed = parseParams(headers['content-type'])
|
|
|
|
const cfg = {
|
|
defCharset: this.opts.defCharset,
|
|
fileHwm: this.opts.fileHwm,
|
|
headers,
|
|
highWaterMark: this.opts.highWaterMark,
|
|
isPartAFile: this.opts.isPartAFile,
|
|
limits: this.opts.limits,
|
|
parsedConType: parsed,
|
|
preservePath: this.opts.preservePath
|
|
}
|
|
|
|
if (MultipartParser.detect.test(parsed[0])) {
|
|
return new MultipartParser(this, cfg)
|
|
}
|
|
if (UrlencodedParser.detect.test(parsed[0])) {
|
|
return new UrlencodedParser(this, cfg)
|
|
}
|
|
throw new Error('Unsupported Content-Type.')
|
|
}
|
|
|
|
Busboy.prototype._write = function (chunk, encoding, cb) {
|
|
this._parser.write(chunk, cb)
|
|
}
|
|
|
|
module.exports = Busboy
|
|
module.exports.default = Busboy
|
|
module.exports.Busboy = Busboy
|
|
|
|
module.exports.Dicer = Dicer
|