// Definitions by: Jacob Baskin // BendingBender // Igor Savin /// 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: Event, listener: BusboyEvents[Event]): this; addListener(event: string | symbol, listener: (...args: any[]) => void): this; on(event: Event, listener: BusboyEvents[Event]): this; on(event: string | symbol, listener: (...args: any[]) => void): this; once(event: Event, listener: BusboyEvents[Event]): this; once(event: string | symbol, listener: (...args: any[]) => void): this; removeListener(event: Event, listener: BusboyEvents[Event]): this; removeListener(event: string | symbol, listener: (...args: any[]) => void): this; off(event: Event, listener: BusboyEvents[Event]): this; off(event: string | symbol, listener: (...args: any[]) => void): this; prependListener(event: Event, listener: BusboyEvents[Event]): this; prependListener(event: string | symbol, listener: (...args: any[]) => void): this; prependOnceListener(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; }