You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
5.1 KiB

import { Busboy, BusboyConfig, BusboyFileStream } from "@fastify/busboy";
import { FastifyPluginCallback } from "fastify";
import { Readable } from "stream";
import { FastifyErrorConstructor } from "@fastify/error";
declare module "fastify" {
interface FastifyRequest {
isMultipart: () => boolean;
// promise api
parts: (
options?: Omit<BusboyConfig, "headers">
) => AsyncIterableIterator<fastifyMultipart.Multipart>;
// legacy
multipart: (
handler: MultipartHandler,
next: (err: Error) => void,
options?: Omit<BusboyConfig, "headers">
) => Busboy;
// Stream mode
file: (
options?: Omit<BusboyConfig, "headers">
) => Promise<fastifyMultipart.MultipartFile | undefined>;
files: (
options?: Omit<BusboyConfig, "headers">
) => AsyncIterableIterator<fastifyMultipart.MultipartFile>;
// Disk mode
saveRequestFiles: (
options?: Omit<BusboyConfig, "headers"> & { tmpdir?: string }
) => Promise<Array<fastifyMultipart.SavedMultipartFile>>;
cleanRequestFiles: () => Promise<void>;
tmpUploads: Array<string> | null;
}
interface FastifyInstance {
multipartErrors: MultipartErrors;
}
}
type FastifyMultipartPlugin = FastifyPluginCallback<
| fastifyMultipart.FastifyMultipartBaseOptions
| fastifyMultipart.FastifyMultipartOptions
| fastifyMultipart.FastifyMultipartAttachFieldsToBodyOptions
>;
type MultipartHandler = (
field: string,
file: BusboyFileStream,
filename: string,
encoding: string,
mimetype: string
) => void;
interface BodyEntry {
data: Buffer;
filename: string;
encoding: string;
mimetype: string;
limit: false;
}
interface MultipartErrors {
PartsLimitError: FastifyErrorConstructor;
FilesLimitError: FastifyErrorConstructor;
FieldsLimitError: FastifyErrorConstructor;
PrototypeViolationError: FastifyErrorConstructor;
InvalidMultipartContentTypeError: FastifyErrorConstructor;
RequestFileTooLargeError: FastifyErrorConstructor;
}
declare namespace fastifyMultipart {
export interface SavedMultipartFile extends MultipartFile {
/**
* Path to the temporary file
*/
filepath: string;
}
export type Multipart = MultipartFile | MultipartValue;
export interface MultipartFile {
toBuffer: () => Promise<Buffer>;
file: BusboyFileStream;
fieldname: string;
filename: string;
encoding: string;
mimetype: string;
fields: MultipartFields;
}
export interface MultipartValue<T = unknown> {
value: T;
fieldname: string;
mimetype: string;
encoding: string;
fieldnameTruncated: boolean;
valueTruncated: boolean;
fields: MultipartFields;
}
export interface MultipartFields {
[fieldname: string]: Multipart | Multipart[] | undefined;
}
export interface FastifyMultipartBaseOptions {
/**
* Append the multipart parameters to the body object
*/
addToBody?: boolean;
/**
* Add a shared schema to validate the input fields
*/
sharedSchemaId?: string;
/**
* Allow throwing error when file size limit reached.
*/
throwFileSizeLimit?: boolean;
/**
* 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;
limits?: {
/**
* Max field name size in bytes
*/
fieldNameSize?: number;
/**
* Max field value size in bytes
*/
fieldSize?: number;
/**
* Max number of non-file fields
*/
fields?: number;
/**
* For multipart forms, the max file size
*/
fileSize?: number;
/**
* Max number of file fields
*/
files?: number;
/**
* Max number of header key=>value pairs
*/
headerPairs?: number;
};
}
export interface FastifyMultipartOptions extends FastifyMultipartBaseOptions {
/**
* Only valid in the promise api. Append the multipart parameters to the body object.
*/
attachFieldsToBody?: false;
/**
* Manage the file stream like you need
*/
onFile?: (
fieldName: string,
stream: Readable,
filename: string,
encoding: string,
mimetype: string,
body: Record<string, BodyEntry>
) => void | Promise<void>;
}
export interface FastifyMultipartAttachFieldsToBodyOptions
extends FastifyMultipartBaseOptions {
/**
* Only valid in the promise api. Append the multipart parameters to the body object.
*/
attachFieldsToBody: true | "keyValues";
/**
* Manage the file stream like you need
*/
onFile?: (part: MultipartFile) => void | Promise<void>;
}
export const fastifyMultipart: FastifyMultipartPlugin;
export { fastifyMultipart as default };
}
declare function fastifyMultipart(
...params: Parameters<FastifyMultipartPlugin>
): ReturnType<FastifyMultipartPlugin>;
export = fastifyMultipart;