@iqmo/browser
Version:
Browser Stlite
2 lines (1 loc) • 2.51 kB
JavaScript
import{c as f,e as v}from"./es6-wg9zzKYO.js";const{WritableStream:_,TransformStream:m,DOMException:P,Blob:u}=f,{GONE:M}=v,E=/constructor/i.test(window.HTMLElement);class T{constructor(e="unkown"){this.name=e,this.kind="file"}async getFile(){throw new P(...M)}async isSameEntry(e){return this===e}async createWritable(e={}){var t;const s=await((t=navigator.serviceWorker)==null?void 0:t.getRegistration()),o=document.createElement("a"),n=new m,g=n.writable;if(o.download=this.name,E||!s){let a=[];n.readable.pipeTo(new _({write(r){a.push(new u([r]))},close(){const r=new u(a,{type:"application/octet-stream; charset=utf-8"});a=[],o.href=URL.createObjectURL(r),o.click(),setTimeout(()=>URL.revokeObjectURL(o.href),1e4)}}))}else{const{writable:a,readablePort:r}=new C(_),i=encodeURIComponent(this.name).replace(/['()]/g,escape).replace(/\*/g,"%2A"),w={"content-disposition":"attachment; filename*=UTF-8''"+i,"content-type":"application/octet-stream; charset=utf-8",...e.size?{"content-length":e.size}:{}},R=setTimeout(()=>s.active.postMessage(0),1e4);n.readable.pipeThrough(new m({transform(l,h){if(l instanceof Uint8Array)return h.enqueue(l);const b=new Response(l).body.getReader(),p=S=>b.read().then(y=>y.done?0:p(h.enqueue(y.value)));return p()}})).pipeTo(a).finally(()=>{clearInterval(R)}),s.active.postMessage({url:s.scope+i,headers:w,readablePort:r},[r]);const c=document.createElement("iframe");c.hidden=!0,c.src=s.scope+i,document.body.appendChild(c)}return g.getWriter()}}const U=0,j=0,k=1,L=1,O=2;class W{constructor(e){e.onmessage=t=>this._onMessage(t.data),this._port=e,this._resetReady()}start(e){return this._controller=e,this._readyPromise}write(e){const t={type:U,chunk:e};return this._port.postMessage(t,[e.buffer]),this._resetReady(),this._readyPromise}close(){this._port.postMessage({type:O}),this._port.close()}abort(e){this._port.postMessage({type:L,reason:e}),this._port.close()}_onMessage(e){e.type===j&&this._resolveReady(),e.type===k&&this._onError(e.reason)}_onError(e){this._controller.error(e),this._rejectReady(e),this._port.close()}_resetReady(){this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPending=!0}_resolveReady(){this._readyResolve(),this._readyPending=!1}_rejectReady(e){this._readyPending||this._resetReady(),this._readyPromise.catch(()=>{}),this._readyReject(e),this._readyPending=!1}}class C{constructor(e){const t=new MessageChannel;this.readablePort=t.port1,this.writable=new e(new W(t.port2))}}export{T as FileHandle};