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