up-fetch
Version:
Advanced fetch client builder for typescript.
2 lines (1 loc) • 3.72 kB
JavaScript
var y=class extends Error{constructor(t){super(t.message),this.name="ResponseError",this.response=t.response,this.request=t.request,this.data=t.data,this.status=t.response.status}},D=e=>e instanceof y;var u=class extends Error{constructor(t,n){super(JSON.stringify(t.issues)),this.name="ValidationError",this.issues=t.issues,this.data=n}},E=e=>e instanceof u;var g=e=>{let t={};return e.forEach(n=>{new Headers(n).forEach((r,c)=>{r==="null"||r==="undefined"?delete t[c]:t[c]=r})}),t},R=(e,t)=>"any"in AbortSignal?AbortSignal.any([e,t&&AbortSignal.timeout(t)].filter(Boolean)):e,h=(e,t=[])=>{let n={...e};for(let r in n)t.includes(r)&&delete n[r];return n},p=e=>k(e)||Array.isArray(e)||typeof e?.toJSON=="function",k=e=>e&&typeof e=="object"&&e.constructor?.name==="Object",x=(e="",t,n,r,c)=>{t=t.href??t;let s=c({...h(n,[...new URL(t,"http://a").searchParams.keys()]),...r}),a=/^https?:\/\//.test(t)?t:!e||!t?e+t:e.replace(/\/$/,"")+"/"+t.replace(/^\//,"");return s&&(a+=(a.includes("?")?"&":"?")+s.replace(/^\?/,"")),a},F=(e,t)=>new Promise((n,r)=>{t?.addEventListener("abort",s,{once:!0});let c=setTimeout(()=>{t?.removeEventListener("abort",s),n()},e);function s(){clearTimeout(c),r(t.reason)}});async function T(e,t){let n=await e["~standard"].validate(t);if(n.issues)throw new u(n,t);return n.value}var f={parseResponse:e=>e.clone().json().catch(()=>e.text()).then(t=>t||null),parseRejected:async(e,t)=>new y({message:`[${e.status}] ${e.statusText}`,data:await f.parseResponse(e,t),response:e,request:t}),serializeParams:e=>new URLSearchParams(JSON.parse(JSON.stringify(e))).toString(),serializeBody:e=>p(e)?JSON.stringify(e):e,reject:e=>!e.ok,retry:{when:e=>e.response?.ok===!1,attempts:0,delay:0}};var v=typeof window<"u"&&/AppleWebKit/i.test(navigator.userAgent)&&!/Chrome/i.test(navigator.userAgent);async function w(e,t){let n="ok"in e;if(v&&!n||!t||!e.clone().body)return e;let c=e.headers.get("content-length"),s=+(c||0);if(!n&&!c){let o=e.clone().body.getReader();for(;;){let{value:l,done:d}=await o.read();if(d)break;s+=l.byteLength}}let a=0;await t({totalBytes:s,transferredBytes:a,chunk:new Uint8Array},e);let m=new ReadableStream({async start(o){let l=e.body.getReader();for(;;){let{value:d,done:i}=await l.read();if(i)break;a+=d.byteLength,s=Math.max(s,a),await t({totalBytes:s,transferredBytes:a,chunk:d},e),o.enqueue(d)}o.close()}});return n?new Response(m,e):new Request(e,{body:m,duplex:"half"})}var S={},P=(e,t=()=>S)=>async(n,r=S,c)=>{let s=await t(n,r,c),a={...f,...s,...r,...S,retry:{...f.retry,...s.retry,...r.retry}};a.body=r.body===null||r.body===void 0?r.body:a.serializeBody(r.body),a.headers=g([p(r.body)&&typeof a.body=="string"?{"content-type":"application/json"}:{},s.headers,r.headers]);let m=0,o,l,d;do{a.signal=R(r.signal,a.timeout),o=await w(new Request(n.url?n:x(a.baseUrl,n,s.params,r.params,a.serializeParams),a),r.onRequestStreaming);try{await s.onRequest?.(o),await r.onRequest?.(o),l=await w(await e(o,{...h(a,["body"]),headers:o.headers},c),r.onResponseStreaming),d=void 0}catch(i){d=i}try{if(!await a.retry.when({request:o,response:l,error:d})||++m>(typeof a.retry.attempts=="function"?await a.retry.attempts({request:o}):a.retry.attempts))break;let i={attempt:m,request:o,response:l,error:d};await F(typeof a.retry.delay=="function"?await a.retry.delay(i):a.retry.delay,a.signal),s.onRetry?.(i),r.onRetry?.(i)}catch(i){d=i;break}}while(!0);try{if(d)throw d;if(await a.reject(l))throw await a.parseRejected(l,o);let i=await a.parseResponse(l,o),b=a.schema?await T(a.schema,i):i;return s.onSuccess?.(b,o),r.onSuccess?.(b,o),b}catch(i){throw s.onError?.(i,o),r.onError?.(i,o),i}};export{y as ResponseError,p as isJsonifiable,D as isResponseError,E as isValidationError,P as up};