UNPKG

@celosiajs/file-upload

Version:

CelosiaJS File Upload. A framework for REST API based on Express.js

3 lines (2 loc) 4.91 kB
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||{}),m=(i=>(i[i.FileStream=0]="FileStream",i[i.Busboy=1]="Busboy",i))(m||{});import x from"busboy";import{Readable as R,Writable as S}from"stream";import{Middleware as z}from"@celosiajs/core";import y from"append-field";var h=class extends z{options;constructor(t={}){super("FileUpload"),this.options={defaultCharset:t.defaultCharset??"utf8",defaultParameterCharset:t.defaultParameterCharset??"latin1",preservePath:t.preservePath??!1,highWaterMark:t.highWaterMark??S.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:m[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=x({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,p)=>{let{filename:b,encoding:g,mimeType:k}=p,c=[];d.on("data",u=>{c.push(u)}),d.on("error",u=>{o=!0,i.expressRequest.unpipe(e),e.end(),this.options.errorHandler(i,r,{kind:0,error:u},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:p,name:l},this.options);return}let u=Buffer.concat(c);y(s,l,{encoding:g,fileName:b,mimeType:k,buffer:u})})}),e.on("field",(l,d,p)=>{if(y(s,l,d),!this.options.ignoreLimits){if(p.nameTruncated){o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:1,info:p,name:l,value:d},this.options);return}if(p.valueTruncated){o=!0,i.expressRequest.unpipe(e),e.end(),this.options.limitExceededHandler(i,r,{kind:2,info:p,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)}},C=h;import f from"zod/v4";var H=f.object({fileName:f.string(),encoding:f.string(),mimeType:f.string(),buffer:f.instanceof(Buffer)}),I=f.any().check(async n=>{if(n.value===void 0){n.issues.push({code:"custom",message:"Required",input:n.value});return}(await H.safeParseAsync(n.value)).success||n.issues.push({code:"custom",message:"Invalid file",input:n.value})}),P=I;export{F as ExceededLimitKind,C as FileUpload,m as FileUploadErrorKind,P as ZodUploadedFileType}; //# sourceMappingURL=index.js.map