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