fetch-api-progress
Version:
Upload and download progress for Fetch API
2 lines (1 loc) • 1.55 kB
JavaScript
var o=class{constructor(n){this.lengthComputable=n.lengthComputable,this.loaded=n.loaded,this.total=n.total}};function f(e,n){if(!n)return e;let a=(()=>{let t=!1,d=new Request("https://teil.one",{body:new ReadableStream,method:"POST",get duplex(){return t=!0,"half"}}).headers.has("Content-Type");return t&&!d})();if(!e.body||!a||/^get$/i.test(e.method??"")||/^head$/i.test(e.method??""))return e;if(!(e.body instanceof Blob))throw new Error("Request progress tracking is supported only for Blob and File");let l=e.body,r=l.size,s=0,u=new TransformStream({start(){let t=new o({lengthComputable:a,loaded:0,total:r});n(t)},transform(t,d){d.enqueue(t),s+=t.byteLength;let c=new o({lengthComputable:a,loaded:s,total:r});n(c)},flush(){let t=new o({lengthComputable:a,loaded:r,total:r});n(t)}});return{...e,body:l.stream().pipeThrough(u),duplex:"half"}}function g(e,n){if(!n)return e;let a=typeof Response<"u"&&typeof ReadableStream<"u";if(!e.body||!a)return e;let l=e.body.getReader(),r=0,s=e.headers.get("content-length"),u=e.headers.get("content-encoding"),p=u&&!/^identity$/i.test(u),t=s&&!p?parseInt(s,10):void 0,d=new ReadableStream({start(c){n(new o({lengthComputable:typeof t<"u",loaded:r,total:t})),async function m(){let{done:h,value:i}=await l.read();if(h){n(new o({lengthComputable:typeof t<"u",loaded:r,total:t})),c.close();return}i&&(r+=i.length,n(new o({lengthComputable:typeof t<"u",loaded:r,total:t}))),c.enqueue(i),m()}()}});return new Response(d,e)}export{o as FetchProgressEvent,f as trackRequestProgress,g as trackResponseProgress};