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
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;
|