GM_fetch
/takker/GM_fetch
TamperMonkeyに入れて使う
2025/8/31 v0.1.13
code:scrapbox.user.js
// ==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=>{lets,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;