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
			| 
								 
											3 years ago
										 
									 | 
							
								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;
							 |