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