@jsxtools/aui
Version:
A baseline UI as Mixins, Custom Elements, React Components, etc.
1 lines • 1.2 kB
JavaScript
var fetch=(resource,options=null)=>new Promise((resolve,reject)=>{const request=new Request(resource,options),xhr=new XMLHttpRequest,abort=()=>xhr.abort();xhr.open(request.method,request.url);for(let[key,value]of Object.entries(request.headers))xhr.setRequestHeader(key,value);if(xhr.withCredentials=request.credentials==="include",xhr.responseType="blob",xhr.onload=()=>{options?.signal?.removeEventListener("abort",abort),resolve(new Response(xhr.response,{status:xhr.status,statusText:xhr.statusText,headers:toHeaders(xhr.getAllResponseHeaders())}))},xhr.onerror=xhr.ontimeout=()=>reject(new Error("Request failed")),xhr.onabort=()=>reject(new Error("Request aborted")),xhr.onprogress=(event)=>options?.signal?.dispatchEvent(new ProgressEvent("progress",event)),options?.signal?.addEventListener("abort",abort),request.body)request[request.headers.get("Content-Type")?.startsWith("multipart/form-data")?"formData":"blob"]().then((init)=>xhr.send(init));else xhr.send()}),toHeaders=(responseHeaders)=>{const headers=new Headers;for(let line of responseHeaders.trim().split(/[\r\n]+/)){const[header,...value]=line.split(": ");headers.append(header,value.join(": "))}return headers};export{fetch}