From 0771bb41bab021bcbe736d785d1e60298105c06e Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Tue, 7 Oct 2025 12:08:01 -0500 Subject: [PATCH] redo fetching messages as progressive loading --- src/webpage/channel.ts | 176 +++++++++++++++++----------- src/webpage/service.ts | 3 + src/webpage/utils/progessiveLoad.ts | 5 + 3 files changed, 116 insertions(+), 68 deletions(-) diff --git a/src/webpage/channel.ts b/src/webpage/channel.ts index 9e45b70..78664e2 100644 --- a/src/webpage/channel.ts +++ b/src/webpage/channel.ts @@ -30,6 +30,7 @@ import {File} from "./file.js"; import {Sticker} from "./sticker.js"; import {CustomHTMLDivElement} from "./index.js"; import {Direct} from "./direct.js"; +import {ProgessiveDecodeJSON} from "./utils/progessiveLoad.js"; declare global { interface NotificationOptions { @@ -1907,100 +1908,139 @@ class Channel extends SnowFlake { } this.children = build; } + afterProm?: Promise; + afterProms = new Map void>(); async grabAfter(id: string) { if (id === this.lastmessage?.id) { return; } + if (this.afterProm) return this.afterProm; let tempy: string | undefined = id; while (tempy && tempy.includes("fake")) { tempy = this.idToNext.get(tempy); } if (!tempy) return; id = tempy; - await fetch(this.info.api + "/channels/" + this.id + "/messages?limit=100&after=" + id, { - headers: this.headers, - }) - .then((j) => { - return j.json(); - }) - .then((response) => { - if (response.length === 0) { - this.idToNext.set(id, undefined); + this.afterProm = new Promise(async (res) => { + const messages = await ProgessiveDecodeJSON( + this.info.api + "/channels/" + this.id + "/messages?limit=100&after=" + id, + { + headers: this.headers, + }, + ); + let i = 0; + let previd: string = id; + for await (const obj of messages) { + let messager: Message; + const response = await obj.getWhole(); + let willbreak = false; + if (this.messages.has(response.id)) { + messager = this.messages.get(response.id) as Message; + willbreak = true; + } else { + messager = new Message(response, this); } - let previd: string = id; - for (const i in response) { - let messager: Message; - let willbreak = false; - if (this.messages.has(response[i].id)) { - messager = this.messages.get(response[i].id) as Message; - willbreak = true; - } else { - messager = new Message(response[i], this); - } - this.idToPrev.set(messager.id, previd); - this.idToNext.set(previd, messager.id); - previd = messager.id; - if (willbreak) { - break; - } + this.idToPrev.set(messager.id, previd); + this.idToNext.set(previd, messager.id); + + const res = this.afterProms.get(previd); + if (res) { + res(); + this.beforeProms.delete(previd); } - //out.buildmessages(); - }); + + previd = messager.id; + if (willbreak) { + break; + } + i++; + } + if (i === 0) { + this.idToNext.set(id, undefined); + } + res(); + this.afterProm = undefined; + if (this.afterProms.size !== 0) { + const [id] = this.afterProms.entries().next().value as [string, () => void]; + this.grabAfter(id); + } + }); + return new Promise((res) => this.afterProms.set(id, res)); } async getArround(id: string) { this.grabBefore(id); this.grabAfter(id); } topid!: string; + beforeProm?: Promise; + beforeProms = new Map void>(); async grabBefore(id: string) { + if (this.beforeProm) return this.beforeProm; if (this.topid && id === this.topid) { return; } - let tempy: string | undefined = id; - while (tempy && tempy.includes("fake")) { - tempy = this.idToPrev.get(tempy); - } - if (!tempy) return; - id = tempy; - - await fetch(this.info.api + "/channels/" + this.id + "/messages?before=" + id + "&limit=100", { - headers: this.headers, - }) - .then((j) => { - return j.json(); - }) - .then((response: messagejson[]) => { - if (response.length < 100) { - this.allthewayup = true; - if (response.length === 0) { - this.topid = id; - this.idToPrev.set(id, undefined); - } + this.beforeProm = new Promise(async (res) => { + let tempy: string | undefined = id; + while (tempy && tempy.includes("fake")) { + tempy = this.idToPrev.get(tempy); + } + if (!tempy) { + res(); + return; + } + id = tempy; + const messages = await ProgessiveDecodeJSON( + this.info.api + "/channels/" + this.id + "/messages?before=" + id + "&limit=100", + { + headers: this.headers, + }, + ); + let previd = id; + let i = 0; + for await (const messageProm of messages) { + const response = await messageProm.getWhole(); + let messager: Message; + if (this.messages.has(response.id)) { + console.log("flaky"); + messager = this.messages.get(response.id) as Message; + } else { + messager = new Message(response, this); } - let previd = id; - for (const i in response) { - let messager: Message; - let willbreak = false; - if (this.messages.has(response[i].id)) { - console.log("flaky"); - messager = this.messages.get(response[i].id) as Message; - willbreak = true; - } else { - messager = new Message(response[i], this); - } - this.idToNext.set(messager.id, previd); - this.idToPrev.set(previd, messager.id); - previd = messager.id; + this.idToNext.set(messager.id, previd); + this.idToPrev.set(previd, messager.id); - if (Number(i) === response.length - 1 && response.length < 100) { - this.topid = previd; - } - if (willbreak) { - break; - } + const res = this.beforeProms.get(previd); + if (res) { + res(); + this.beforeProms.delete(previd); } - }); + + previd = messager.id; + + if (messages.done && i < 99) { + console.error(i, "find me :3"); + this.topid = previd; + } + + i++; + } + if (i < 100) { + console.error(i, "find me :3"); + this.allthewayup = true; + if (i === 0) { + this.topid = id; + this.idToPrev.set(id, undefined); + } + } + this.beforeProm = undefined; + res(); + if (this.beforeProms.size !== 0) { + const [id] = this.beforeProms.entries().next().value as [string, () => void]; + this.grabBefore(id); + } + }); + return new Promise((res) => this.beforeProms.set(id, res)); } async buildmessages(id: string | void) { this.infinitefocus = false; diff --git a/src/webpage/service.ts b/src/webpage/service.ts index 58c4020..83fd3d8 100644 --- a/src/webpage/service.ts +++ b/src/webpage/service.ts @@ -123,6 +123,9 @@ self.addEventListener("fetch", (e) => { if (event.request.method === "POST") { return; } + if (new URL(event.request.url).pathname.startsWith("/api/")) { + return; + } try { event.respondWith(getfile(event)); } catch (e) { diff --git a/src/webpage/utils/progessiveLoad.ts b/src/webpage/utils/progessiveLoad.ts index 410d520..4dcdd92 100644 --- a/src/webpage/utils/progessiveLoad.ts +++ b/src/webpage/utils/progessiveLoad.ts @@ -191,6 +191,11 @@ class ArrayProgressive> { return ret; } + async *[Symbol.asyncIterator]() { + while (!this.done) { + yield await this.getNext(); + } + } /** * this only gets what's left, not everything */