UNPKG

@tuentyfaiv/http

Version:

Library for http requests based on fetch

2 lines (1 loc) 3.69 kB
import{ServiceError as e}from"./errors.js";import{validateContentType as s}from"./validation.js";import{throwError as t}from"./throw.js";import{logger as r}from"./log.js";import{parseBody as a}from"./parse.js";import{ContentType as o}from"./content.js";import{HttpMethod as n,HttpMethodLower as i}from"./methods.js";class c{#e;#s;#t;#r;#a;#o=({json:s,response:t})=>{if(s?.error&&!s?.result||s?.detail&&!s.detail?.success||s?.payload&&!s?.success||s?.errors||!t.ok){const r=`${t.status}: ${t.statusText||s?.error}`;throw new e({message:this.#n("errorMessage",this.#a)??s?.error??s?.message??s?.detail?.message,status:s?.code??t.status,statusText:s?.result??s?.status??r,errors:s?.errors??s?.detail?.errors??{description:s?.error??t.statusText}})}};static instance={};constructor(e,s){this.#r=s?.swal,this.#a={errorMessage:s?.errorMessage,secure:s?.secure,secureParams:s?.secureParams,log:s?.log},this.#e=e,this.#t=s?.params??{},this.#s=new Headers({...s?.headers,"Content-Type":o.ApplicationJson}),Object.freeze(this)}static create(e,s){if(!c.instance[e]){const t=new c(e,s),r={get:(e,s)=>Object.values(i).includes(s)?async(t,r,a={})=>{const{secure:o=!0,secureParams:n=!0,headers:c=new Headers,...h}=s===i.get?r??{}:a,p={method:s.toUpperCase(),endpoint:t,secure:o,secureParams:n,headers:c,...h,...s!==i.get?{body:r}:{}};return await e.#i(p)}:Reflect.get(e,s)};c.instance[e]=new Proxy(t,r)}return c.instance[e]}async#i(e){try{const s=this.#c(this.#h(e)),t=await fetch(s.url,s.config);return await this.#p(t,e)}catch(e){throw t(e,this.#r)}}#h(e){const{headers:s,type:t}=e,r=new Headers(s),a=new Headers(this.#s),i=t??this.#s.get("Content-Type")??o.ApplicationJson;return r.has("Content-Type")||r.set("Content-Type",i),a.forEach(((e,s)=>{r.has(s)||r.set(s,e)})),e.method===n.GET&&r.delete("Content-Type"),this.#n("secure",e)||r.delete("Authorization"),{...e,type:t,headers:r}}#u(e){const s=this.#n("secureParams",e),t={...this.#t,...e.params},r=Object.entries(t).reduce(((e,[t,r])=>{const a="string"==typeof r||"number"==typeof r||"boolean"==typeof r,o=Array.isArray(r)||"object"==typeof r,n=o?JSON.stringify(r):"",i=a?r:n,c=s?encodeURIComponent(t):t,h=s?encodeURIComponent(i):i;return a||o?[...e,`${c}=${h}`]:e}),[]).join("&");return r.length>0?`?${r}`:""}#c(e){const{body:s,params:t,type:r,log:o,arrayBuffer:i,errorMessage:c,headers:h,secure:p,secureParams:u,thrower:d,clone:l,endpoint:m,method:g,signal:f,...y}=e,{body:w,headers:j}=a(e),T=this.#u(e),b={method:g,headers:j,...y,...g===n.GET?{}:{body:w},...f?{signal:f}:{}},C=`${"no-api"===this.#e?"":this.#e}${m}${T}`;return this.#d(e,{url:C,request:b,params:T}),{url:C,config:b}}#l({clone:e,response:s}){return e?{cloned:s.clone(),real:s}:{cloned:s,real:s}}async#p(t,r){const a=t.headers.get("Content-Type")??o.ApplicationJson,n=s(a),{real:i,cloned:c}=this.#l({clone:r.clone,response:t}),h=n.json?await i.json():{},p=r.thrower??this.#o;if(this.#d(r,{response:n.json?h:i}),p({json:h,response:i}),n.file)return{success:!0,message:"Success to download",payload:await(r.arrayBuffer?i.arrayBuffer():i.blob()),response:c};if(n.json){const e=h?.data??h?.payload??h;return{success:!!h?.result||h?.success||Object.keys(e).length>0,message:h?.error??h?.message??"",payload:e,response:c}}if(n.text)return{success:!0,message:t.statusText,payload:await i.text(),response:c};throw new e({message:"response content type not supported",status:i.status,statusText:`${i.status}: ${i.statusText}`,errors:{description:i.statusText}})}#n(e,s){return s[e]??this.#a[e]}#d(e,s){this.#n("log",e)&&r(s)}global=async e=>{const{headers:s,params:t,thrower:r}=await e({headers:this.#s,params:this.#t,thrower:this.#o});this.#s=s,this.#t=t,this.#o=r}}export{c as HttpInstance};