ui/utilities/HTTP.min.js

2 lines
2.3 KiB
JavaScript

const HTTP={get:({url:e,...t})=>HTTP.request({url:e,method:"GET",...t}),post:({url:e,data:t,...r})=>HTTP.request({url:e,method:"POST",data:t,...r}),put:({url:e,data:t,...r})=>HTTP.request({url:e,method:"PUT",data:t,...r}),delete:({url:e,...t})=>HTTP.request({url:e,method:"DELETE",...t}),head:({url:e,...t})=>HTTP.request({url:e,method:"HEAD",...t}),request:async({url:e,method:t="POST",data:r,headers:a={},responseType:s,timeout:o=1e4})=>{const n={method:t=t.toUpperCase(),signal:AbortSignal.timeout?.(o)};if(void 0!==r&&"GET"!==t&&"HEAD"!==t){if(r instanceof HTMLFormElement&&(r=new FormData(r)),r&&"object"==typeof r&&!(r instanceof FormData)&&!(r instanceof ArrayBuffer||ArrayBuffer.isView(r))&&Object.values(r).some(e=>e instanceof File||e instanceof Blob||e instanceof FileList||Array.isArray(e)&&e.some(e=>e instanceof File||e instanceof Blob))){const e=new FormData;for(const[t,a]of Object.entries(r))a instanceof FileList||Array.isArray(a)?Array.from(a).forEach(r=>e.append(t,r)):null!=a&&e.append(t,a);r=e}r instanceof FormData?delete a["Content-Type"]:"string"==typeof r||r instanceof ArrayBuffer||ArrayBuffer.isView(r)||(r=JSON.stringify(r),a["Content-Type"]||(a["Content-Type"]="application/json")),n.body=r}for(const e of HTTP.keepHeaders)HTTP._keepHeadersCache[e]&&!a[e]&&(a[e]=HTTP._keepHeadersCache[e]);Object.keys(a).length&&(n.headers=a);const i={error:null,ok:null,status:0,headers:{},responseType:"",result:null};try{const t=await fetch(e,n);Object.assign(i,{ok:t.ok,status:t.status,headers:Object.fromEntries(t.headers.entries())});for(const e of HTTP.keepHeaders){const r=t.headers.get(e);if(r){HTTP._keepHeadersCache[e]=r;try{localStorage.setItem("_http_keep_"+e,r)}catch(e){}}}if(!s){const e=t.headers.get("Content-Type")||"";s=e.includes("application/json")?"json":/image|video|audio|pdf|zip|octet-stream/.test(e)?"binary":"text",i.responseType=s}!1===i.ok&&(i.error=(i.statusText||"HTTP "+i.status+" error")+" for "+e),i.result="json"===s?await t.json():"binary"===s?await t.arrayBuffer():await t.text()}catch(e){Object.assign(i,{error:e.message||String(e),ok:!1})}return i},keepHeaders:["Session-Id","Device-Id"],_keepHeadersCache:{}};for(const e of HTTP.keepHeaders)try{const t=localStorage.getItem("_http_keep_"+e);null!==t&&(HTTP._keepHeadersCache[e]=t)}catch(e){}globalThis.HTTP=HTTP;