UNPKG

@tinyuploader/sdk

Version:

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

5 lines (4 loc) 21.2 kB
(function(c,k){typeof exports=="object"&&typeof module<"u"?k(exports,require("spark-md5")):typeof define=="function"&&define.amd?define(["exports","spark-md5"],k):(c=typeof globalThis<"u"?globalThis:c||self,k(c.TinyUploaderSdk={},c.SparkMD5))})(this,function(c,k){"use strict";var oe=Object.defineProperty;var he=(c,k,S)=>k in c?oe(c,k,{enumerable:!0,configurable:!0,writable:!0,value:S}):c[k]=S;var n=(c,k,S)=>he(c,typeof k!="symbol"?k+"":k,S);const S=(a,e)=>toString.call(a).slice(8,-1).toLowerCase()===e,$=function(a){return typeof a<"u"},F=function(a){return typeof a=="function"},B=a=>S(a,"object"),U=a=>B(a)&&a!==null,G=a=>S(a,"blob"),E=a=>S(a,"array"),I=a=>a&&F(a.then),T=function(a){return S(a,"string")},x=function(a){return S(a,"boolean")};let K=0;const z=(a="id")=>`${a}-${+new Date}-${K++}`;function w(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 b(){var a,e,s,t,i,r,l=arguments[0]||{},h=1,p=arguments.length,f=!1;for(typeof l=="boolean"&&(f=l,l=arguments[1]||{},h++),typeof l!="object"&&!F(l)&&(l={}),h===p&&(l=this,h--);h<p;h++)if((a=arguments[h])!=null)for(e in a)s=l[e],t=a[e],l!==t&&(f&&t&&(U(t)||(i=E(t)))?(i?(i=!1,r=s&&E(s)?s:[]):r=s&&U(s)?s:{},l[e]=b(f,r,t)):t!==void 0&&(l[e]=t));return l}const y=a=>typeof a=="function"?a()||{}:U(a)?a:{},Q=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice,O=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)]}`},V=(a=600,e=!1)=>new Promise((s,t)=>{const i=setTimeout(()=>{clearTimeout(i),e?t(!1):s(!0)},a)}),_=(a,e=300)=>{let s=0;return function(...t){let i=+new Date;i-s>e&&(s=i,a.apply(this,t))}},X=Object.freeze(Object.defineProperty({__proto__:null,each:w,extend:b,generateUid:z,isArray:E,isBlob:G,isBoolean:x,isDefined:$,isFunction:F,isObject:B,isPlainObject:U,isPromise:I,isString:T,parseData:y,renderSize:O,sleep:V,slice:Q,throttle:_},Symbol.toStringTag,{value:"Module"}));class Y{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)};w(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",b(s.style,{visibility:"hidden",position:"absolute",width:"1px",height:"1px"}),e.appendChild(s),this.inputs.push(s),s}setInputAttributes(e,s){w(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 Z{constructor(){n(this,"events");this.events=new Map}on(e,s){if(!F(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(!F(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 o={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"},g={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"},R={None:"none",Part:"part",WaitMerge:"waitMerge",Success:"success"},L={Check:"check",Upload:"upload",Merge:"merge"};function J(a){const{method:e="POST",withCredentials:s=!0,responseType:t="json",action:i,data:r,headers:l,onSuccess:h,onFail:p,onProgress:f}=a;let u=new XMLHttpRequest;u.responseType=t,u.withCredentials=s,u.open(e,i,!0);const P=new FormData;return Object.entries(r).forEach(([m,C])=>P.append(m,C)),"setRequestHeader"in u&&Object.entries(l).forEach(([m,C])=>u.setRequestHeader(m,C)),u.addEventListener("timeout",()=>{p&&p(new Error("Request timed out"),u)}),u.upload.addEventListener("progress",m=>{f&&f(m)}),u.addEventListener("error",m=>{p&&p(m,u)},!1),u.addEventListener("readystatechange",m=>{if(u.readyState===4){if(u.status<200||u.status>=300){p&&p(new Error(`xhr: status === ${u.status}`),u);return}h&&h(m,u)}}),u.send(P),{abort(){u.abort(),u=null}}}class H{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=g.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||J}onSuccess(e,s,t,i){this.options.requestSucceed(s)?(this.status=g.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=g.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=g.Uploading,this.file.changeStatus(o.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,...y(s),...i};return F(t)&&t(r,L.Upload)||r}send(){this.status=g.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:y(s),data:this.prepare(),query:{...y(this.options.data),...this.file.data},onSuccess:(h,p)=>this.onSuccess(h,p,r,l),onFail:h=>this.onFail(h,l),onProgress:h=>this.onProgress(h)}),this.request.canceled=!1})}abort(){this.status=g.Ready,this.request&&(this.request.canceled=!0,this.request.abort()),this.timer&&clearTimeout(this.timer)}}class A{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(o.Success)):this.changeStatus(o.Init)}generateId(){const{customGenerateUid:e}=this.options;return!e||!F(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 O(this.size)}changeStatus(e){(e!==this.status||e===o.Reading)&&(this.prevStatusLastRecord.push(this.status),this.status=e,this.uploader&&this.uploader.emitCallback&&this.uploader.emitCallback(d.FileChange,this))}isInit(){return this.status===o.Init}isAddFail(){return this.status===o.AddFail}isReading(){return this.status===o.Reading}isReady(){return this.status===o.Ready}isCheckFail(){return this.status===o.CheckFail}isUploading(){return this.status===o.Uploading}isUploadSuccess(){return this.status===o.UploadSuccess}isUploadFail(){return this.status===o.UploadFail}isSuccess(){return this.status===o.Success}isFail(){return this.status===o.Fail}isPause(){return this.status===o.Pause}isResume(){return this.status===o.Resume}createChunks(){this.totalChunks=Math.ceil(this.size/this.chunkSize)||1,this.chunks=Array.from({length:this.totalChunks},(e,s)=>new H(this,s))}async read(){if(!this.options.withHash){this.createChunks(),this.changeStatus(o.Ready);return}this.uploader.emitCallback(d.FileReadStart,this),this.changeStatus(o.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(o.Init),this.uploader.emitCallback(d.FileReadFail,this),new Error("File read failed")}finally{}this.createChunks(),this.changeStatus(o.Ready)}async _computeHash(){try{const e=_(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={...y(s),...this.data};return F(t)&&t(i,e)||i}async checkRequest(){const{checkRequest:e}=this.options;if(!F(e))return Promise.resolve();const s=i=>{this.chunks.forEach(r=>{r.status=i,i===g.Success&&(r.progress=1,r.fakeProgress=1)})},t={[R.Part]:i=>{this.chunks.forEach(r=>{i.includes(r.chunkIndex)&&(r.status=g.Success,r.progress=1,r.fakeProgress=1)})},[R.WaitMerge]:()=>{this.changeStatus(o.UploadSuccess),s(g.Success)},[R.Success]:i=>{this.changeStatus(o.Success),s(g.Success),this.url=i},[R.None]:()=>{}};try{const i=await Promise.resolve(e(this,this._processData(L.Check),y(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(o.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===o.Pause))return;if(this.isUploadSuccess())return this.merge();if(this.isSuccess())return this.success();const e=this.chunks.filter(t=>t.status===g.Ready);if(w(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===g.Ready);Promise.race(t.map(i=>i.send()));return}this.chunks.some(t=>t.status===g.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(o.UploadFail),this.uploader.emitCallback(d.FileUploadFail,this),this._continueUpload()}uploadSuccess(){this.changeStatus(o.UploadSuccess),this.uploader.emitCallback(d.FileUploadSuccess,this)}async merge(){const{mergeRequest:e}=this.options;if(!F(e))return this.success();try{const s=e(this,this._processData(L.Merge),y(this.options.headers)),t=await Promise.resolve(s);x(t)?t?this.success():this.mergeFail():(this.url=t,this.success())}catch(s){console.log(s),this.mergeFail()}}mergeFail(){this.changeStatus(o.Fail),this.uploader.emitCallback(d.FileFail,this),this._continueUpload()}success(){this.changeStatus(o.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(o.Pause),this.uploader.emitCallback(d.FilePause,this),this.uploader.upload()},0)}resume(){this.isPause()&&(this.changeStatus(o.Resume),this.uploader.emitCallback(d.FileResume,this),this.uploader.upload())}retry(){if(!this.isAddFail()){if(this.isCheckFail()){this.changeStatus(o.Ready),this.upload();return}if(this.isUploadSuccess()||this.isFail()){this.merge();return}this.isUploadFail()&&(w(this.chunks,e=>{e.status===g.Fail&&(e.status=g.Ready,e.maxRetries=e.options.maxRetries)}),this.upload())}}}const j={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:R.None}),mergeRequest:a=>!0,processData:(a,e)=>a};var ee=Object.defineProperty,se=(a,e,s)=>e in a?ee(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s,W=(a,e,s)=>se(a,typeof e!="symbol"?e+"":e,s);class te{constructor(e,s){W(this,"hashCarrier"),W(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},(h,{progress:p,hash:f,time:u})=>{h&&l(h),p===100&&r({progress:p,hash:f,time:u}),t&&t({progress:p})})).then(h=>{i={abort:h==null?void 0:h.abort,reject:l}})}),abort:()=>{i&&(i.abort&&i.abort(),i.reject(new Error("Canceled promise to rejected")))}}}}var ie=Object.defineProperty,ae=(a,e,s)=>e in a?ie(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s,M=(a,e,s)=>ae(a,typeof e!="symbol"?e+"":e,s);const re=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice;class q{constructor(){M(this,"name"),this.name="spark-md5"}async computeHash(e,s){const{file:t,chunkSize:i}=e;let r=!1;const l=new k.ArrayBuffer,h=new FileReader,p=Math.ceil(t.size/i),f=Date.now();let u=0;const P=new AbortController,m=P.signal;m.addEventListener("abort",()=>{r||(h.abort(),s(new Error("Hash calculation cancelled"),{progress:0}))}),h.onload=function(v){var D;if(!m.aborted)if(l.append((D=v.target)==null?void 0:D.result),u++,u<p)C(),s(null,{progress:u/p*100});else{r=!0,s(null,{hash:l.end(),time:Date.now()-f,progress:100});return}},h.onerror=function(v){m.aborted||(console.warn("spark-md5: Hash calculation error"),s(v,{progress:0}))};function C(){if(m.aborted)return;const v=u*i,D=v+i>=t.size?t.size:v+i;h.readAsArrayBuffer(re.call(t,v,D))}return C(),{abort:()=>P.abort()}}}M(q,"pluginName","hash-plugin"),M(q,"name","spark-md5");class N{constructor(e){n(this,"container");n(this,"event");n(this,"options");n(this,"hasher");n(this,"fileList");this.container=new Y(this),this.event=new Z,this.options=b(j,e),this.hasher=null,this.fileList=(this.options.fileList||[]).map(s=>new A(s,this,s)),this._setupFileListeners(),this.use(q)}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=b(this.options,e)}use(e){e.pluginName==="hash-plugin"&&(this.hasher=new te(e))}formatAccept(e){return T(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,b({},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 A(s,this,s))})}async addFiles(e){const{limit:s,multiple:t,addFailToRemove:i,beforeAdd:r,autoUpload:l}=this.options;let h=[...e];if(h.length===0)return;if(s>0&&h.length+this.fileList.length>s){this.emitCallback(d.Exceed,h);return}t||(h=h.slice(0,1));const p=h.map(f=>new A(f,this,null));await Promise.all(p.map(f=>this._handleFileAdd(f,r))),this.fileList=this.fileList.filter(f=>f.isAddFail()&&i?(this.doRemove(f),!1):!0),p.length>0&&this.emitCallback(d.FilesAdded,this.fileList),l&&this.submit()}async _handleFileAdd(e,s){try{if(F(s)&&await s(e)===!1)throw new Error("Before add rejected");this.emitCallback(d.FileAdded,e)}catch{e.changeStatus(o.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(F(s)){const t=s(e);I(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 ne=a=>new N(a);c.Callbacks=d,c.CheckStatus=R,c.Chunk=H,c.ChunkStatus=g,c.FileContext=A,c.FileStatus=o,c.ProcessType=L,c.Uploader=N,c.Utils=X,c.create=ne,c.defaultOptions=j,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});