197 lines
6.5 KiB
TypeScript
197 lines
6.5 KiB
TypeScript
|
// Definitions by: Jacob Baskin <https://github.com/jacobbaskin>
|
||
|
// BendingBender <https://github.com/BendingBender>
|
||
|
// Igor Savin <https://github.com/kibertoad>
|
||
|
|
||
|
/// <reference types="node" />
|
||
|
|
||
|
import * as http from 'http';
|
||
|
import { Readable, Writable } from 'stream';
|
||
|
export { Dicer } from "../deps/dicer/lib/dicer";
|
||
|
|
||
|
export const Busboy: BusboyConstructor;
|
||
|
export default Busboy;
|
||
|
|
||
|
export interface BusboyConfig {
|
||
|
/**
|
||
|
* These are the HTTP headers of the incoming request, which are used by individual parsers.
|
||
|
*/
|
||
|
headers: BusboyHeaders;
|
||
|
/**
|
||
|
* `highWaterMark` to use for this Busboy instance.
|
||
|
* @default WritableStream default.
|
||
|
*/
|
||
|
highWaterMark?: number | undefined;
|
||
|
/**
|
||
|
* highWaterMark to use for file streams.
|
||
|
* @default ReadableStream default.
|
||
|
*/
|
||
|
fileHwm?: number | undefined;
|
||
|
/**
|
||
|
* Default character set to use when one isn't defined.
|
||
|
* @default 'utf8'
|
||
|
*/
|
||
|
defCharset?: string | undefined;
|
||
|
/**
|
||
|
* Detect if a Part is a file.
|
||
|
*
|
||
|
* By default a file is detected if contentType
|
||
|
* is application/octet-stream or fileName is not
|
||
|
* undefined.
|
||
|
*
|
||
|
* Modify this to handle e.g. Blobs.
|
||
|
*/
|
||
|
isPartAFile?: (fieldName: string | undefined, contentType: string | undefined, fileName: string | undefined) => boolean;
|
||
|
/**
|
||
|
* If paths in the multipart 'filename' field shall be preserved.
|
||
|
* @default false
|
||
|
*/
|
||
|
preservePath?: boolean | undefined;
|
||
|
/**
|
||
|
* Various limits on incoming data.
|
||
|
*/
|
||
|
limits?:
|
||
|
| {
|
||
|
/**
|
||
|
* Max field name size (in bytes)
|
||
|
* @default 100 bytes
|
||
|
*/
|
||
|
fieldNameSize?: number | undefined;
|
||
|
/**
|
||
|
* Max field value size (in bytes)
|
||
|
* @default 1MB
|
||
|
*/
|
||
|
fieldSize?: number | undefined;
|
||
|
/**
|
||
|
* Max number of non-file fields
|
||
|
* @default Infinity
|
||
|
*/
|
||
|
fields?: number | undefined;
|
||
|
/**
|
||
|
* For multipart forms, the max file size (in bytes)
|
||
|
* @default Infinity
|
||
|
*/
|
||
|
fileSize?: number | undefined;
|
||
|
/**
|
||
|
* For multipart forms, the max number of file fields
|
||
|
* @default Infinity
|
||
|
*/
|
||
|
files?: number | undefined;
|
||
|
/**
|
||
|
* For multipart forms, the max number of parts (fields + files)
|
||
|
* @default Infinity
|
||
|
*/
|
||
|
parts?: number | undefined;
|
||
|
/**
|
||
|
* For multipart forms, the max number of header key=>value pairs to parse
|
||
|
* @default 2000
|
||
|
*/
|
||
|
headerPairs?: number | undefined;
|
||
|
|
||
|
/**
|
||
|
* For multipart forms, the max size of a header part
|
||
|
* @default 81920
|
||
|
*/
|
||
|
headerSize?: number | undefined;
|
||
|
}
|
||
|
| undefined;
|
||
|
}
|
||
|
|
||
|
export type BusboyHeaders = { 'content-type': string } & http.IncomingHttpHeaders;
|
||
|
|
||
|
export interface BusboyFileStream extends
|
||
|
Readable {
|
||
|
|
||
|
truncated: boolean;
|
||
|
|
||
|
/**
|
||
|
* The number of bytes that have been read so far.
|
||
|
*/
|
||
|
bytesRead: number;
|
||
|
}
|
||
|
|
||
|
export interface Busboy extends Writable {
|
||
|
addListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
addListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
|
||
|
on<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
|
||
|
once<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
|
||
|
removeListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
|
||
|
off<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
|
||
|
prependListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
|
||
|
prependOnceListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||
|
|
||
|
prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||
|
}
|
||
|
|
||
|
export interface BusboyEvents {
|
||
|
/**
|
||
|
* Emitted for each new file form field found.
|
||
|
*
|
||
|
* * Note: if you listen for this event, you should always handle the `stream` no matter if you care about the
|
||
|
* file contents or not (e.g. you can simply just do `stream.resume();` if you want to discard the contents),
|
||
|
* otherwise the 'finish' event will never fire on the Busboy instance. However, if you don't care about **any**
|
||
|
* incoming files, you can simply not listen for the 'file' event at all and any/all files will be automatically
|
||
|
* and safely discarded (these discarded files do still count towards `files` and `parts` limits).
|
||
|
* * If a configured file size limit was reached, `stream` will both have a boolean property `truncated`
|
||
|
* (best checked at the end of the stream) and emit a 'limit' event to notify you when this happens.
|
||
|
*
|
||
|
* @param listener.transferEncoding Contains the 'Content-Transfer-Encoding' value for the file stream.
|
||
|
* @param listener.mimeType Contains the 'Content-Type' value for the file stream.
|
||
|
*/
|
||
|
file: (
|
||
|
fieldname: string,
|
||
|
stream: BusboyFileStream,
|
||
|
filename: string,
|
||
|
transferEncoding: string,
|
||
|
mimeType: string,
|
||
|
) => void;
|
||
|
/**
|
||
|
* Emitted for each new non-file field found.
|
||
|
*/
|
||
|
field: (
|
||
|
fieldname: string,
|
||
|
value: string,
|
||
|
fieldnameTruncated: boolean,
|
||
|
valueTruncated: boolean,
|
||
|
transferEncoding: string,
|
||
|
mimeType: string,
|
||
|
) => void;
|
||
|
finish: () => void;
|
||
|
/**
|
||
|
* Emitted when specified `parts` limit has been reached. No more 'file' or 'field' events will be emitted.
|
||
|
*/
|
||
|
partsLimit: () => void;
|
||
|
/**
|
||
|
* Emitted when specified `files` limit has been reached. No more 'file' events will be emitted.
|
||
|
*/
|
||
|
filesLimit: () => void;
|
||
|
/**
|
||
|
* Emitted when specified `fields` limit has been reached. No more 'field' events will be emitted.
|
||
|
*/
|
||
|
fieldsLimit: () => void;
|
||
|
error: (error: unknown) => void;
|
||
|
}
|
||
|
|
||
|
export interface BusboyConstructor {
|
||
|
(options: BusboyConfig): Busboy;
|
||
|
|
||
|
new(options: BusboyConfig): Busboy;
|
||
|
}
|
||
|
|