// ==UserScript== // @name GM_fetch // @namespace https://scrapbox.io // @version 0.1.13 // @downloadURL https://scrapbox.io/api/code/takker/GM_fetch/scrapbox.user.js // @updateURL https://scrapbox.io/api/code/takker/GM_fetch/scrapbox.user.js // @description An implementation of the fetch API which leverages `GM_xmlhttpRequest` // @author takker // @homepage https://scrapbox.io/takker/GM_fetch // @match https://scrapbox.io/* // @connect * // @grant GM_xmlhttpRequest // @license MIT // @copyright Copyright (c) 2023 takker // ==/UserScript== var u=n=>new Headers(n.replace(/\r?\n[\t ]+/g," ").split(/\r\n|\r|\n/).flatMap(e=>{let[s,o]=e.split(":").map(t=>t.trim());return s?[[s,o]]:[]})),l=(n,e)=>new Promise((s,o)=>{let t=Object.fromEntries(new Headers(n instanceof Request?n.headers:e?.headers).entries());n instanceof Request&&(t.Referer=n.referrer,t["Referrer-Policy"]=n.referrerPolicy),e?.referrer&&(t.Referer=e.referrer),e?.referrerPolicy&&(t["Referrer-Policy"]=e.referrerPolicy);let r=new Request(n,e);if(r.signal?.aborted){o(new DOMException("Aborted","AbortError"));return}let{abort:a}=GM_xmlhttpRequest({method:r.method,url:r.url,headers:t,...e?.body?{data:e.body}:{},anonymous:r.credentials==="omit",responseType:"stream",fetch:!0,onerror:()=>{o(new TypeError("Network request failed"))},ontimeout:()=>{o(new TypeError("Network request timeout"))},onabort:()=>{o(new DOMException("Aborted","AbortError"))},onreadystatechange:i=>{switch(i.readyState){case 2:{let d=new Response(i.response,{status:i.status,statusText:i.statusText,headers:u(i.responseHeaders)});Object.defineProperty(d,"url",{value:i.finalUrl}),s(d);break}case 4:r.signal?.removeEventListener?.("abort",a);break;default:break}}});r.signal?.addEventListener?.("abort",a)});unsafeWindow.GM_fetch=l;