UNPKG

@seriouslag/httpclient

Version:
2 lines (1 loc) 4.12 kB
"use strict";class t extends Error{isHttpClientError=!0;constructor(t,e){super(t,e)}}class e extends t{constructor(t,e){super(t,e)}}class s{config;constructor(t){this.config=t}async do(){try{const t=await fetch(this.config.url,{method:this.config.method,headers:this.config.headers,body:this.config.data?JSON.stringify(this.config.data):void 0,signal:this.config.cancelToken?.signal}),e={};return t.headers.forEach(((t,s)=>{e[s]=t})),{headers:e,data:t.body?await t.json():void 0,status:t.status,statusText:t.statusText}}catch(t){if(t instanceof DOMException&&"AbortError"===t.name)throw new e(t.message,{cause:t});throw t}}}class r{globalHeaders=new Map;buildRequest(t){return new s(t)}addGlobalApiHeader(t){this.globalHeaders.set(t.name,t.value)}addGlobalApiHeaders(t){t.forEach((t=>this.addGlobalApiHeader(t)))}}function a(t){return t>=200&&t<300}class o{async request(t){const e=await t.do();return this.checkResponseStatus(e),e}checkResponseStatus(t){if(a(t.status))return t;throw t}}function i(t){return new Promise((e=>setTimeout(e,t)))}class n{options;TOO_MANY_REQUESTS_STATUS=429;delayFirstRequest;maxRetryCount;baseDelay;factor;maxDelay;constructor(t={}){this.options=t;const{delayFirstRequest:e,maxRetryCount:s,baseDelay:r,factor:a,maxDelay:o}=this.options;this.delayFirstRequest=e??!1,this.maxRetryCount=s??5,this.baseDelay=r??100,this.factor=a??2,this.maxDelay=o??-1}async request(t){let e,s=0,r=!1,o=!1,n=!1,u=this.baseDelay;do{this.getShouldDelay(s)&&await i(u),s+=1,e=await t.do(),r=a(e.status),o=e.status===this.TOO_MANY_REQUESTS_STATUS,n=this.getIsAtRetryMax(s),u*=this.factor*s,this.maxDelay>-1&&u>this.maxDelay&&(u=this.maxDelay)}while(!r&&!o&&!n);return e}getIsAtRetryMax(t){return 0!==this.maxRetryCount&&t>=this.maxRetryCount}getShouldDelay(t){return 0!==t||this.delayFirstRequest}}class u extends t{constructor(t,e){super(t,e)}}const h="Url must be a string",c="Aborted by token";exports.ABORT_MESSAGE=c,exports.AbortError=e,exports.DefaultHttpRequestStrategy=o,exports.ERROR_URL=h,exports.ExponentialBackoffRequestStrategy=n,exports.HttpClient=class{httpClientAdaptor;logger;httpRequestStrategy;baseUrl;constructor(t=new r,e={}){this.httpClientAdaptor=t;const{httpRequestStrategy:s,logger:a,baseUrl:i=""}=e;this.httpRequestStrategy=s??new o,this.logger=a,this.baseUrl=i}setLogger(t){this.logger=t}get(t,e={},s){return this.dataRequest(t,"get",e,s)}post(t,e={},s){return this.dataRequest(t,"post",e,s)}put(t,e={},s){return this.dataRequest(t,"put",e,s)}delete(t,e={},s){return this.dataRequest(t,"delete",e,s)}patch(t,e={},s){return this.dataRequest(t,"patch",e,s)}async dataRequest(t,e,s={},r){return(await this.request(t,e,s,r)).data}async request(t,s,r={},a){if(a?.signal.aborted)throw new e(c);try{return await this.doRequest(t,s,r,a)}catch(e){let r=`The ${s} request to ${t} failed`;throw e&&"object"==typeof e&&"status"in e&&(r+=` with status ${e.status}`),a?.abort(r),e}}async doRequest(t,e,s={},r){if("string"!=typeof t)throw new Error(h);const{headers:a,data:o,params:i,responseEncoding:n,responseType:u,httpRequestStrategy:c,noGlobal:l}=s,d=c??this.httpRequestStrategy,p={url:this.baseUrl+t,method:e,headers:a,data:o,params:i,responseEncoding:n,responseType:u,cancelToken:r,noGlobal:l};try{const s=this.httpClientAdaptor.buildRequest(p);this.logger?.debug(`HTTP - method: ${e}; url: ${t}`);const r=await d.request(s);return this.logger?.debug(`HTTP ${r.status} - method: ${e}; url: ${t}`),r}catch(s){throw this.logger?.error(`HTTP error - method: ${e}; url: ${t}`,s),s}}},exports.HttpError=t,exports.MaxRetryHttpRequestStrategy=class extends n{constructor(t=5){super({delayFirstRequest:!1,maxRetryCount:t,baseDelay:0,factor:1,maxDelay:0})}async request(t){return await super.request(t)}},exports.TimeoutHttpRequestStrategy=class extends o{timeout;constructor(t=1e4){super(),this.timeout=t}request(t){return new Promise(((e,s)=>{const r=setTimeout((()=>{s(new u("Request timed out"))}),this.timeout);super.request(t).then((t=>e(t))).catch((t=>s(t))).finally((()=>clearTimeout(r)))}))}},exports.getIsSuccessfulHttpStatus=a,exports.isHttpError=function(t){return"isHttpClientError"in t};