voca-http
Version:
A lightweight and flexible HTTP client for the browser and node.js
3 lines (2 loc) • 4.4 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).vocaHttp={})}(this,(function(e){"use strict";function t(e,t,o,r){return new(o||(o=Promise))((function(n,s){function i(e){try{a(r.next(e))}catch(e){s(e)}}function c(e){try{a(r.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(i,c)}a((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const o=(e,{baseUrl:o="",onError:r=e=>Promise.reject(e),onRequest:n,onRequestError:s=r,onResponse:i=e=>Promise.resolve(e),onResponseError:a=r,interceptors:u={request:[],response:[]},retryCount:l=3,timeout:p=5e3}={})=>{const d=n||((e,t,o,r)=>{let n;const s=Object.assign({"Content-Type":"application/json"},r||{});return o instanceof FormData?(n=o,delete s["Content-Type"]):void 0!==o&&(n=JSON.stringify(o)),{url:t,method:e,body:n,headers:s}}),h=(...r)=>{let n=0;const c=new AbortController,h=setTimeout((()=>c.abort()),p),f=o=>e(o.url,Object.assign(Object.assign({},o),{signal:c.signal})).then((e=>(u.response.forEach((t=>{const o=t(e);o&&(e=o)})),i(e)))).catch((e=>t(void 0,void 0,void 0,(function*(){return n<l&&"AbortError"!==e.name?(n+=1,console.log(`Retrying... Attempt ${n}`),f(o)):a(e)}))));try{const[e,t,n,s]=r;let i=d(e,t,n,s);u.request.forEach((e=>{const t=e(i);t&&(i=t)}));return!(i.url.startsWith("http://")||i.url.startsWith("https://"))&&o&&(i.url=`${o}${i.url}`),f(i).finally((()=>clearTimeout(h)))}catch(e){return s(e)}},f=e=>(t,o,r)=>h(e,t,o,r),g=h;var T;return g.get=(T="GET",(e,t)=>h(T,e,void 0,t)),g.post=f("POST"),g.put=f("PUT"),g.patch=f("PATCH"),g.delete=f("DELETE"),g.uploadFile=(e,t,r={},n)=>{const s=e.startsWith("http://")||e.startsWith("https://")?e:`${o}${e}`;return Promise.resolve().then((function(){return c})).then((e=>e.uploadFile(s,t,r,n)))},g};class r{constructor(){this.interceptors={request:[],response:[]},this.timeout=5e3,this.retryCount=3}addRequestInterceptor(e){this.interceptors.request.push(e)}addResponseInterceptor(e){this.interceptors.response.push(e)}setTimeout(e){this.timeout=e}setRetryCount(e){this.retryCount=e}getConfig(){return{interceptors:this.interceptors,timeout:this.timeout,retryCount:this.retryCount}}}const n=(e,t)=>{if(e.lengthComputable){t(e.loaded/e.total*100)}},s=(e,t,o={},r)=>{const n=new FormData;return n.append("file",t),new Promise(((t,s)=>{const i=new XMLHttpRequest;r&&i.upload.addEventListener("progress",(e=>{if(e.lengthComputable){const t=e.loaded/e.total*100;r(t)}})),i.open("POST",e),Object.entries(o).forEach((([e,t])=>{i.setRequestHeader(e,t)})),i.onload=()=>{if(i.status>=200&&i.status<300)try{const e=JSON.parse(i.responseText);t(e)}catch(e){t(i.responseText)}else s(new Error(`HTTP Error: ${i.status}`))},i.onerror=()=>{s(new Error("Network Error"))},i.send(n)}))},i=(e,t={},o)=>fetch(e,{method:"GET",headers:t}).then((e=>{if(!e.ok)throw new Error(`HTTP Error: ${e.status}`);const t=e.headers.get("Content-Length"),r=t?parseInt(t,10):0;let n=0;if(o&&r&&e.body){const t=e.body;return new Response(new ReadableStream({start(e){const s=t.getReader();!function t(){s.read().then((({done:s,value:i})=>{s?e.close():(n+=i.length,o&&o(n/r*100),e.enqueue(i),t())})).catch((t=>{console.error("Download stream error:",t),e.error(t)}))}()}}))}return e})).then((e=>e.text())).catch((e=>{throw console.error("Download error:",e),e}));var c=Object.freeze({__proto__:null,downloadFile:i,trackProgress:n,uploadFile:s});const a={create:o,get:(e,t)=>{const n=(new r).getConfig();return o(fetch,n)("GET",e,void 0,t)},post:(e,t,n)=>{const s=(new r).getConfig();return o(fetch,s)("POST",e,t,n)},patch:(e,t,n)=>{const s=(new r).getConfig();return o(fetch,s)("PATCH",e,t,n)},put:(e,t,n)=>{const s=(new r).getConfig();return o(fetch,s)("PUT",e,t,n)},delete:(e,t,n)=>{const s=(new r).getConfig();return o(fetch,s)("DELETE",e,t,n)},config:new r,trackProgress:n,uploadFile:s,downloadFile:i};e.HttpBase=class{constructor(){this.httpMethods=["GET","POST","PUT","PATCH","DELETE"]}getEnv(){return"undefined"!=typeof window?window:"undefined"!=typeof global?global:globalThis}getHttpMethods(){return this.httpMethods}},e.VocaRequestConfig=r,e.downloadFile=i,e.trackProgress=n,e.uploadFile=s,e.voca=a,e.vocaCreate=o}));
//# sourceMappingURL=voca-http.umd.min.js.map