UNPKG

@sec-ant/gm-fetch

Version:

A fetch API for GM_xmlhttpRequest / GM.xmlHttpRequest

2 lines (1 loc) 2.27 kB
var gmFetch=function(){"use strict";var p=typeof document<"u"?document.currentScript:null,b="__monkeyWindow-"+(()=>{try{return new URL(p&&p.tagName.toUpperCase()==="SCRIPT"&&p.src||new URL("index.iife.js",document.baseURI).href).origin}catch{return location.origin}})(),w=document[b]??window,g=w.GM,q=w.GM_xmlhttpRequest;function v(l){var e;const t=new Headers,a=l.replace(/\r?\n[\t ]+/g," ");for(const d of a.split(/\r?\n/)){const c=d.split(":"),n=(e=c.shift())==null?void 0:e.trim();if(n){const r=c.join(":").trim();try{t.append(n,r)}catch(i){console.warn(`Response ${i.message}`)}}}return t}return async(l,t)=>{const a=q||g.xmlHttpRequest;if(typeof a!="function")throw new DOMException("GM_xmlhttpRequest or GM.xmlHttpRequest is not granted.","NotFoundError");const e=new Request(l,t);if(e.signal.aborted)throw new DOMException("Network request aborted.","AbortError");const d=await e.blob(),c=Object.fromEntries(e.headers);return new Headers(t==null?void 0:t.headers).forEach((n,r)=>{c[r]=n}),new Promise((n,r)=>{let i=!1;const M=new Promise(o=>{const{abort:f}=a({method:e.method.toUpperCase(),url:e.url||location.href,headers:c,data:d.size?d:void 0,redirect:e.redirect,binary:!0,nocache:e.cache==="no-store",revalidate:e.cache==="reload",timeout:3e5,responseType:a.RESPONSE_TYPE_STREAM??"blob",overrideMimeType:e.headers.get("Content-Type")??void 0,anonymous:e.credentials==="omit",onload:({response:s})=>{if(i){o(null);return}o(s)},async onreadystatechange({readyState:s,responseHeaders:m,status:k,statusText:H,finalUrl:E,response:R}){if(s===XMLHttpRequest.DONE)e.signal.removeEventListener("abort",f);else if(s!==XMLHttpRequest.HEADERS_RECEIVED)return;if(i){o(null);return}const u=v(m),y=e.url!==E,h=new Response(R instanceof ReadableStream?R:await M,{headers:u,status:k,statusText:H});Object.defineProperties(h,{url:{value:E},type:{value:"basic"},...h.redirected!==y?{redirected:{value:y}}:{},...u.has("set-cookie")||u.has("set-cookie2")?{headers:{value:u}}:{}}),n(h),i=!0},onerror:({statusText:s,error:m})=>{r(new TypeError(s||m||"Network request failed.")),o(null)},ontimeout(){r(new TypeError("Network request timeout.")),o(null)},onabort(){r(new DOMException("Network request aborted.","AbortError")),o(null)}});e.signal.addEventListener("abort",f)})})}}();