1import{fw as e}from"./BqsN58w6.js";const t={SUCCESS:"SUCCESS",ERR_NO_FILE:"ERR_NO_FILE",ERR_ABORTED:"ERR_ABORTED",ERR_SIZE_LIMIT:"ERR_SIZE_LIMIT",ERR_TYPE_INVALID:"ERR_TYPE_INVALID",ERR_SIGNATURE_MISMATCH:"ERR_SIGNATURE_MISMATCH",ERR_RESOLUTION_LIMIT:"ERR_RESOLUTION_LIMIT",ERR_RESOLUTION_RATIO:"ERR_RESOLUTION_RATIO",ERR_PIXELS_LIMIT:"ERR_PIXELS_LIMIT",ERR_DURATION_LIMIT:"ERR_DURATION_LIMIT",ERR_PARSE_FAILED:"ERR_PARSE_FAILED",ERR_SYSTEM:"ERR_SYSTEM",ERR_RATIO_LIMIT:"ERR_RATIO_LIMIT"},i={ffd8ff:"image/jpeg","89504e47":"image/png",47494638:"image/gif",52494646:"image/webp","00000018":"video/mp4","00000020":"video/mp4",66747970:"video/mp4","1a45dfa3":"video/webm"},a={checkTypes:e=>async i=>e.includes(i.file.type)?i.pass():i.fail("Unsupported file type",t.ERR_TYPE_INVALID),checkSuffixes:i=>async a=>{const s=i.split(",").map((e=>e.trim().replace(/^\./,"").toLowerCase())).filter(Boolean),r=a.file?.name||"",n=r.includes(".")?r.split(".").pop().toLowerCase():"";if(n&&s.includes(n))return a.pass();const o=Object.entries(e).filter((([,e])=>s.includes(e))).map((([e])=>e));return a.file.type&&o.includes(a.file.type)?a.pass():a.fail("Unsupported file type",t.ERR_TYPE_INVALID)},checkMagicNumber:()=>async e=>{const a=await e.getHeaderBuffer(12),s=new Uint8Array(a),r=Array.from(s).map((e=>e.toString(16).padStart(2,"0"))).join("");if(!e.options.checkTypes)return e.fail("Magic number check requires checkTypes to be defined in options.",t.ERR_SIGNATURE_MISMATCH);const n=[];Object.entries(i).forEach((([t,i])=>{e.options.checkTypes.includes(i)&&n.push(t)}));return n.some((e=>r.startsWith(e)||r.includes(e)))?e.pass():e.fail("File signature mismatch, possibly a forged file",t.ERR_SIGNATURE_MISMATCH)},checkSize:e=>async i=>i.file.size>e?i.fail("File size exceeds limit",t.ERR_SIZE_LIMIT):i.pass(),checkImageSize:e=>async i=>i.file.type.startsWith("image/")&&i.file.size>e?i.fail("File size exceeds limit",t.ERR_SIZE_LIMIT):i.pass(),checkImageResolution:e=>async i=>{let a,s;try{if(!i.file.type.startsWith("image/"))return i.pass();{const e=await i.getImage();a=e.width,s=e.height}}catch(l){return i.fail("Unable to parse media file dimensions",t.ERR_PARSE_FAILED)}const{maxWidth:r,maxHeight:n,minWidth:o,minHeight:R,ratio:c}=e;return r&&a>r?i.fail(`Width exceeds ${r}px`,t.ERR_RESOLUTION_LIMIT):n&&s>n?i.fail(`Height exceeds ${n}px`,t.ERR_RESOLUTION_LIMIT):o&&a<o?i.fail(`Width is less than ${o}px`,t.ERR_RESOLUTION_LIMIT):R&&s<R?i.fail(`Height is less than ${R}px`,t.ERR_RESOLUTION_LIMIT):c&&Math.abs(a/s-c)>.02?i.fail("Aspect ratio does not meet requirements",t.ERR_RESOLUTION_RATIO):i.pass()},checkImageRatio:e=>async i=>{if(i.isImage()){const a=await i.getImage(),s=a.width/a.height,{max:r,min:n}=e;if(r&&s>r)return i.fail(`Aspect ratio exceeds ${r}`,t.ERR_RATIO_LIMIT);if(n&&s<n)return i.fail(`Aspect ratio is less than ${n}`,t.ERR_RATIO_LIMIT)}return i.pass()},checkImagePixels:e=>async i=>{if(i.isImage()){const a=await i.getImage(),s=a.width*a.height,{max:r,min:n}=e;return r&&s>r?i.fail(`Pixels exceeds ${r}`,t.ERR_PIXELS_LIMIT):n&&s<n?i.fail(`Pixels is less than ${n}`,t.ERR_PIXELS_LIMIT):i.pass()}return i.pass()},checkVideoSize:e=>async i=>i.file.type.startsWith("video/")&&i.file.size>e?i.fail("File size exceeds limit",t.ERR_SIZE_LIMIT):i.pass(),checkVideoResolution:e=>async i=>{let a,s;try{if(!i.file.type.startsWith("video/"))return i.pass();{const e=await i.getVideo();a=e.videoWidth,s=e.videoHeight}}catch(l){return i.fail("Unable to parse media file dimensions",t.ERR_PARSE_FAILED)}const{maxWidth:r,maxHeight:n,minWidth:o,minHeight:R,ratio:c}=e;return r&&a>r?i.fail(`Width exceeds ${r}px`,t.ERR_RESOLUTION_LIMIT):n&&s>n?i.fail(`Height exceeds ${n}px`,t.ERR_RESOLUTION_LIMIT):o&&a<o?i.fail(`Width is less than ${o}px`,t.ERR_RESOLUTION_LIMIT):R&&s<R?i.fail(`Height is less than ${R}px`,t.ERR_RESOLUTION_LIMIT):c&&Math.abs(a/s-c)>.02?i.fail("Aspect ratio does not meet requirements",t.ERR_RESOLUTION_RATIO):i.pass()},checkVideoDuration:({max:e,min:i})=>async a=>{if(!a.file.type.startsWith("video/"))return a.pass();try{const s=(await a.getVideo()).duration;return e&&s>e?a.fail(`Duration exceeds ${e}s`,t.ERR_DURATION_LIMIT):i&&s<i?a.fail(`Duration is less than ${i}s`,t.ERR_DURATION_LIMIT):a.pass()}catch(s){return a.fail("Unable to get video duration",t.ERR_PARSE_FAILED)}},checkVideoRatio:e=>async i=>{if(!i.isVideo())return i.pass();try{const a=await i.getVideo(),s=a.videoWidth,r=s/a.videoHeight,{max:n,min:o}=e;return n&&r>n?i.fail(`Aspect ratio exceeds ${n}`,t.ERR_RATIO_LIMIT):o&&r<o?i.fail(`Aspect ratio is less than ${o}`,t.ERR_RATIO_LIMIT):i.pass()}catch(a){return i.fail("Unable to get video ratio",t.ERR_PARSE_FAILED)}},checkVideoPixels:e=>async i=>{if(!i.isVideo())return i.pass();try{const a=await i.getVideo(),s=a.videoWidth*a.videoHeight,{max:r,min:n}=e;return r&&s>r?i.fail(`Pixels exceeds ${r}`,t.ERR_PIXELS_LIMIT):n&&s<n?i.fail(`Pixels is less than ${n}`,t.ERR_PIXELS_LIMIT):i.pass()}catch(a){return i.fail("Unable to get video pixels",t.ERR_PARSE_FAILED)}},checkAudioSize:e=>async i=>i.isAudio()&&i.file.size>e?i.fail("File size exceeds limit",t.ERR_SIZE_LIMIT):i.pass(),checkAudioDuration:({max:e,min:i})=>async a=>{if(!a.isAudio())return a.pass();try{const s=(await a.getAudio()).duration;return e&&s>e?a.fail(`Duration exceeds ${e}s`,t.ERR_DURATION_LIMIT):i&&s<i?a.fail(`Duration is less than ${i}s`,t.ERR_DURATION_LIMIT):a.pass()}catch(s){return a.fail("Unable to get audio duration",t.ERR_PARSE_FAILED)}}};async function s(e,i={}
1,s){if(!e)return{valid:!1,msg:"No file selected",code:t.ERR_NO_FILE};const r={file:e,signal:s,options:i,_headerBuffer:null,_image:null,_video:null,_audio:null,fail:(e,i=t.ERR_SYSTEM)=>({valid:!1,msg:e,code:i}),pass:(e="OK")=>({valid:!0,msg:e,code:t.SUCCESS}),checkAborted(){if(this.signal?.aborted)throw new DOMException("Aborted","AbortError")},isImage(){return this.file.type.startsWith("image/")},isVideo(){return this.file.type.startsWith("video/")},isAudio(){return this.file.type.startsWith("audio/")},async getHeaderBuffer(e=12){return this.checkAborted(),this._headerBuffer?this._headerBuffer:new Promise(((t,i)=>{const a=new FileReader;this.signal&&this.signal.addEventListener("abort",(()=>{a.abort(),i(new DOMException("Aborted","AbortError"))}),{once:!0}),a.onload=e=>{this._headerBuffer=e.target.result,t(this._headerBuffer)},a.onerror=()=>i(new Error("Read Error")),a.readAsArrayBuffer(this.file.slice(0,e))}))},async getImage(){if(this.checkAborted(),this._image)return this._image;let e;try{return e=URL.createObjectURL(this.file),await new Promise(((t,i)=>{const a=new Image,s=()=>{a.onload=a.onerror=null,i(new DOMException("Aborted","AbortError"))};this.signal?.addEventListener("abort",s,{once:!0}),a.onload=()=>{this.signal?.removeEventListener("abort",s),this._image=a,t(a)},a.onerror=()=>{this.signal?.removeEventListener("abort",s),i(new Error("Image Load Error"))},a.src=e}))}finally{e&&URL.revokeObjectURL(e)}},async getVideo(){if(this.checkAborted(),this._video)return this._video;let e;try{return e=URL.createObjectURL(this.file),await new Promise(((t,i)=>{const a=document.createElement("video");a.preload="metadata";const s=()=>{a.onloadedmetadata=a.onerror=null,i(new DOMException("Aborted","AbortError"))};this.signal?.addEventListener("abort",s,{once:!0}),a.onloadedmetadata=()=>{this.signal?.removeEventListener("abort",s),a.duration===1/0?(a.currentTime=1e101,a.ontimeupdate=function(){this.ontimeupdate=null,t(a)}):t(a)},a.onerror=()=>{this.signal?.removeEventListener("abort",s),i(new Error("Video Load Error"))},a.src=e}))}finally{e&&URL.revokeObjectURL(e)}},async getAudio(){if(this.checkAborted(),this._audio)return this._audio;let e;try{return e=URL.createObjectURL(this.file),await new Promise(((t,i)=>{const a=new Audio;a.preload="metadata";const s=()=>{a.onloadedmetadata=a.onerror=null,i(new DOMException("Aborted","AbortError"))};this.signal?.addEventListener("abort",s,{once:!0}),a.onloadedmetadata=()=>{this.signal?.removeEventListener("abort",s),a.duration===1/0?(a.currentTime=1e101,a.ontimeupdate=function(){this.ontimeupdate=null,t(a)}):t(a)},a.onerror=()=>{this.signal?.removeEventListener("abort",s),i(new Error("Audio Load Error"))},a.src=e}))}finally{e&&URL.revokeObjectURL(e)}}};try{const e=Object.keys(a);for(const s of Object.keys(i))if(e.includes(s)){r.checkAborted();const e=a[s](i[s]),t=await e(r);if(!t.valid)return t}else{if("function"!=typeof i[s])return r.fail(`Unsupported strategy: ${s}`,t.ERR_INVALID_STRATEGY);{r.checkAborted();const e=await i[s](r);if(e&&!e.valid)return e}}return r.pass()}catch(n){return"AbortError"===n.name?r.fail("Validation cancelled",t.ERR_ABORTED):r.fail(n.message||"System error",t.ERR_SYSTEM)}}export{t as V,s as v};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.