From 72bed67d8152a99ca3b28e2923278aad54e99971 Mon Sep 17 00:00:00 2001 From: coomdev Date: Sat, 25 Dec 2021 02:50:40 +0100 Subject: [PATCH] inline gm_fetch to 'fix' it --- build.js | 1 - main.user.js | 48 +++++++++++++++++++++++++++++++++++++++++++++++- src/main.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/build.js b/build.js index b6675f1..beed1db 100644 --- a/build.js +++ b/build.js @@ -11,7 +11,6 @@ const extheader = `// ==UserScript== // @match https://boards.4channel.org/g/thread/* // @icon https://www.google.com/s2/favicons?domain=4channel.org // @grant GM_xmlhttpRequest -// @require https://greasyfork.org/scripts/421384-gm-fetch/code/GM_fetch.js?version=898562 // @run-at document-start // @connect 4chan.org // @connect 4channel.org diff --git a/main.user.js b/main.user.js index 5f5bc83..57a112b 100644 --- a/main.user.js +++ b/main.user.js @@ -7,7 +7,6 @@ // @match https://boards.4channel.org/g/thread/* // @icon https://www.google.com/s2/favicons?domain=4channel.org // @grant GM_xmlhttpRequest -// @require https://greasyfork.org/scripts/421384-gm-fetch/code/GM_fetch.js?version=898562 // @run-at document-start // @connect 4chan.org // @connect 4channel.org @@ -7004,6 +7003,53 @@ var IEND = import_buffer2.Buffer.from("IEND"); var tEXt = import_buffer2.Buffer.from("tEXt"); var CUM0 = import_buffer2.Buffer.from("CUM\x000"); + var xmlhttprequest = GM ? GM.xmlHttpRequest : GM_xmlhttpRequest; + function GM_fetch(...[url, opt]) { + function blobTo(to, blob) { + if (to == "arrayBuffer" && blob.arrayBuffer) + return blob.arrayBuffer(); + return new Promise((resolve, reject) => { + var fileReader = new FileReader(); + fileReader.onload = function(event) { + if (!event) + return; + if (to == "base64") + resolve(event.target.result); + else + resolve(event.target.result); + }; + if (to == "arrayBuffer") + fileReader.readAsArrayBuffer(blob); + else if (to == "base64") + fileReader.readAsDataURL(blob); + else if (to == "text") + fileReader.readAsText(blob, "utf-8"); + else + reject("unknown to"); + }); + } + return new Promise((resolve, reject) => { + let gmopt = { + url: url.toString(), + data: opt?.body?.toString(), + responseType: "blob", + method: "GET", + onload: (resp) => { + let blob = resp.response; + const ref = resp; + ref.blob = () => Promise.resolve(blob); + ref.arrayBuffer = () => blobTo("arrayBuffer", blob); + ref.text = () => blobTo("text", blob); + ref.json = async () => JSON.parse(await blobTo("text", blob)); + resolve(resp); + }, + ontimeout: () => reject("fetch timeout"), + onerror: () => reject("fetch error"), + onabort: () => reject("fetch abort") + }; + xmlhttprequest(gmopt); + }); + } var extractEmbedded = async (reader) => { let magic = false; let sneed = new PNGDecoder(reader); diff --git a/src/main.ts b/src/main.ts index b2e593c..170385c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,6 +9,53 @@ const IEND = Buffer.from("IEND"); const tEXt = Buffer.from("tEXt"); const CUM0 = Buffer.from("CUM\0" + "0"); +type Awaited = T extends PromiseLike ? U : T + +const xmlhttprequest = GM ? GM.xmlHttpRequest : GM_xmlhttpRequest; + +function GM_fetch(...[url, opt]: Parameters) { + function blobTo(to: string, blob: Blob) { + if (to == "arrayBuffer" && blob.arrayBuffer) + return blob.arrayBuffer() + return new Promise((resolve, reject) => { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + if (!event) return; + if (to == "base64") + resolve(event.target!.result); + else + resolve(event.target!.result) + } + if (to == "arrayBuffer") fileReader.readAsArrayBuffer(blob) + else if (to == "base64") fileReader.readAsDataURL(blob) // "data:*/*;base64,......" + else if (to == "text") fileReader.readAsText(blob, "utf-8") + else reject("unknown to") + }) + } + return new Promise>((resolve, reject) => { + // https://www.tampermonkey.net/documentation.php?ext=dhdg#GM_xmlhttpRequest + let gmopt: Tampermonkey.Request = { + url: url.toString(), + data: opt?.body?.toString(), + responseType: "blob", + method: "GET", + onload: (resp) => { + let blob = resp.response as Blob; + const ref = resp as any as Awaited>; + ref.blob = () => Promise.resolve(blob) + ref.arrayBuffer = () => blobTo("arrayBuffer", blob) as Promise + ref.text = () => blobTo("text", blob) as Promise + ref.json = async () => JSON.parse(await (blobTo("text", blob) as Promise)) + resolve(resp as any) + }, + ontimeout: () => reject("fetch timeout"), + onerror: () => reject("fetch error"), + onabort: () => reject("fetch abort") + } + xmlhttprequest(gmopt) + }) +} + let extractEmbedded = async (reader: ReadableStreamDefaultReader) => { let magic = false;