UNPKG

@tinyuploader/sdk

Version:

大文件分片上传解决方案sdk, 可用于各种UI框架

5 lines (4 loc) 21 kB
"use strict";var W=Object.defineProperty;var N=(a,e,s)=>e in a?W(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s;var n=(a,e,s)=>N(a,typeof e!="symbol"?e+"":e,s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("spark-md5"),C=(a,e)=>toString.call(a).slice(8,-1).toLowerCase()===e,G=function(a){return typeof a<"u"},m=function(a){return typeof a=="function"},M=a=>C(a,"object"),U=a=>M(a)&&a!==null,K=a=>C(a,"blob"),E=a=>C(a,"array"),q=a=>a&&m(a.then),B=function(a){return C(a,"string")},I=function(a){return C(a,"boolean")};let Q=0;const z=(a="id")=>`${a}-${+new Date}-${Q++}`;function R(a,e,s){if(E(a)){const r=a;for(var t=0,i=r.length;t<i&&e.call(s,r[t],t,r)!==!1;t++);}else{const r=a;for(const l in r)if(Object.prototype.hasOwnProperty.call(r,l)&&e.call(s,r[l],l,r)===!1)break}}function y(){var a,e,s,t,i,r,l=arguments[0]||{},o=1,c=arguments.length,p=!1;for(typeof l=="boolean"&&(p=l,l=arguments[1]||{},o++),typeof l!="object"&&!m(l)&&(l={}),o===c&&(l=this,o--);o<c;o++)if((a=arguments[o])!=null)for(e in a)s=l[e],t=a[e],l!==t&&(p&&t&&(U(t)||(i=E(t)))?(i?(i=!1,r=s&&E(s)?s:[]):r=s&&U(s)?s:{},l[e]=y(p,r,t)):t!==void 0&&(l[e]=t));return l}const F=a=>typeof a=="function"?a()||{}:U(a)?a:{},V=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice,T=a=>{if(!a||isNaN(Number(a))||Number(a)<=0||a==="")return"0 B";const e=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],s=1024,t=Number(a),i=Math.floor(Math.log(t)/Math.log(s));return`${(t/Math.pow(s,i)).toFixed(2)} ${e[Math.min(i,e.length-1)]}`},X=(a=600,e=!1)=>new Promise((s,t)=>{const i=setTimeout(()=>{clearTimeout(i),e?t(!1):s(!0)},a)}),O=(a,e=300)=>{let s=0;return function(...t){let i=+new Date;i-s>e&&(s=i,a.apply(this,t))}},Y=Object.freeze(Object.defineProperty({__proto__:null,each:R,extend:y,generateUid:z,isArray:E,isBlob:K,isBoolean:I,isDefined:G,isFunction:m,isObject:M,isPlainObject:U,isPromise:q,isString:B,parseData:F,renderSize:T,sleep:X,slice:V,throttle:O},Symbol.toStringTag,{value:"Module"}));class Z{constructor(e){n(this,"uploader");n(this,"listeners");n(this,"inputs");this.uploader=e,this.listeners=[],this.inputs=[]}assignBrowse(e,s={}){if(!e){console.warn("DOM 节点不存在");return}const t=this.createOrGetInput(e);this.setInputAttributes(t,s),this.attachBrowseEvents(e,t)}assignDrop(e){if(!e){console.warn("DOM 节点不存在");return}const s=i=>i.preventDefault(),t={dragover:s,dragenter:s,dragleave:s,drop:this.handleDrop.bind(this)};R(t,(i,r)=>{e.addEventListener(r,i,{passive:!1}),this.listeners.push({node:e,event:r,handler:i})})}createOrGetInput(e){if(e instanceof HTMLInputElement&&e.tagName==="INPUT"&&e.type==="file")return e;const s=document.createElement("input");return s.type="file",y(s.style,{visibility:"hidden",position:"absolute",width:"1px",height:"1px"}),e.appendChild(s),this.inputs.push(s),s}setInputAttributes(e,s){R(s,(t,i)=>e.setAttribute(i,t)),e.toggleAttribute("multiple",!!s.multiple)}attachBrowseEvents(e,s){const t=()=>s.click(),i=r=>{const l=r.target;this.uploader.addFiles(l.files),l.value=""};e.addEventListener("click",t,{passive:!0}),s.addEventListener("change",i,{passive:!0}),this.listeners.push({node:e,event:"click",handler:t},{node:s,event:"change",handler:i})}handleDrop(e){var s;e.preventDefault(),e.stopPropagation(),e instanceof DragEvent&&this.uploader.addFiles((s=e.dataTransfer)==null?void 0:s.files)}destroy(){return this.listeners.forEach(({node:e,event:s,handler:t})=>{e.removeEventListener(s,t)}),this.listeners=[],this.inputs.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),this.inputs=[],this}}class J{constructor(){n(this,"events");this.events=new Map}on(e,s){if(!m(s))return;const t=this.events.get(e)||[];t.includes(s)||(t.push(s),this.events.set(e,t))}off(e,s){var i;if(!this.events.has(e))return;if(!s){this.events.set(e,[]);return}const t=(i=this.events.get(e))==null?void 0:i.filter(r=>r!==s);this.events.set(e,t)}emit(e,...s){const t=this.events.get(e);t&&t.length&&t.forEach(i=>i(...s))}once(e,s){if(!m(s))return;const t=(...i)=>{s(...i),this.off(e,t)};this.on(e,t)}clear(e){if(!e){this.events.clear();return}this.events.has(e)&&this.events.set(e,[])}}const h={Init:"init",AddFail:"addFail",Reading:"reading",Ready:"ready",CheckFail:"checkFail",Uploading:"uploading",UploadSuccess:"uploadSuccess",UploadFail:"uploadFail",Success:"success",Fail:"fail",Pause:"pause",Resume:"resume",Removed:"removed"},f={Ready:"ready",Pending:"pending",Uploading:"uploading",Success:"success",Fail:"fail"},d={Exceed:"exceed",FileAdded:"fileAdded",FileAddFail:"fileAddFail",FilesAdded:"filesAdded",FileChange:"fileChange",FileRemove:"fileRemove",FileReadStart:"fileReadStart",FileReadProgress:"fileReadProgress",FileReadEnd:"fileReadEnd",FileReadFail:"fileReadFail",FilePause:"filePause",FileResume:"fileResume",FileProgress:"fileProgress",FileUploadSuccess:"fileUploadSuccess",FileUploadFail:"fileUploadFail",FileSuccess:"fileSuccess",FileFail:"fileFail",AllFileSuccess:"allFileSuccess"},v={None:"none",Part:"part",WaitMerge:"waitMerge",Success:"success"},L={Check:"check",Upload:"upload",Merge:"merge"};function ee(a){const{method:e="POST",withCredentials:s=!0,responseType:t="json",action:i,data:r,headers:l,onSuccess:o,onFail:c,onProgress:p}=a;let u=new XMLHttpRequest;u.responseType=t,u.withCredentials=s,u.open(e,i,!0);const b=new FormData;return Object.entries(r).forEach(([g,S])=>b.append(g,S)),"setRequestHeader"in u&&Object.entries(l).forEach(([g,S])=>u.setRequestHeader(g,S)),u.addEventListener("timeout",()=>{c&&c(new Error("Request timed out"),u)}),u.upload.addEventListener("progress",g=>{p&&p(g)}),u.addEventListener("error",g=>{c&&c(g,u)},!1),u.addEventListener("readystatechange",g=>{if(u.readyState===4){if(u.status<200||u.status>=300){c&&c(new Error(`xhr: status === ${u.status}`),u);return}o&&o(g,u)}}),u.send(b),{abort(){u.abort(),u=null}}}class _{constructor(e,s){n(this,"uploader");n(this,"options");n(this,"file");n(this,"fileId");n(this,"rawFile");n(this,"fileHash");n(this,"filename");n(this,"totalSize");n(this,"chunkSize");n(this,"totalChunks");n(this,"uid");n(this,"chunkIndex");n(this,"status");n(this,"startByte");n(this,"endByte");n(this,"size");n(this,"maxRetries");n(this,"progress");n(this,"fakeProgress");n(this,"timer");n(this,"request");n(this,"customRequest");this.uploader=e.uploader,this.options=e.uploader.options,this.file=e,this.rawFile=e.rawFile,this.fileId=e.uid,this.fileHash=e.hash,this.filename=e.name,this.totalSize=e.size,this.chunkSize=this.options.chunkSize,this.totalChunks=e.totalChunks,this.uid=z(),this.chunkIndex=s,this.status=f.Ready,this.startByte=this.chunkSize*s,this.endByte=Math.min(this.startByte+this.chunkSize,this.totalSize),this.size=this.endByte-this.startByte,this.maxRetries=this.options.maxRetries,this.progress=0,this.fakeProgress=0,this.timer=null,this.request=null,this.customRequest=this.options.customRequest||ee}onSuccess(e,s,t,i){this.options.requestSucceed(s)?(this.status=f.Success,this.file.removeUploadingChunk(this),this.file.isUploading()&&this.file.upload(),t(this)):this.onFail(e,i)}onFail(e,s){var t;this.progress=0,this.file.setProgress(),!((t=this.request)!=null&&t.canceled)&&(this.maxRetries<=0?(this.file.removeUploadingChunk(this),this.status=f.Fail,this.file.isUploading()&&this.file.upload(),s(e,this)):this.timer=setTimeout(()=>{this.send(),this.maxRetries--,clearTimeout(this.timer)},this.options.retryInterval))}onProgress(e){this.progress=Math.min(1,e.loaded/e.total),this.fakeProgress=Math.max(this.progress,this.fakeProgress),this.status=f.Uploading,this.file.changeStatus(h.Uploading),this.file.setProgress()}prepare(){const{name:e,data:s,processData:t}=this.options,{data:i}=this.file,r={[e]:this.file.rawFile.slice(this.startByte,this.endByte),hash:this.fileHash,id:this.uid,fileId:this.fileId,index:this.chunkIndex,filename:this.filename,size:this.size,totalSize:this.totalSize,totalChunks:this.totalChunks,...F(s),...i};return m(t)&&t(r,L.Upload)||r}send(){this.status=f.Pending;const{action:e,headers:s,withCredentials:t,name:i}=this.options;return new Promise((r,l)=>{this.request=this.customRequest({action:e,name:i,withCredentials:t,headers:F(s),data:this.prepare(),query:{...F(this.options.data),...this.file.data},onSuccess:(o,c)=>this.onSuccess(o,c,r,l),onFail:o=>this.onFail(o,l),onProgress:o=>this.onProgress(o)}),this.request.canceled=!1})}abort(){this.status=f.Ready,this.request&&(this.request.canceled=!0,this.request.abort()),this.timer&&clearTimeout(this.timer)}}class P{constructor(e,s,t){n(this,"uploader");n(this,"options");n(this,"hasher");n(this,"id");n(this,"uid");n(this,"status");n(this,"prevStatusLastRecord");n(this,"rawFile");n(this,"name");n(this,"size");n(this,"type");n(this,"hash");n(this,"url");n(this,"progress");n(this,"chunkSize");n(this,"chunks");n(this,"totalChunks");n(this,"uploadingChunks");n(this,"readProgress");n(this,"errorMessage");n(this,"data");n(this,"abortRead");this.uploader=s,this.options=this.uploader.options,this.hasher=this.uploader.hasher,this.uid=this.generateId(),this.prevStatusLastRecord=[],this.rawFile=e,this.name=e.name,this.size=e.size,this.type=e.type,this.hash="",this.url="",this.status="",this.progress=0,this.chunkSize=this.options.chunkSize,this.chunks=[],this.totalChunks=0,this.uploadingChunks=new Set,this.readProgress=0,this.errorMessage="",this.data={},t?(Object.keys(t).forEach(i=>{this[i]=t[i]}),this.name=t.name,this.url=t.url,this.readProgress=1,this.progress=1,this.changeStatus(h.Success)):this.changeStatus(h.Init)}generateId(){const{customGenerateUid:e}=this.options;return!e||!m(e)?z():e(this)||z()}setErrorMessage(e){return this.errorMessage=String(e),this}setData(e){return this.data={...this.data,...e},this}get renderSize(){return T(this.size)}changeStatus(e){(e!==this.status||e===h.Reading)&&(this.prevStatusLastRecord.push(this.status),this.status=e,this.uploader&&this.uploader.emitCallback&&this.uploader.emitCallback(d.FileChange,this))}isInit(){return this.status===h.Init}isAddFail(){return this.status===h.AddFail}isReading(){return this.status===h.Reading}isReady(){return this.status===h.Ready}isCheckFail(){return this.status===h.CheckFail}isUploading(){return this.status===h.Uploading}isUploadSuccess(){return this.status===h.UploadSuccess}isUploadFail(){return this.status===h.UploadFail}isSuccess(){return this.status===h.Success}isFail(){return this.status===h.Fail}isPause(){return this.status===h.Pause}isResume(){return this.status===h.Resume}createChunks(){this.totalChunks=Math.ceil(this.size/this.chunkSize)||1,this.chunks=Array.from({length:this.totalChunks},(e,s)=>new _(this,s))}async read(){if(!this.options.withHash){this.createChunks(),this.changeStatus(h.Ready);return}this.uploader.emitCallback(d.FileReadStart,this),this.changeStatus(h.Reading);try{const e=Date.now(),{hash:s,progress:t}=await this._computeHash();this.hash=s,this.readProgress=t,this.uploader.emitCallback(d.FileReadEnd,this),console.log(`${this.options.useWebWoker?"Web Worker":"Main Thread"} read file took`,(Date.now()-e)/1e3,"s"),this.abortRead=null}catch{throw this.setErrorMessage("File read failed"),this.changeStatus(h.Init),this.uploader.emitCallback(d.FileReadFail,this),new Error("File read failed")}finally{}this.createChunks(),this.changeStatus(h.Ready)}async _computeHash(){try{const e=O(r=>{this.readProgress=r,this.uploader.emitCallback(d.FileReadProgress,this)},200);if(this.options.useWebWoker&&this.hasher.hashionName!=="sparkMd5Webworker")throw new Error(` Please install "SparkWorker" plugin -> npm i hashion; https://www.npmjs.com/package/hashion `);const{promise:s,abort:t}=this.hasher.computedHash({file:this.rawFile,chunkSize:this.chunkSize},({progress:r})=>e(r));this.abortRead=t;const i=await s;return e(i.progress),i}catch(e){throw e}}_processData(e){const{data:s,processData:t}=this.options,i={...F(s),...this.data};return m(t)&&t(i,e)||i}async checkRequest(){const{checkRequest:e}=this.options;if(!m(e))return Promise.resolve();const s=i=>{this.chunks.forEach(r=>{r.status=i,i===f.Success&&(r.progress=1,r.fakeProgress=1)})},t={[v.Part]:i=>{this.chunks.forEach(r=>{i.includes(r.chunkIndex)&&(r.status=f.Success,r.progress=1,r.fakeProgress=1)})},[v.WaitMerge]:()=>{this.changeStatus(h.UploadSuccess),s(f.Success)},[v.Success]:i=>{this.changeStatus(h.Success),s(f.Success),this.url=i},[v.None]:()=>{}};try{const i=await Promise.resolve(e(this,this._processData(L.Check),F(this.options.headers)));if(!i||!i.status)throw new Error("Invalid check response format");const r=t[i.status];if(!r)throw new Error(`Unknown check status: ${i.status}`);return r(i.data),Promise.resolve()}catch(i){this.changeStatus(h.CheckFail),this.uploader.upload();const r=new Error(`Check request failed: ${i.message}`);throw r.originalError=i,r}}addUploadingChunk(e){this.uploadingChunks.add(e)}removeUploadingChunk(e){this.uploadingChunks.delete(e)}async upload(){if(this.isInit()&&await this.read(),this.isReady()&&this.options.checkRequest&&(await this.checkRequest(),this.status===h.Pause))return;if(this.isUploadSuccess())return this.merge();if(this.isSuccess())return this.success();const e=this.chunks.filter(t=>t.status===f.Ready);if(R(e,()=>{if(this.uploadingChunks.size>=this.options.maxConcurrency)return!1;const t=e.shift();if(t)this.addUploadingChunk(t);else return!1}),this.uploadingChunks.size>0){const t=[...this.uploadingChunks].filter(i=>i.status===f.Ready);Promise.race(t.map(i=>i.send()));return}this.chunks.some(t=>t.status===f.Fail)?this.uploadFail():(this.uploadSuccess(),this.setProgress(),this.merge())}setProgress(){const e=this.chunks.reduce((s,t)=>{const i=this.options.fakeProgress?t.fakeProgress:t.progress;return s+=i*(t.size/this.size)},0);this.progress=Math.min(1,e),(this.isUploadSuccess()||this.isSuccess())&&(this.progress=1),this.uploader.emitCallback(d.FileProgress,this)}uploadFail(){this.changeStatus(h.UploadFail),this.uploader.emitCallback(d.FileUploadFail,this),this._continueUpload()}uploadSuccess(){this.changeStatus(h.UploadSuccess),this.uploader.emitCallback(d.FileUploadSuccess,this)}async merge(){const{mergeRequest:e}=this.options;if(!m(e))return this.success();try{const s=e(this,this._processData(L.Merge),F(this.options.headers)),t=await Promise.resolve(s);I(t)?t?this.success():this.mergeFail():(this.url=t,this.success())}catch(s){console.log(s),this.mergeFail()}}mergeFail(){this.changeStatus(h.Fail),this.uploader.emitCallback(d.FileFail,this),this._continueUpload()}success(){this.changeStatus(h.Success),this.progress=1,this.uploader.emitCallback(d.FileSuccess,this),this._continueUpload()}_continueUpload(){const e=this.uploader.fileList.find(s=>s.isPause());e&&e.resume(),this.uploader.upload()}cancel(){this.uploadingChunks.forEach(e=>e.abort()),this.uploadingChunks.clear()}async remove(){this.abortRead&&this.abortRead(),setTimeout(()=>{this.cancel(),this.chunks=[],this.changeStatus("removed");const e=this.uploader.fileList.indexOf(this);e>-1&&this.uploader.fileList.splice(e,1),this.uploader.emitCallback(d.FileRemove,this),this.uploader.upload()},0)}pause(){this.abortRead&&this.abortRead(),setTimeout(()=>{this.cancel(),this.changeStatus(h.Pause),this.uploader.emitCallback(d.FilePause,this),this.uploader.upload()},0)}resume(){this.isPause()&&(this.changeStatus(h.Resume),this.uploader.emitCallback(d.FileResume,this),this.uploader.upload())}retry(){if(!this.isAddFail()){if(this.isCheckFail()){this.changeStatus(h.Ready),this.upload();return}if(this.isUploadSuccess()||this.isFail()){this.merge();return}this.isUploadFail()&&(R(this.chunks,e=>{e.status===f.Fail&&(e.status=f.Ready,e.maxRetries=e.options.maxRetries)}),this.upload())}}}const H={accept:"*",multiple:!0,fileList:[],limit:10,autoUpload:!0,customGenerateUid:void 0,beforeAdd:a=>!0,beforeRemove:a=>!0,addFailToRemove:!0,chunkSize:2*1024*1024,fakeProgress:!0,withHash:!0,useWebWoker:!1,name:"file",action:"",customRequest:null,withCredentials:!0,headers:{},data:{},requestSucceed:a=>[200,201,202,206].includes(a.status),maxConcurrency:6,maxRetries:3,retryInterval:1e3,checkRequest:a=>({status:v.None}),mergeRequest:a=>!0,processData:(a,e)=>a};var se=Object.defineProperty,te=(a,e,s)=>e in a?se(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s,D=(a,e,s)=>te(a,typeof e!="symbol"?e+"":e,s);class ie{constructor(e,s){D(this,"hashCarrier"),D(this,"hashionName"),this.hashionName=e.name,this.hashCarrier=new e(s)}computedHash({file:e,chunkSize:s},t){let i;return{promise:new Promise((r,l)=>{Promise.resolve(this.hashCarrier.computeHash({file:e,chunkSize:s},(o,{progress:c,hash:p,time:u})=>{o&&l(o),c===100&&r({progress:c,hash:p,time:u}),t&&t({progress:c})})).then(o=>{i={abort:o==null?void 0:o.abort,reject:l}})}),abort:()=>{i&&(i.abort&&i.abort(),i.reject(new Error("Canceled promise to rejected")))}}}}var ae=Object.defineProperty,re=(a,e,s)=>e in a?ae(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s,A=(a,e,s)=>re(a,typeof e!="symbol"?e+"":e,s);const ne=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice;class x{constructor(){A(this,"name"),this.name="spark-md5"}async computeHash(e,s){const{file:t,chunkSize:i}=e;let r=!1;const l=new $.ArrayBuffer,o=new FileReader,c=Math.ceil(t.size/i),p=Date.now();let u=0;const b=new AbortController,g=b.signal;g.addEventListener("abort",()=>{r||(o.abort(),s(new Error("Hash calculation cancelled"),{progress:0}))}),o.onload=function(k){var w;if(!g.aborted)if(l.append((w=k.target)==null?void 0:w.result),u++,u<c)S(),s(null,{progress:u/c*100});else{r=!0,s(null,{hash:l.end(),time:Date.now()-p,progress:100});return}},o.onerror=function(k){g.aborted||(console.warn("spark-md5: Hash calculation error"),s(k,{progress:0}))};function S(){if(g.aborted)return;const k=u*i,w=k+i>=t.size?t.size:k+i;o.readAsArrayBuffer(ne.call(t,k,w))}return S(),{abort:()=>b.abort()}}}A(x,"pluginName","hash-plugin"),A(x,"name","spark-md5");class j{constructor(e){n(this,"container");n(this,"event");n(this,"options");n(this,"hasher");n(this,"fileList");this.container=new Z(this),this.event=new J,this.options=y(H,e),this.hasher=null,this.fileList=(this.options.fileList||[]).map(s=>new P(s,this,s)),this._setupFileListeners(),this.use(x)}on(e,s){this.event.on(e,s)}emit(e,...s){this.event.emit(e,...s)}emitCallback(e,...s){this.emit(e,...s,this.fileList)}updateData(e){this.options.data=e}updateHeaders(e){this.options.headers=e}setOption(e){this.options=y(this.options,e)}use(e){e.pluginName==="hash-plugin"&&(this.hasher=new ie(e))}formatAccept(e){return B(e)?e:Array.isArray(e)?e.join(","):""}assignBrowse(e,s={}){const{accept:t,...i}=s,r={multiple:this.options.multiple,accept:this.formatAccept(t||this.options.accept)};this.container.assignBrowse(e,y({},r,i))}assignDrop(e){this.container.assignDrop(e)}_setupFileListeners(){const e=(s,t)=>{if(!t.length)return;t.every(r=>r.isSuccess())&&this.emit(d.AllFileSuccess,this.fileList)};this.on(d.FileSuccess,e),this.on(d.FileRemove,e)}setDefaultFileList(e){e.forEach(s=>{this.fileList.push(new P(s,this,s))})}async addFiles(e){const{limit:s,multiple:t,addFailToRemove:i,beforeAdd:r,autoUpload:l}=this.options;let o=[...e];if(o.length===0)return;if(s>0&&o.length+this.fileList.length>s){this.emitCallback(d.Exceed,o);return}t||(o=o.slice(0,1));const c=o.map(p=>new P(p,this,null));await Promise.all(c.map(p=>this._handleFileAdd(p,r))),this.fileList=this.fileList.filter(p=>p.isAddFail()&&i?(this.doRemove(p),!1):!0),c.length>0&&this.emitCallback(d.FilesAdded,this.fileList),l&&this.submit()}async _handleFileAdd(e,s){try{if(m(s)&&await s(e)===!1)throw new Error("Before add rejected");this.emitCallback(d.FileAdded,e)}catch{e.changeStatus(h.AddFail),this.emitCallback(d.FileAddFail,e)}this.fileList.push(e)}async upload(){if(this.fileList.length!==0)for(let e=0;e<this.fileList.length;e++){const s=this.fileList[e];if(!(s.isAddFail()||s.isCheckFail())){if(s.isUploading()||s.isReading())return;if(s.isResume()){const t=s.prevStatusLastRecord[s.prevStatusLastRecord.length-2];t&&s.changeStatus(t),s.upload();return}if(s.isReady()||s.isInit()){s.upload();return}}}}submit(){this.upload()}remove(e){const{beforeRemove:s}=this.options;if(!s)this.doRemove(e);else if(m(s)){const t=s(e);q(t)?t.then(()=>{this.doRemove(e)}):t!==!1&&this.doRemove(e)}}clear(){for(let e=this.fileList.length-1;e>=0;e--)this.fileList[e].remove();this.fileList=[]}doRemove(e){if(!e){this.clear();return}e.remove()}pause(e){if(!e)return;this.fileList.indexOf(e)>-1&&e.pause()}resume(e){if(!e)return;this.fileList.filter(t=>t.isUploading()||t.isReading()).forEach(t=>{t.pause()}),e.resume()}retry(e){if(!e)return;this.fileList.filter(i=>i.isUploading()||i.isReading()).forEach(i=>{i.pause()}),this.fileList.indexOf(e)>-1&&e.retry()}destroy(){this.clear(),this.event.clear(),this.container.destroy()}}const oe=a=>new j(a);exports.Callbacks=d;exports.CheckStatus=v;exports.Chunk=_;exports.ChunkStatus=f;exports.FileContext=P;exports.FileStatus=h;exports.ProcessType=L;exports.Uploader=j;exports.Utils=Y;exports.create=oe;exports.defaultOptions=H;