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