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.
		
		
		
		
		
			
		
			
				
					163 lines
				
				4.3 KiB
			
		
		
			
		
	
	
					163 lines
				
				4.3 KiB
			| 
											3 years ago
										 | import { Busboy, BusboyConfig, BusboyFileStream } from "@fastify/busboy"; | ||
|  | import { FastifyPluginCallback } from "fastify"; | ||
|  | import { Readable } from 'stream'; | ||
|  | import { FastifyErrorConstructor } from "fastify-error"; | ||
|  | 
 | ||
|  | type MultipartHandler = ( | ||
|  |     field: string, | ||
|  |     file: any, | ||
|  |     filename: string, | ||
|  |     encoding: string, | ||
|  |     mimetype: string, | ||
|  | ) => void; | ||
|  | 
 | ||
|  | interface BodyEntry { | ||
|  |     data: Buffer, | ||
|  |     filename: string, | ||
|  |     encoding: string, | ||
|  |     mimetype: string, | ||
|  |     limit: false | ||
|  | } | ||
|  | 
 | ||
|  | export interface MultipartFields { | ||
|  |     [x: string]: Multipart | Multipart[]; | ||
|  | } | ||
|  | 
 | ||
|  | export type Multipart<T = true> = T extends true ? MultipartFile : MultipartValue<T>; | ||
|  | 
 | ||
|  | export interface MultipartFile { | ||
|  |   toBuffer: () => Promise<Buffer>, | ||
|  |   file: BusboyFileStream, | ||
|  |   filepath: string, | ||
|  |   fieldname: string, | ||
|  |   filename: string, | ||
|  |   encoding: string, | ||
|  |   mimetype: string, | ||
|  |   fields: MultipartFields | ||
|  | } | ||
|  | 
 | ||
|  | export interface MultipartValue<T> { | ||
|  |   value: T | ||
|  | } | ||
|  | 
 | ||
|  | interface MultipartErrors { | ||
|  |     PartsLimitError: FastifyErrorConstructor, | ||
|  |     FilesLimitError: FastifyErrorConstructor, | ||
|  |     FieldsLimitError: FastifyErrorConstructor, | ||
|  |     PrototypeViolationError: FastifyErrorConstructor, | ||
|  |     InvalidMultipartContentTypeError: FastifyErrorConstructor, | ||
|  |     RequestFileTooLargeError: FastifyErrorConstructor | ||
|  | } | ||
|  | 
 | ||
|  | declare module "fastify" { | ||
|  |     interface FastifyRequest { | ||
|  |         isMultipart: () => boolean; | ||
|  | 
 | ||
|  |         // promise api
 | ||
|  |         parts: (options?: Omit<BusboyConfig, 'headers'>) =>  AsyncIterableIterator<Multipart> | ||
|  | 
 | ||
|  |         // legacy
 | ||
|  |         multipart: (handler: MultipartHandler, next: (err: Error) => void, options?: Omit<BusboyConfig, 'headers'>) => Busboy; | ||
|  | 
 | ||
|  |         // Stream mode
 | ||
|  |         file: (options?: Omit<BusboyConfig, 'headers'>) => Promise<Multipart> | ||
|  |         files: (options?: Omit<BusboyConfig, 'headers'>) => AsyncIterableIterator<Multipart> | ||
|  | 
 | ||
|  |         // Disk mode
 | ||
|  |         saveRequestFiles: (options?: Omit<BusboyConfig, 'headers'> & { tmpdir?: string }) => Promise<Array<Multipart>> | ||
|  |         cleanRequestFiles: () => Promise<void> | ||
|  |         tmpUploads: Array<Multipart> | ||
|  |     } | ||
|  | 
 | ||
|  |     interface FastifyInstance { | ||
|  |         multipartErrors: MultipartErrors | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 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 FastifyMultipartAttactFieldsToBodyOptions extends FastifyMultipartBaseOptions { | ||
|  |     /** | ||
|  |      * Only valid in the promise api. Append the multipart parameters to the body object. | ||
|  |      */ | ||
|  |     attachFieldsToBody: true | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Manage the file stream like you need | ||
|  |      */ | ||
|  |     onFile?: (part: MultipartFile) => void | Promise<void>; | ||
|  | } | ||
|  | 
 | ||
|  | declare const fastifyMultipart: FastifyPluginCallback<FastifyMultipartOptions | FastifyMultipartAttactFieldsToBodyOptions>; | ||
|  | export default fastifyMultipart; |