@celosiajs/file-upload
Version:
CelosiaJS File Upload. A framework for REST API based on Express.js
3 lines (2 loc) • 4.9 kB
JavaScript
var F=(s=>(s[s.FileSize=0]="FileSize",s[s.FieldNameTruncated=1]="FieldNameTruncated",s[s.FieldValueTruncated=2]="FieldValueTruncated",s[s.Parts=3]="Parts",s[s.Files=4]="Files",s[s.Fields=5]="Fields",s))(F||{}),u=(i=>(i[i.FileStream=0]="FileStream",i[i.Busboy=1]="Busboy",i))(u||{});import k from"busboy";import{Readable as R,Writable as z}from"stream";import{Middleware as C}from"@celosiajs/core";import b from"append-field";var h=class extends C{options;constructor(t={}){super("FileUpload"),this.options={defaultCharset:t.defaultCharset??"utf8",defaultParameterCharset:t.defaultParameterCharset??"latin1",preservePath:t.preservePath??!1,highWaterMark:t.highWaterMark??z.getDefaultHighWaterMark(!1),fileHighWaterMark:t.fileHighWaterMark??R.getDefaultHighWaterMark(!1),ignoreLimits:t.ignoreLimits??!1,limits:{fieldNameSize:t.limits?.fieldNameSize??100,fields:t.limits?.fields??1/0,fieldSize:t.limits?.fieldSize??1048576,headerPairs:t.limits?.headerPairs??2e3,fileSize:t.limits?.fileSize??1/0,files:t.limits?.files??1/0,parts:t.limits?.parts??1/0},limitExceededHandler:t.limitExceededHandler??((i,r,a,e)=>{switch(a.kind){case 1:{r.status(422).json({errors:{others:[`Body field name that starts with '${a.name}' exceeded the length limit of ${e.limits.fieldNameSize}.`]},data:{}});break}case 2:{r.status(422).json({errors:{others:[`Body field "${a.name}" value exceeded the length limit of ${e.limits.fieldSize}.`]},data:{}});break}case 5:{r.status(422).json({errors:{others:[`Body fields amount exceeded the limit of ${e.limits.fields}.`]},data:{}});break}case 3:{r.status(422).json({errors:{others:[`Body parts amount exceeded the limit of ${e.limits.parts}.`]},data:{}});break}case 4:{r.status(422).json({errors:{others:[`Body files amount exceeded the limit of ${e.limits.files}.`]},data:{}});break}case 0:{r.status(422).json({errors:{others:[`Body file '${a.name}' exceeded the file size limit of ${e.limits.fileSize} bytes.`]},data:{}});break}default:{this.logger.warn("Invalid ExceededLimitKind passed to default limitExceededHandler.",{requestId:i.id});break}}}),errorHandler:t.errorHandler??((i,r,a,e)=>{this.logger.error("FileUpload error",{kind:a.kind,kindName:u[a.kind],requestId:i.id},a.error),r.sendInternalServerError()}),parser:{duplicates:"combine",comma:!1,...t.parser??{}}}}async index(t,i,r,a){if(!i.header("content-type")?.startsWith("multipart/form-data"))return a();let e=k({headers:i.headers,highWaterMark:this.options.highWaterMark,fileHwm:this.options.fileHighWaterMark,defCharset:this.options.defaultCharset,defParamCharset:this.options.defaultParameterCharset,preservePath:this.options.preservePath,limits:{fieldNameSize:this.options.limits.fieldNameSize,fields:this.options.limits.fields,fieldSize:this.options.limits.fieldSize,files:this.options.limits.files,fileSize:this.options.limits.fileSize,headerPairs:this.options.limits.headerPairs,parts:this.options.limits.parts}}),s={},o=!1;e.on("file",(l,d,f)=>{let{filename:y,encoding:g,mimeType:x}=f,c=[];d.on("data",p=>{c.push(p)}),d.on("error",p=>{o=!0,i.expressRequest.unpipe(e),e.end(),this.options.errorHandler(i,r,{kind:0,error:p},this.options)}),d.on("close",()=>{if(!this.options.ignoreLimits&&d.truncated){o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:0,info:f,name:l},this.options);return}let p=Buffer.concat(c);b(s,l,{encoding:g,fileName:y,mimeType:x,buffer:p})})}),e.on("field",(l,d,f)=>{if(b(s,l,d),!this.options.ignoreLimits){if(f.nameTruncated){o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:1,info:f,name:l,value:d},this.options);return}if(f.valueTruncated){o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:2,info:f,name:l,value:d},this.options);return}}}),e.on("close",()=>{o||(i.body=s,a())}),e.on("error",l=>{o=!0,i.expressRequest.unpipe(e),e.end(),this.options.errorHandler(i,r,{kind:1,error:l},this.options)}),e.on("partsLimit",()=>{this.options.ignoreLimits||(o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:3},this.options))}),e.on("filesLimit",()=>{this.options.ignoreLimits||(o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:4},this.options))}),e.on("fieldsLimit",()=>{this.options.ignoreLimits||(o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:5},this.options))}),i.expressRequest.pipe(e)}},S=h;import{z as n}from"zod";var I=n.object({fileName:n.string(),encoding:n.string(),mimeType:n.string(),buffer:n.instanceof(Buffer)}),H=n.any().superRefine(async(m,t)=>{if(m===void 0)return t.addIssue({code:n.ZodIssueCode.custom,message:"Required"});(await I.safeParseAsync(m)).success||t.addIssue({code:n.ZodIssueCode.custom,message:"Invalid file"})}),P=H;export{F as ExceededLimitKind,S as FileUpload,u as FileUploadErrorKind,P as ZodUploadedFileType};
//# sourceMappingURL=index.js.map