jcall
Version:
Ajax library that ease sending asynchronous calls to your backend server
3 lines (2 loc) • 7.61 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jcall=t()}(this,(function(){"use strict";const e=["put","delete","post","get","patch"],t=()=>{},r="function"==typeof fetch;class n extends Error{constructor(e,t,r,n){super(e),this.name=this.constructor.name,this.status=t||null,this.statusText=r||null,this.stack=(new Error).stack,this.response=n}}function o(e){const t={};if("string"==typeof e)e.trim().split(/[\r\n]+/).forEach((e=>{const r=e.split(": "),n=r.shift(),o=r.join(": ");t[n.toLowerCase()]=o}));else if(e.entries)for(let[r,n]of e.entries())t[r]=n;return t}function s(t,i){if(!t)throw new Error("An api/url must be defined to send an jcall request!");let a=t,c="post",l=(i=i||{}).timeout||null,u=i.credentials||!1,h=i.csrf||s.csrf,p=i.useXHR||!1;if(t.indexOf(":")&&([c,a]=t.split(":")),h&&(u=!0),!0===s.preventer){let e=document.createElement("div");e.style.backgroundColor="rgba(0,0,0,.2)",e.style.position="fixed",e.style.zIndex="10000",e.style.left=e.style.top=0,e.style.width=e.style.height="100%",e.style.display="none",e.open=function(){this.style.display="inline"},e.close=function(){this.style.display="none"},s.preventer=e}let f=new AbortController,d={api:t,url:a,method:c&&-1!=e.indexOf(c)?c:"post",credentials:"boolean"==typeof u&&u,timeout:l?l<10?1e3*l:l<100?100*l:l<1e3?10*l:l:0,headers:{signal:f.signal},csrf:h};function y(e,t,r,o,s){switch(e){case 400:o(new n("400 - Bad Request: The server couldn't understand the request.",400,t,r));break;case 401:o(new n("401 - Unauthorized: Authentication is required, or the provided credentials are incorrect.",401,t,r));break;case 403:o(new n("403 - Forbidden: The server understood the request, but the user doesn't have permission to perform the action.",403,t,r));break;case 404:o(new n("404 - Not Found: The requested resource could not be found on the server.",404,t,r));break;case 500:o(new n("500 - Internal Server Error: The server encountered an unexpected condition.",500,t,r));break;case 502:o(new n("502 - Bad Gateway: The server, while acting as a gateway or proxy, received an invalid response from the upstream server.",502,t,r));break;case 503:o(new n("503 - Service Unavailable: The server is currently unavailable, often due to maintenance or overloading.",503,t,r))}}s.authorization&&(d.headers.authorize=s.authorization);let b={type:!0===p?"XHR":!0===r?"FETCH":"XHR",progress:function(){},setHeaders:function(e){let t={};return e.accept&&-1!=["application/json","application/xml","text/html","text/plain","*/*"].indexOf(e.accept)&&(t.accept=e.accept),e.cache&&("boolean"==typeof e.cache?"XHR"==this.type?t.cache=1==e.cache?"public":"no-cache":t.cache=1==e.cache?"force-cache":"no-cache":"string"==typeof e.cache&&("XHR"!=this.type||-1==["no-cache","no-store","public","private"].indexOf(e.cache)&&0!=e.cache.indexOf("max-age=")?"FETCH"==this.type&&-1!=["default","no-store","no-cache","reload","force-cache","only-if-cached"].indexOf(e.cache)?t.cache=e.cache:console.warn("You are using inproperiate values for ``cache`` attribute!"):t.cache=e.cache)),e.cookie&&(t.cookie=e.cookie),e.referer&&(t.referer=e.referer),e.origin&&(t.origin=e.origin),e.lang&&(t.lang=e.lang),e.authorize&&(t.authorize=e.authorize),"boolean"==typeof e.frame&&(t.frame=!0===e.frame?"SAMEORIGIN":"DENY"),!0===e.nosniff&&(t.nosniff=e.nosniff),e.contentType&&(t.contentType=e.contentType),d.headers=t,this},launch:function(e,t){const{headers:r}=d;let n=d.headers.contentType,i={result:null,response:null,headers:null,contentType:null};return!0!==t&&s.preventer&&s.preventer.open(),new Promise(((t,a)=>{let c=this;var l;if(e instanceof FormData||("string"==typeof e?n="text/plain":!0==("object"==typeof(l=e)&&null!==l&&"[object Object]"===Object.prototype.toString.call(l))&&(n="application/json",e=JSON.stringify(e))),"XHR"===this.type){let l=!0;"function"==typeof s.before&&(l=!1!==s.before(d,e)),!1===l&&t(!1);let u=new XMLHttpRequest;this.xhr=u,u.open(d.method||"post",d.url),u.setRequestHeader("X-Requested-With","XMLHttpRequest"),u.upload.onprogress=function(e){e.percent=e.loaded/e.total*100,"function"==typeof c.progress&&c.progress(e)},"boolean"==typeof d.credentials&&(u.withCredentials=d.credentials),u.timeout=d.timeout,u.responseType="json",d.csrf&&u.setRequestHeader("X-CSRF-TOKEN",d.csrf),n&&u.setRequestHeader("Content-Type",n),r.accept&&u.setRequestHeader("Accept",r.accept),r.cache&&u.setRequestHeader("Cache-Control",r.cache),r.cookie&&u.setRequestHeader("Cookie",r.cookie),r.referer&&u.setRequestHeader("Referer",r.referer),r.origin&&u.setRequestHeader("Origin",r.origin),r.lang&&u.setRequestHeader("Accept-Language",r.lang),r.authorize&&u.setRequestHeader("Authorization",r.authorize),r.frame&&u.setRequestHeader("X-Frame-Options",r.frame),!0===r.nosniff&&u.setRequestHeader("X-Content-Type-Options","nosniff"),u.onreadystatechange=function(e){if(4==this.readyState)if(i.headers=o(this.getAllResponseHeaders()),s.preventer&&s.preventer.close(),200==this.status)try{i.result=JSON.parse(this.response),i.response=this.response,t(i)}catch(e){a("ServerSide Error",this.responseText,this,e)}else y(this.status,this.statusText,this.response,a)},u.onerror=function(e){s.preventer&&s.preventer.close(),a("error",e,this)},u.ontimeout=function(e){s.preventer&&s.preventer.close(),a("timeout",e,this)},u.onabort=function(e){s.preventer&&s.preventer.close(),a("abort",e,this)},u.onprogress=function(e){e.percent=e.loaded/e.total*100,"function"==typeof c.progress&&c.progress(e)},u.send(e)}else{let r;0!=d.timeout&&0!=d.timeout&&(r=setTimeout((function(){s.preventer&&s.preventer.close(),c.abort()}),d.timeout)),d.body=e,d.signal=f.signal,d.credentials=!0===d.credentials?"include":"omit",n&&(d.headers["Content-Type"]=n),d.headers.authorize&&(d.headers.Authorization=d.headers.authorize),d.csrf&&(d.headers["X-CSRF-TOKEN"]=d.csrf);let l=!0;"function"==typeof s.before&&(l=!1!==s.before(d,e)),!1===l&&t(!1),d.cache=fetch(d.url,d).then((async e=>{const{ok:n,status:c,statusText:l,type:u,headers:h}=e;if(clearTimeout(r),s.preventer&&s.preventer.close(),!n)return void y(c,l,await e.json(),a);let p=h.get("Content-Type").split(";")[0];return i.headers=o(h),i.contentType=p,i.response=e,p.includes("application/json")?(i.result=await e.json(),t(i)):p.includes("text/html")||p.includes("text/plain")?(i.result=await e.text(),t(i)):p.includes("image")||p.includes("application/pdf")?e.blob():e.arrayBuffer()})).then((async e=>{if(e instanceof Blob){const e=new FileReader;e.readAsDataURL(blob),e.onloadend=()=>{t(e.result)}}})).catch((e=>{if(s.preventer&&s.preventer.close(),clearTimeout(r),"AbortError"===e.name)return a("timeout");a("error",e)}))}})).finally((e=>{s.after&&s.after(e)}))},abort:function(e){"XHR"==this.request.type?this.xhr.abort():f.abort(e)}};return b=Object.seal(b),b}return s.csrf=null,s.authorization=null,s.after=t,s.before=t,s.preventer=null,s.jcallify=function(e,r){let n=null,o=null,i=t,a=t,c={api:function(e){return n=e,this},data:function(e){return o=e,this},success:function(e){return a=e,this},error:function(e){return i=e,this}};return e instanceof HTMLFormElement&&e.addEventListener("submit",(function(t){t.preventDefault();let r=e.getAttribute("method")||"post",c=this.getAttribute("action");if(null!=n&&(c=n(this,c)),!c)throw new Error("Bad setup!\nplease include the action attribute in the form");let l=new FormData(this);null!=o&&(l=o(this,l)),s(c,{method:r}).launch(l).then((e=>{a(e)})).catch((e=>i(e)))})),c},window.jcall=s,s}));
//# sourceMappingURL=jcall.umd.min.js.map