UNPKG

@masvio/uploader

Version:

A simple, lightweight library to easily share files using MASV

2 lines (1 loc) 29.9 kB
var MASV=function(m){"use strict";class d extends Error{constructor(){super("Terminated"),Object.setPrototypeOf(this,d.prototype)}}function w(s){return s>=400&&s<500}var n=(s=>(s.Created="uploader:create",s.Start="upload:start",s.Progress="upload:progress",s.Chunk="upload:chunk",s.File="upload:file",s.Error="upload:error",s.Finished="upload:finish",s.Finalize="upload:finalize",s.FileQueued="upload:file_queued",s.Abort="upload:abort",s.Retry="upload:retry",s.Stalled="upload:stalled",s.FileUnreadable="upload:file_unreadable",s))(n||{}),h=(s=>(s.ApiError="worker:api_error",s.Created="worker:create",s.Execute="worker:execute",s.Finish="worker:finish",s.Error="worker:error",s.Retry="worker:retry",s.Progress="worker:progress",s.Terminate="worker:terminate",s.Abort="worker:abort",s))(h||{});class u{constructor(){this.handlers={}}on(e,t){this.handlers[e]||(this.handlers[e]=[]),this.handlers[e].push(t)}off(e,t){if(t==null){this.handlers[e]=[];return}this.handlers[e]&&(this.handlers[e]=this.handlers[e].filter(i=>i!==t))}clearHandlers(){this.handlers={}}emit(e,t){const i={time:Date.now(),event:e,target:this,data:{},...t};this.handlers[e]&&this.handlers[e].forEach(r=>{r(i)}),this.handlers.emit!=null&&this.handlers.emit.forEach(r=>{r(i)})}bubbleEmit(e){"event"in e&&this.emit(e.event,{...e})}}const B="Y2xhc3MgcCB7CiAgY29uc3RydWN0b3IoYSwgcywgdCkgewogICAgdGhpcy5uYW1lID0gIkFwaUVycm9yIiwgdGhpcy5zdGF0dXNDb2RlID0gYSwgdGhpcy5jb2RlID0gcywgdGhpcy5tZXNzYWdlID0gdDsKICB9Cn0Kc2VsZi5hcGlCYXNlVXJsID0gIiI7CnNlbGYucGFja2FnZVRva2VuID0gIiI7CnNlbGYucGFja2FnZUlEID0gIiI7CnNlbGYubWFzdlVzZXJBZ2VudCA9ICIiOwpzZWxmLmNodW5rU2l6ZSA9IDEwMCA8PCAyMDsKc2VsZi5jdXJyZW50UHJvbWlzZSA9IG51bGw7CnNlbGYucHJvbWlzZVBvb2wgPSBbXTsKc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyBmdW5jdGlvbihlKSB7CiAgY29uc3QgeyBuYW1lOiBhLCBpbnB1dDogcywgc3BlYzogdCB9ID0gZS5kYXRhOwogIGEgPT09ICJJbml0IiAmJiAoc2VsZi5wYWNrYWdlVG9rZW4gPSBzLnBhY2thZ2VUb2tlbiwgc2VsZi5hcGlCYXNlVXJsID0gcy5hcGlCYXNlVXJsLCBzZWxmLm1hc3ZVc2VyQWdlbnQgPSBzLm1hc3ZVc2VyQWdlbnQsIHNlbGYucGFja2FnZUlEID0gcy5wYWNrYWdlSUQsIHNlbGYuY2h1bmtTaXplID0gcy5jaHVua1NpemUpLCBhID09PSAiQ2h1bmsiICYmIChzZWxmLnNwZWMgPSB0IHx8IHt9LCB5KHMpKTsKfTsKYXN5bmMgZnVuY3Rpb24gbSgpIHsKICBzZWxmLmN1cnJlbnRQcm9taXNlICE9IG51bGwgfHwgc2VsZi5wcm9taXNlUG9vbC5sZW5ndGggPT09IDAgfHwgKHNlbGYuY3VycmVudFByb21pc2UgPSBzZWxmLnByb21pc2VQb29sLnNoaWZ0KCksIGF3YWl0IE0oc2VsZi5jdXJyZW50UHJvbWlzZSksIHNlbGYuY3VycmVudFByb21pc2UgPSBudWxsLCBtKCkpOwp9CmZ1bmN0aW9uIHkoZSkgewogIHNlbGYucHJvbWlzZVBvb2wucHVzaChlKSwgbSgpOwp9CmFzeW5jIGZ1bmN0aW9uIE0oZSkgewogIHRyeSB7CiAgICBjb25zdCB7IG1heF9jaHVua19jb3VudDogYSwgbWF4X2NodW5rX3NpemU6IHMsIG1pbl9jaHVua19zaXplOiB0IH0gPSBzZWxmLnNwZWM7CiAgICBsZXQgbCA9IDUgKiAyICoqIDIwLCBuID0gNSAqIDIgKiogMzAsIGkgPSAxZTQ7CiAgICB0ICE9IG51bGwgJiYgKGwgPSB0KSwgcyAhPSBudWxsICYmIChuID0gcyksIGEgIT0gbnVsbCAmJiAoaSA9IGEpOwogICAgbGV0IHIgPSBNYXRoLm1heChsLCBNYXRoLm1pbihuLCBzZWxmLmNodW5rU2l6ZSkpLCBjID0gTWF0aC5jZWlsKGUuZmlsZS5zaXplIC8gcik7CiAgICBjID4gaSAmJiAoYyA9IGksIHIgPSBNYXRoLmNlaWwoZS5maWxlLnNpemUgLyBjKSk7CiAgICBsZXQgbzsKICAgIHIgIT0gc2VsZi5jaHVua1NpemUgJiYgKG8gPSByKTsKICAgIGNvbnN0IHsgZmlsZTogdSwgc3RvcmFnZVR5cGU6IGcsIGNyZWF0ZUJsdWVwcmludDogeiB9ID0gYXdhaXQgUChlLCBvKSwgaCA9IHsgdXBsb2FkSWQ6IGF3YWl0IEkoeikgfSwgdyA9IGF3YWl0IFUodS5pZCwgYywgaCksIFMgPSBhd2FpdCBDKHsKICAgICAgZmlsZTogZS5maWxlLAogICAgICBjaHVua1NpemU6IHIsCiAgICAgIGJsdWVwcmludHM6IHcKICAgIH0pLCBrID0gewogICAgICBmaWxlOiBlLAogICAgICBmaWxlSWQ6IHUuaWQsCiAgICAgIHN0b3JhZ2VUeXBlOiBnLAogICAgICBmaWxlRXh0cmFzOiBoLAogICAgICAuLi5TLAogICAgICBjaHVua1NpemU6IHIKICAgIH07CiAgICByZXR1cm4gc2VsZi5wb3N0TWVzc2FnZSh7IG5hbWU6ICJ3b3JrZXI6ZmluaXNoIiwgZGF0YTogayB9KSwgazsKICB9IGNhdGNoIChhKSB7CiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIHAgPyBzZWxmLnBvc3RNZXNzYWdlKHsgbmFtZTogIndvcmtlcjphcGlfZXJyb3IiLCBkYXRhOiB7IGlucHV0OiBlLCBlcnJvcjogYSB9IH0pIDogc2VsZi5wb3N0TWVzc2FnZSh7IG5hbWU6ICJ3b3JrZXI6ZXJyb3IiLCBkYXRhOiB7IGlucHV0OiBlLCBlcnJvcjogYSB9IH0pLCBhOwogIH0KfQphc3luYyBmdW5jdGlvbiBmKGUgPSAiIiwgYSwgcyA9IHt9LCB0ID0gIlBPU1QiLCBsID0gITEsIG4gPSAwKSB7CiAgbGV0IGk7CiAgdHJ5IHsKICAgIGkgPSBhd2FpdCBmZXRjaChlLCB7CiAgICAgIG1ldGhvZDogdCwKICAgICAgaGVhZGVyczogewogICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgIlgtUGFja2FnZS1Ub2tlbiI6IHNlbGYucGFja2FnZVRva2VuLAogICAgICAgICJNYXN2LVVzZXItQWdlbnQiOiBzZWxmLm1hc3ZVc2VyQWdlbnQsCiAgICAgICAgLi4ucwogICAgICB9LAogICAgICBib2R5OiBhCiAgICB9KTsKICB9IGNhdGNoIHsKICAgIHJldHVybiBkKGUsIGEsIHMsIHQsIGwsIG4pOwogIH0KICBjb25zdCByID0gbCA/IGF3YWl0IGkudGV4dCgpIDogYXdhaXQgaS5qc29uKCk7CiAgaWYgKGkub2spCiAgICByZXR1cm4gcjsKICBpZiAoaS5zdGF0dXMgPj0gNTAwKQogICAgcmV0dXJuIGQoZSwgYSwgcywgdCwgbCwgbik7CiAgdGhyb3cgbmV3IHAoaS5zdGF0dXMsIHIuY29kZSwgci5tZXNzYWdlKTsKfQphc3luYyBmdW5jdGlvbiBkKGUgPSAiIiwgYSwgcyA9IHt9LCB0ID0gIlBPU1QiLCBsID0gITEsIG4gPSAwKSB7CiAgcmV0dXJuIG4gKz0gMSwgYXdhaXQgbmV3IFByb21pc2UoKGkpID0+IHsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpKCk7CiAgICB9LCBNYXRoLm1pbihuLCA1KSAqIDFlMyk7CiAgfSksIGYoZSwgYSwgcywgdCwgbCwgbik7Cn0KYXN5bmMgZnVuY3Rpb24gUChlLCBhKSB7CiAgbGV0IHM7CiAgcmV0dXJuIGUuZmlsZS5sYXN0TW9kaWZpZWQgPyBzID0gbmV3IERhdGUoZS5maWxlLmxhc3RNb2RpZmllZCkgOiBlLmZpbGUubGFzdE1vZGlmaWVkRGF0ZSAmJiAocyA9IGUuZmlsZS5sYXN0TW9kaWZpZWREYXRlKSwgZigKICAgIGAke3NlbGYuYXBpQmFzZVVybH0vdjEvcGFja2FnZXMvJHtzZWxmLnBhY2thZ2VJRH0vZmlsZXNgLAogICAgSlNPTi5zdHJpbmdpZnkoewogICAgICBuYW1lOiBlLmZpbGUubmFtZSwKICAgICAgbGFzdF9tb2RpZmllZDogcywKICAgICAgcGF0aDogZS5wYXRoLAogICAgICBzaXplOiBlLmZpbGUuc2l6ZSwKICAgICAgY2h1bmtfc2l6ZTogYQogICAgfSkKICApOwp9CmFzeW5jIGZ1bmN0aW9uIEkoeyB1cmw6IGUsIGJvZHk6IGEsIGhlYWRlcnM6IHMsIG1ldGhvZDogdCB9KSB7CiAgY29uc3QgbiA9IChhd2FpdCBmKGUsIGEsIHMsIHQsICEwKSkuc3BsaXQoIlVwbG9hZElkIilbMV07CiAgcmV0dXJuIG4uc3Vic3RyaW5nKDEsIG4ubGVuZ3RoIC0gMik7Cn0KYXN5bmMgZnVuY3Rpb24gVShlLCBhLCBzKSB7CiAgcmV0dXJuIGYoCiAgICBgJHtzZWxmLmFwaUJhc2VVcmx9L3YxL3BhY2thZ2VzLyR7c2VsZi5wYWNrYWdlSUR9L2ZpbGVzLyR7ZX0/c3RhcnQ9MCZjb3VudD0ke2F9YCwKICAgIEpTT04uc3RyaW5naWZ5KHMpCiAgKTsKfQphc3luYyBmdW5jdGlvbiBDKGUpIHsKICBjb25zdCBhID0geyByZXE6IGUsIGNodW5rczogW10gfSwgcyA9IGUuY2h1bmtTaXplLCB0ID0gZS5maWxlLnNpemU7CiAgbGV0IGwgPSAwLCBuID0gdDsKICBmb3IgKDsgbiA+IDA7ICkgewogICAgY29uc3QgaSA9IHQgLSBuLCByID0gTWF0aC5taW4odCwgdCAtIG4gKyBzKSwgYyA9IGUuZmlsZS5zbGljZShpLCByKSwgbyA9IGUuYmx1ZXByaW50c1tsXTsKICAgIGEuY2h1bmtzLnB1c2goewogICAgICB1cmw6IG8udXJsLAogICAgICBtZXRob2Q6IG8ubWV0aG9kLAogICAgICBoZWFkZXJzOiBvLmhlYWRlcnMsCiAgICAgIGJvZHk6IGMKICAgIH0pLCBuIC09IHMsIGwrKzsKICB9CiAgcmV0dXJuIGE7Cn0K",y=s=>Uint8Array.from(atob(s),e=>e.charCodeAt(0)),Z=typeof self<"u"&&self.Blob&&new Blob(["URL.revokeObjectURL(import.meta.url);",y(B)],{type:"text/javascript;charset=utf-8"});function W(s){let e;try{if(e=Z&&(self.URL||self.webkitURL).createObjectURL(Z),!e)throw"";const t=new Worker(e,{type:"module",name:s?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+B,{type:"module",name:s?.name})}}class F extends u{constructor(e,t,i,r,g){super(),this.apiBaseUrl=e,this.chunkSize=t,this.packageID=i,this.packageToken=r,this.masvUserAgent=g,this.terminated=!1,this.onNativeWorkerMessage=I=>{const{name:a,data:o}=I.data;this.emit(a,{data:o})},this.emit(h.Created),this.startWorker()}startWorker(){this.nativeWorker=new W,this.nativeWorker.onmessage=this.onNativeWorkerMessage,this.nativeWorker.postMessage({name:"Init",input:{packageToken:this.packageToken,apiBaseUrl:this.apiBaseUrl,packageID:this.packageID,masvUserAgent:this.masvUserAgent,chunkSize:this.chunkSize}})}stopWorker(){this.nativeWorker.onmessage=null,this.nativeWorker.terminate()}createFile(e,t){if(this.terminated)throw new Error("Can't use a terminated worker");this.nativeWorker.postMessage({name:"Chunk",input:e,spec:t})}abort(){this.stopWorker(),this.startWorker()}terminate(){this.terminated=!0,this.emit(h.Terminate),this.clearHandlers(),this.nativeWorker.terminate()}}class X extends u{constructor(e,t,i,r,g=6,I){super(),this.workers=new Array,this.counter=0,this.terminated=!1;let a;for(let o=0;o<g;o++)a=new F(e,t,i,r,I),a.on("emit",this.bubbleEmit.bind(this)),this.workers.push(a)}createFile(e,t){const i=this.workers[this.counter%this.workers.length];if(this.terminated)throw new d;this.counter++,i.createFile(e,t)}abort(){this.workers.forEach(e=>e.abort())}terminate(){this.terminated=!0,this.workers.forEach(e=>e.terminate()),this.clearHandlers()}}const S="Y2xhc3MgYyB7CiAgY29uc3RydWN0b3IodCwgcywgcikgewogICAgdGhpcy5uYW1lID0gIkFwaUVycm9yIiwgdGhpcy5zdGF0dXNDb2RlID0gdCwgdGhpcy5jb2RlID0gcywgdGhpcy5tZXNzYWdlID0gcjsKICB9Cn0KZnVuY3Rpb24gbShlKSB7CiAgcmV0dXJuIGUgPj0gNDAwICYmIGUgPCA1MDA7Cn0KY29uc3QgUiA9IDEwLCBoID0gMWUzLCBnID0gKCkgPT4gKHsKICByZXRyaWVzOiBSLAogIGRlbGF5OiBoCn0pOwpzZWxmLmN1cnJlbnRSZXF1ZXN0ID0gbnVsbDsKc2VsZi5jdXJyZW50UmVxdWVzdHMgPSBbXTsKc2VsZi5yZXRyeTQwMCA9ICExOwpzZWxmLnJldHJ5VGltZW91dCA9IG51bGw7CmZ1bmN0aW9uIGEoKSB7CiAgbGV0IGU7CiAgaWYgKHNlbGYuY3VycmVudFJlcXVlc3RzLmxlbmd0aCA9PT0gMCB8fCBzZWxmLmN1cnJlbnRSZXF1ZXN0ICE9IG51bGwpCiAgICByZXR1cm47CiAgZSA9IHNlbGYuY3VycmVudFJlcXVlc3RzLnNoaWZ0KCksIGUuaW5wdXQucmV0cnlDb25maWcgPT0gbnVsbCAmJiAoZS5pbnB1dC5yZXRyeUNvbmZpZyA9IGcoKSk7CiAgY29uc3QgdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogIHNlbGYuY3VycmVudFJlcXVlc3QgPSB7CiAgICBpbnB1dDogZS5pbnB1dCwKICAgIHhocjogdAogIH07CiAgbGV0IHMgPSAwOwogIGlmICh0Lm9wZW4oZS5pbnB1dC5tZXRob2QsIGUuaW5wdXQudXJsLCAhMCksIGUuaW5wdXQuaGVhZGVycykgewogICAgY29uc3QgciA9IGUuaW5wdXQuaGVhZGVyczsKICAgIGZvciAobGV0IG4gaW4gcikKICAgICAgci5oYXNPd25Qcm9wZXJ0eShuKSAmJiB0LnNldFJlcXVlc3RIZWFkZXIobiwgcltuXSk7CiAgfQogIHQub25sb2FkID0gKHIpID0+IHsKICAgIGxldCBmID0gdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS50cmltKCkuc3BsaXQoL1tcclxuXSsvKSwgcCA9IHt9OwogICAgZi5mb3JFYWNoKCh1KSA9PiB7CiAgICAgIGxldCBvID0gdS5zcGxpdCgiOiAiKSwgeSA9IG8uc2hpZnQoKTsKICAgICAgcFt5XSA9IG8uam9pbigiOiAiKTsKICAgIH0pOwogICAgY29uc3QgbCA9IHQuc3RhdHVzOwogICAgaWYgKGQobCkpCiAgICAgIGkoZSk7CiAgICBlbHNlIGlmIChxKGwpKSB7CiAgICAgIGxldCB1ID0gbmV3IEVycm9yKGBGYXRhbCBlcnJvcjogJHt0LnN0YXR1c31gKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBvID0gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCk7CiAgICAgICAgby5jb2RlICYmIG8ubWVzc2FnZSAmJiAodSA9IG5ldyBjKGwsIG8uY29kZSwgby5tZXNzYWdlKSk7CiAgICAgIH0gY2F0Y2ggKG8pIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJKU09OIHBhcnNlIGZhaWxlZDoiLCBvKTsKICAgICAgfQogICAgICB1IGluc3RhbmNlb2YgYyA/IHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIG5hbWU6ICJ3b3JrZXI6YXBpX2Vycm9yIiwKICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICBpbnB1dDogZS5pbnB1dCwKICAgICAgICAgIGVycm9yOiB1CiAgICAgICAgfQogICAgICB9KSA6IHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIG5hbWU6ICJ3b3JrZXI6ZXJyb3IiLAogICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgIGlucHV0OiBlLmlucHV0LAogICAgICAgICAgZXJyb3I6IHUKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlCiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIG5hbWU6ICJ3b3JrZXI6ZmluaXNoIiwKICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICByZXE6IGUuaW5wdXQsCiAgICAgICAgICBib2R5OiB0LnJlc3BvbnNlVGV4dCwKICAgICAgICAgIHN0YXR1c0NvZGU6IGwsCiAgICAgICAgICBoZWFkZXJzOiBwLAogICAgICAgICAgdHJhbnNmZXJyZWQ6IHMKICAgICAgICB9CiAgICAgIH0pLCBzZWxmLmN1cnJlbnRSZXF1ZXN0ID0gbnVsbCwgYSgpOwogIH0sIHQub25lcnJvciA9IGFzeW5jICgpID0+IHsKICAgIGlmIChlLmlucHV0Py5ib2R5ICE9IG51bGwgJiYgZS5pbnB1dC50eXBlID09PSAidXBsb2FkX2ZpbGUiKSB7CiAgICAgIGNvbnN0IG4gPSBlLmlucHV0LmJvZHkuc3RyZWFtKCkuZ2V0UmVhZGVyKCk7CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgbi5yZWFkKCksIGkoZSk7CiAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIG5hbWU6ICJ3b3JrZXI6ZXJyb3IiLAogICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICBlcnJvcjogZiwKICAgICAgICAgICAgaW5wdXQ6IGUuaW5wdXQKICAgICAgICAgIH0KICAgICAgICB9KSwgc2VsZi5jdXJyZW50UmVxdWVzdCA9IG51bGwsIGEoKTsKICAgICAgfQogICAgfSBlbHNlCiAgICAgIGkoZSk7CiAgfSwgdC5vbmFib3J0ID0gKHIpID0+IHsKICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBuYW1lOiAid29ya2VyOmFib3J0IiwgcGF5bG9hZDogZS5pbnB1dCB9KTsKICB9LCB0Lm9udGltZW91dCA9IChyKSA9PiB7CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgbmFtZTogIndvcmtlcjp0aW1lb3V0IiwgcGF5bG9hZDogZS5pbnB1dCB9KSwgaShlKTsKICB9LCB0LnVwbG9hZC5vbnByb2dyZXNzID0gKHsgbG9hZGVkOiByLCB0b3RhbDogbiB9KSA9PiB7CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgbmFtZTogIndvcmtlcjpwcm9ncmVzcyIsCiAgICAgIHBheWxvYWQ6IHsKICAgICAgICBsb2FkZWQ6IHIsCiAgICAgICAgdG90YWw6IG4sCiAgICAgICAgaW5wdXQ6IGUuaW5wdXQsCiAgICAgICAgdHJhbnNmZXJyZWQ6IHIgLSBzCiAgICAgIH0KICAgIH0pLCBzID0gciwgZS5jb3VudCA+IDAgJiYgKGUuY291bnQgPSAwKTsKICB9LCBlLmlucHV0LnRpbWVvdXQgJiYgKHQudGltZW91dCA9IGUuaW5wdXQudGltZW91dCksIHQuc2VuZChlLmlucHV0Py5ib2R5KTsKfQpmdW5jdGlvbiBpKHsgaW5wdXQ6IGUsIGNvdW50OiB0IH0pIHsKICBjb25zdCBzID0gdCArIDE7CiAgc2VsZi5jdXJyZW50UmVxdWVzdCA9IG51bGwsIHNlbGYucG9zdE1lc3NhZ2UoewogICAgbmFtZTogIndvcmtlcjpyZXRyeSIsCiAgICBwYXlsb2FkOiB7CiAgICAgIGlucHV0OiBlLAogICAgICBjb3VudDogcwogICAgfQogIH0pLCBzZWxmLnJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgc2VsZi5jdXJyZW50UmVxdWVzdHMudW5zaGlmdCh7IGlucHV0OiBlLCBjb3VudDogcyB9KSwgYSgpOwogIH0sIE1hdGgubWluKHMsIDUpICogZS5yZXRyeUNvbmZpZy5kZWxheSk7Cn0KZnVuY3Rpb24gZChlKSB7CiAgcmV0dXJuIHNlbGYucmV0cnk0MDAgJiYgWy0xLCAwLCA0MDAsIDQwMV0uaW5jbHVkZXMoZSkgPyAhMCA6IGUgPj0gNTAwOwp9CmZ1bmN0aW9uIHEoZSkgewogIHJldHVybiBkKGUpID8gITEgOiBtKGUpOwp9CnNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogIGNvbnN0IHsgZGF0YTogdCB9ID0gZSwgcyA9IHsKICAgIHJlcXVlc3Q6IChyKSA9PiB7CiAgICAgIHNlbGYuY3VycmVudFJlcXVlc3RzLnB1c2goewogICAgICAgIGlucHV0OiByLAogICAgICAgIGNvdW50OiAwCiAgICAgIH0pLCBhKCk7CiAgICB9LAogICAgYWJvcnQ6ICgpID0+IHsKICAgICAgaWYgKHNlbGYuY3VycmVudFJlcXVlc3QgIT0gbnVsbCkgewogICAgICAgIGNvbnN0IHsgaW5wdXQ6IHIsIHhocjogbiB9ID0gc2VsZi5jdXJyZW50UmVxdWVzdDsKICAgICAgICByLnR5cGUgPT09ICJ1cGxvYWRfZmlsZSIgJiYgbi5hYm9ydCgpLCBzZWxmLmN1cnJlbnRSZXF1ZXN0ID0gbnVsbDsKICAgICAgfQogICAgICBjbGVhclRpbWVvdXQoc2VsZi5yZXRyeVRpbWVvdXQpLCBzZWxmLmN1cnJlbnRSZXF1ZXN0cyA9IHNlbGYuY3VycmVudFJlcXVlc3RzLmZpbHRlcigocikgPT4gci5pbnB1dC50eXBlICE9PSAidXBsb2FkX2ZpbGUiKSwgYSgpOwogICAgfSwKICAgIGNvbmZpZzogKHIpID0+IHsKICAgICAgc2VsZi5yZXRyeTQwMCA9IHIucmV0cnk0MDAgfHwgITE7CiAgICB9CiAgfTsKICBzW3QubWVzc2FnZV0gIT0gbnVsbCAmJiBzW3QubWVzc2FnZV0odCk7Cn07Cg==",V=s=>Uint8Array.from(atob(s),e=>e.charCodeAt(0)),k=typeof self<"u"&&self.Blob&&new Blob(["URL.revokeObjectURL(import.meta.url);",V(S)],{type:"text/javascript;charset=utf-8"});function K(s){let e;try{if(e=k&&(self.URL||self.webkitURL).createObjectURL(k),!e)throw"";const t=new Worker(e,{type:"module",name:s?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+S,{type:"module",name:s?.name})}}var l=(s=>(s.AddChunk="add_chunk",s.UploadFile="upload_file",s.FinalizeFile="finalize_file",s.FinalizePackage="finalize_package",s.CancelPackage="cancel_package",s.Error="error",s))(l||{});class H extends u{constructor(e=!1){super(),this.terminated=!1,this.onNativeWorkerMessage=t=>{const{name:i,payload:r}=t.data;this.emit(i,{data:r})},this.startWorker(e),this.emit(h.Created)}startWorker(e=!1){this.nativeWorker=new K,this.nativeWorker.onmessage=this.onNativeWorkerMessage,this.nativeWorker.postMessage({message:"config",retry400:e})}execute(e){if(this.terminated)throw new Error("Can't run a terminated worker");this.emit(h.Execute,{data:e}),this.nativeWorker.postMessage({message:"request",...e})}abort(){this.nativeWorker.postMessage({message:"abort"})}terminate(){this.terminated=!0,this.emit(h.Terminate),this.clearHandlers(),this.nativeWorker.terminate()}}const Y=1600*1e3;class z extends u{constructor(e,t,i,r,g,I=6,a){super(),this.apiBaseUrl=e,this.packageID=r,this.packageToken=g,this.poolSize=I,this.masvUserAgent=a,this.apiXhrExecutor=t,this.storageXhrExecutor=i,this.emit(n.Created),this.storageXhrExecutor.on(h.Progress,o=>this.onStorageProgress(o)),this.storageXhrExecutor.on(h.Abort,o=>this.onStorageAbort(o)),this.storageXhrExecutor.on(h.Retry,o=>this.onStorageRetry(o)),this.storageXhrExecutor.on(h.Finish,o=>this.onStorageFinish(o)),this.storageXhrExecutor.on(h.Error,o=>this.onStorageError(o))}upload(e){const t=e.chunks.filter(i=>!i.isFinished).map(i=>({fileId:e.id,sequence:i.index,timeout:Y,...i.chunk,type:l.UploadFile}));return this.emit(n.Start,{data:e}),e.running=!0,this.storageXhrExecutor.execute(...t),e}abort(){this.storageXhrExecutor.abort(),this.apiXhrExecutor.abort()}onStorageProgress(e){const t=e.data;e.data.input.type===l.UploadFile&&this.bubbleEmit({event:n.Progress,target:e.target,data:t})}onStorageFinish(e){const t=e.data;t.req.type===l.UploadFile&&this.bubbleEmit({event:n.Chunk,target:e.target,data:t})}onStorageAbort(e){const t=e.data;t.type===l.UploadFile&&this.bubbleEmit({event:n.Abort,target:e.target,data:t})}onStorageRetry(e){const t=e.data;t.input.type===l.UploadFile&&this.bubbleEmit({event:n.Retry,target:e.target,data:t})}onStorageError(e){const t=e.data;this.bubbleEmit({event:n.Error,target:e.target,data:t})}}class G extends u{constructor(e=6,t=!1){super(),this.workers=new Array,this.counter=0,this.retry400Errors=!1,this.terminated=!1,this.retry400Errors=t,this.initWorkerPool(e)}initWorkerPool(e=6){for(let t=0;t<e;t++){let i=new H(this.retry400Errors);i.on("emit",this.bubbleEmit.bind(this)),this.workers.push(i)}}stopWorkerPool(){this.workers.forEach(e=>{e.terminate()})}abort(){this.workers.forEach(e=>e.abort())}execute(...e){if(this.terminated)throw new d;for(let t of e)this.workers[this.counter++%this.workers.length].execute(t)}terminate(){this.terminated=!0,this.clearHandlers(),this.stopWorkerPool()}}let v=0;const N=Date.now();function U(){return"randomUUID"in crypto?crypto.randomUUID():`${N}_${v++}`}class L{constructor(){this.queue={}}getFile(e){return this.queue[e]}addFile(e){const t=new x(e);return this.queue[e.fileId]=t,t}removeFile(e){delete this.queue[e]}setProgress(e,t,i){const r=this.getFile(e);if(!r)return;const g=r.getChunk(t);if(g)return g.setProgress(i),g}get length(){return Object.keys(this.queue).length}get totalChunks(){return Object.values(this.queue).reduce((e,t)=>e+t.chunks.length,0)}get totalChunksInProgress(){return Object.values(this.queue).reduce((e,t)=>e+t.chunksInProgress,0)}}class x{constructor({fileId:e,req:t,file:i,chunks:r,storageType:g,fileExtras:I}){this.chunks=[],this.running=!1,this.finalized=!1,this.id=e,this.req=t,this.file=i,this.chunks=r.map((a,o)=>new E(a,o)),this.chunkSize=t.chunkSize>i.file.size?i.file.size:t.chunkSize,this.storageType=g,this.fileExtras=I}setChunkExtras({headers:e,req:t}){const i=t.sequence||0,r=this.chunks.find(I=>I.index===i);if(!r)return;const g=e.etag||e.ETag||e.Etag;r.setExtras({partNumber:String(i+1),etag:g})}getChunk(e){return this.chunks[e]}validateMissingEtags(){return this.chunks.filter(e=>e.extras==null||e.extras.etag==null)}get isFinished(){return this.chunks.every(e=>e.isFinished)}get inProgress(){return this.chunks.some(e=>e.currentBytes>0)&&!this.isFinished}get currentBytes(){return this.chunks.reduce((e,t)=>e+t.currentBytes,0)}get totalBytes(){return this.chunks.reduce((e,t)=>e+t.totalBytes,0)}get chunksInProgress(){return this.chunks.filter(e=>!e.isFinished).length}}class E{constructor(e,t){this._currentBytes=0,this.extras=null,this.index=t,this.chunk=e}setProgress(e){this._currentBytes=e}setExtras(e){this.extras=e}get etag(){return this.extras?.etag}get currentBytes(){return this._currentBytes}get totalBytes(){return this.chunk.body.size}get inProgress(){return this.currentBytes>0&&!this.isFinished}get isFinished(){return this.currentBytes>=this.totalBytes&&this.extras!=null}}class R{constructor(e){if(this.ma=0,this.v=0,this.d=0,this.f=0,this.previousTime=0,e<=0)throw new Error("must provide a timespan > 0 to the moving average constructor");this.timespan=e}alpha(e,t){return 1-Math.exp(-(e-t)/this.timespan)}push(e,t){if(this.previousTime>0){const i=this.alpha(e,this.previousTime),r=t-this.ma,g=i*r;this.ma=i*t+(1-i)*this.ma,this.v=(1-i)*(this.v+r*g),this.d=Math.sqrt(this.v),this.f=this.ma+i*r}else this.ma=t;this.previousTime=e}movingAverage(){return this.ma}variance(){return this.v}deviation(){return this.d}forecast(){return this.f}}var c=(s=>(s.Start="upload_start",s.Stop="upload_stop",s.Pause="upload_pause",s.Finish="upload_finish",s.Continue="upload_continue",s))(c||{});const p=500;class D{constructor(){this.transferred=0,this.received=0,this.finalized=0,this.finalizedFiles=0,this.total=0,this.totalFiles=0,this.marks={upload_start:[],upload_pause:[],upload_continue:[],upload_finish:[],upload_stop:[]},this.moving=new R(p),this.debounceAverage=!1,this.lastSampleAmount=0,this.progress=0,this.instantSpeed=0,this.movingSpeed=0,this.duration=0,this.timer=-1}mark(e){this.marks[e]&&(e==="upload_start"||e==="upload_continue"?this.record(performance.now()):this.stopTimer(),this.marks[e].push(Date.now()))}record(e){this.timer=requestAnimationFrame(t=>{this.duration+=t-e,this.record(t)})}stopTimer(){cancelAnimationFrame(this.timer)}clear(e){this.marks[e]=[]}setTotal(e){this.total=e}setTotalFiles(e){this.totalFiles=e}addData(e=0){const t=Date.now();if(this.transferred+=e,this.progress+=e,this.debounceAverage)return;this.debounceAverage=!0;const i=this.transferred-this.lastSampleAmount;this.instantSpeed=i/(p/1e3),this.lastSampleAmount=this.transferred,this.moving.push(t,this.instantSpeed),this.movingSpeed=this.moving.movingAverage(),setTimeout(()=>{this.debounceAverage=!1},p)}addReceived(e=0){this.received+=e}addFinalizedFile(e=0){this.finalized+=e,this.finalizedFiles++}subtractProgress(e=0){this.progress-=e}getStats(){return{duration:this.duration,speed:this.averageSpeed,instant:this.instantSpeed,moving:this.movingSpeed,transferred:this.transferred,total:this.total,totalFiles:this.totalFiles,progress:this.progress,received:this.received,finalized:this.finalized,finalizedFiles:this.finalizedFiles}}get averageSpeed(){return this.transferred/(this.duration/1e3)}}const C=6,J="masv-web",T="masv-web-uploader",P="dev";var f=(s=>(s.Idle="idle",s.Uploading="uploading",s.Processing="processing",s.Ready="ready",s.Paused="paused",s.Finished="finished",s.Terminated="terminated",s.Cancelled="cancelled",s))(f||{});const A=class A extends u{constructor(e,t,i="https://api.massive.app",r=104857600,g=`${J}/${P}`,I=6e4){super(),this.packageID=e,this.packageToken=t,this.apiBaseUrl=i,this.stallTimeout=I,this.stallTimer=-1,this.performanceStats=new D,this.version="2.2.7",this.uploadState=new L,this.fileQueue=[],this.createQueue=new Set,this.unreadableFiles=new Set,this.status="idle",this.spec={max_chunk_count:1e4,max_chunk_size:5368709120,min_chunk_size:5242880},this.masvUserAgent=`${g}+${T}/${this.version}`,this.apiXhrExecutor=new G(C),this.storageXhrExecutor=new G(C,!0),this.fchunker=new X(i,r,e,t,C,this.masvUserAgent),this.fuploader=new z(i,this.apiXhrExecutor,this.storageXhrExecutor,e,t,C,this.masvUserAgent),this.fchunker.on(h.ApiError,a=>this.onUploadApiError(a)),this.fchunker.on(h.Finish,a=>this.onChunkFinish(a)),this.fuploader.on(n.Progress,a=>{this.onUploadProgress(a)}),this.fuploader.on(n.Chunk,a=>this.onChunkUploadFinish(a)),this.fuploader.on(n.Abort,a=>this.onUploadAbort(a)),this.fuploader.on(n.Retry,a=>this.onUploadRetry(a)),this.fuploader.on(n.Error,a=>this.onUploadError(a)),this.fchunker.on("emit",this.bubbleEmit.bind(this)),this.fuploader.on("emit",this.bubbleEmit.bind(this)),this.apiXhrExecutor.on(h.ApiError,a=>this.onUploadApiError(a)),this.apiXhrExecutor.on(h.Finish,a=>this.onAPIFinish(a))}resetStallTimer(){clearTimeout(this.stallTimer),this.stallTimer=setTimeout(()=>{this.emit(n.Stalled)},this.stallTimeout)}popNextFile(){return this.fileQueue.pop()}get nextFile(){return this.fileQueue[this.fileQueue.length-1]}get canUploadFile(){return this.nextFile==null||this.uploadState.totalChunksInProgress+this.createQueue.size>=C?!1:this.status==="ready"||this.status==="uploading"}get hasFinished(){return this.nextFile===void 0&&this.uploadState.length===0&&this.fileQueue.length===0&&this.createQueue.size===0}onUploadProgress({data:e}){this.resetStallTimer(),e.input.fileId&&this.uploadState.setProgress(e.input.fileId,e.input.sequence||0,e.loaded),this.performanceStats.addData(e.transferred)}onChunkFinish({data:e}){this.emit(n.FileQueued,{data:e});const t=this.uploadState.addFile(e);this.resetStallTimer(),this.createQueue.delete(e.file.id),t.totalBytes===0?t.file.file.stream().getReader().read().then(()=>{t.running=!0,this.finalizeFile(t)}).catch(g=>{this.setUnreadableFile(t,g.message)}):this.fuploader.upload(t),this.uploadNext()}onUploadAbort({data:e}){const{fileId:t="",sequence:i=0}=e,r=this.uploadState.getFile(t)?.getChunk(i).currentBytes??0;this.performanceStats.subtractProgress(r),this.uploadState.setProgress(t,i,0)}onUploadRetry({data:e}){const{fileId:t="",sequence:i=0}=e.input,r=this.uploadState.getFile(t)?.getChunk(i).currentBytes??0;this.performanceStats.subtractProgress(r),this.uploadState.setProgress(t,i,0)}onUploadApiError({data:e}){const t=e.error;let{code:i}=t;this.emit(n.Error,{data:{input:e.input,apiError:t}}),w(i)&&(this.fuploader.abort(),this.fchunker.abort(),this.terminate())}onUploadError({data:e}){const{fileId:t=""}=e.input;let{message:i="generic upload error"}=e.error;const r=this.uploadState.getFile(t);r!=null&&this.setUnreadableFile(r,i)}onChunkUploadFinish({data:e}){const{fileId:t="",sequence:i=0}=e.req,r=this.uploadState.getFile(t);if(r){const g=r.getChunk(i);this.performanceStats.addReceived(g.totalBytes),r.setChunkExtras(e),r.isFinished&&(this.emit(n.File,{data:r}),this.finalizeFile(r))}this.uploadNext()}onAPIFinish({data:e}){const t=[200,201,204];if(e.req.type===l.FinalizeFile){const i=this.uploadState.getFile(e.req.fileId);if(i)if(t.includes(e.statusCode))i.finalized=!0,i.running=!1,this.performanceStats.addFinalizedFile(i.file.file.size),this.uploadState.removeFile(i.id),this.emit(n.Finalize,{data:i});else{this.setUnreadableFile(i,`unexpected status code for finalize file request: ${e.statusCode}`),this.hasFinished&&this.stop();return}this.uploadNext(),this.hasFinished&&(this.stop(),this.unreadableFiles.size>0?this.markAsStalled():this.finalize())}e.req.type===l.FinalizePackage&&(t.includes(e.statusCode)?(this.performanceStats.mark(c.Finish),this.emit(n.Finished,{data:this.getPerformanceStats()}),this.status="finished",this.terminate()):(this.markAsStalled(`unexpected status code for finalize package request: ${e.statusCode}`),this.stop())),e.req.type===l.CancelPackage&&this.terminate()}setUnreadableFile(e,t){this.emit(n.FileUnreadable,{data:e}),t==="network error"&&(t="file is unreadable (network error)"),this.unreadableFiles.add({id:e.id,name:e.file?.file?.name,path:e.file?.path,size:e.file?.file?.size,errorMessage:t,errorTimestamp:new Date().toISOString()}),this.uploadState.removeFile(e.id),this.hasFinished&&this.markAsStalled(),this.uploadNext()}markAsStalled(e="Upload has become stalled due to unreadable files"){this.unreadableFiles.size>0&&(e=[...this.unreadableFiles.values()][0].errorMessage);const t={error_code:"upload_stalled",error_message:e,event_time:new Date().toISOString(),extras:this.getProgressSummary()};this.apiXhrExecutor.execute({url:`${this.apiBaseUrl}/v1/packages/${this.packageID}/error`,method:"POST",headers:{"Content-Type":"application/json","X-Package-Token":this.packageToken,"Masv-User-Agent":this.masvUserAgent},body:JSON.stringify(t),timeout:1e4,type:l.Error}),this.emit(n.Stalled),clearTimeout(this.stallTimer)}async addFiles(...e){this.status="processing",this.performanceStats.setTotalFiles(e.length),this.performanceStats.setTotal(e.reduce((t,i)=>t+i.file.size,0)),this.status="ready",this.fileQueue=e,this.spec=await this.getSpec(),this.start()}start(){if(this.status==="uploading")return;this.resetStallTimer(),this.status="uploading";const{transferred:e}=this.performanceStats.getStats();if(e>0?this.performanceStats.mark(c.Continue):this.performanceStats.mark(c.Start),this.uploadState.totalChunksInProgress>0){const t=Object.values(this.uploadState.queue);for(let i of t)this.fuploader.upload(i)}else this.uploadNext()}async getSpec(e=0){let t;try{t=await fetch(`${this.apiBaseUrl}/v1/system/packages/spec`,{method:"GET",headers:{"Content-Type":"application/json","Masv-User-Agent":this.masvUserAgent}})}catch{}if(t){const i=await t.json();if(t.ok)return i;if(t.status>=500&&e<5)return this.getSpec(e++)}return{max_chunk_count:1e4,max_chunk_size:5368709120,min_chunk_size:5242880}}uploadNext(){if(!this.canUploadFile)return;const e=this.popNextFile();e&&(e.id==null&&(e.id=U()),this.createQueue.add(e.id),this.fchunker.createFile(e,this.spec))}stop(){this.status="idle",this.performanceStats.mark(c.Stop)}pause(){this.status!=="paused"&&(clearTimeout(this.stallTimer),this.status="paused",this.performanceStats.mark(c.Pause),this.fuploader.abort())}terminate(){this.status!=="terminated"&&(this.status="terminated",this.clearHandlers(),this.storageXhrExecutor.terminate(),this.apiXhrExecutor.terminate(),this.fchunker.terminate())}cancel(){this.pause(),this.status="cancelled",this.apiXhrExecutor.execute({url:`${this.apiBaseUrl}/v1/packages/${this.packageID}`,method:"DELETE",headers:{"X-Package-Token":this.packageToken,"Masv-User-Agent":this.masvUserAgent},timeout:1e4,type:l.CancelPackage})}finalizeFile(e){if(e.validateMissingEtags().length>0){this.fuploader.upload(e);return}const{id:i,fileExtras:r,chunkSize:g,file:I,chunks:a}=e,o=a.map(Q=>Q.extras);this.apiXhrExecutor.execute({url:`${this.apiBaseUrl}/v1/packages/${this.packageID}/files/${i}/finalize`,method:"POST",headers:{"Content-Type":"application/json","X-Package-Token":this.packageToken,"Masv-User-Agent":this.masvUserAgent},body:JSON.stringify({fileExtras:r,chunk_size:g,size:I.file.size,chunkExtras:o}),timeout:6e4,fileId:i,type:l.FinalizeFile})}getIncompleteFiles(){return{queued:this.fileQueue,creating:[...this.createQueue],uploading:Object.values(this.uploadState.queue),unreadable:[...this.unreadableFiles]}}finalize(){clearTimeout(this.stallTimer),this.apiXhrExecutor.execute({url:`${this.apiBaseUrl}/v1/packages/${this.packageID}/finalize`,method:"POST",headers:{"Content-Type":"application/json","X-Package-Token":this.packageToken,"Masv-User-Agent":this.masvUserAgent},timeout:6e4,type:l.FinalizePackage})}getPerformanceStats(){return this.performanceStats.getStats()}getProgressSummary(){const e=this.performanceStats.getStats();return{finalizedBytes:String(e.finalized),finalizedFiles:String(e.finalizedFiles),totalBytes:String(e.total),totalFiles:String(e.totalFiles),unreadableFiles:String(this.unreadableFiles.size)}}};A.UploaderEvents=n,A.States=f;let b=A;return m.Uploader=b,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"}),m}({});