diff --git a/src/background/messages/responseRSS.ts b/src/background/messages/responseRSS.ts index 025ef79..6b797a0 100644 --- a/src/background/messages/responseRSS.ts +++ b/src/background/messages/responseRSS.ts @@ -3,7 +3,7 @@ import type { PlasmoMessaging } from "@plasmohq/messaging" import { setRSS } from "~/background/rss" const handler: PlasmoMessaging.MessageHandler = async (req, res) => { - setRSS(req.body.tabId, req.body.rss) + setRSS(req.body.tabId || req.sender.tab.id, req.body.rss) res.send("") } diff --git a/src/background/rss.ts b/src/background/rss.ts index 774d625..efd2270 100644 --- a/src/background/rss.ts +++ b/src/background/rss.ts @@ -6,7 +6,7 @@ import { Storage } from "@plasmohq/storage" import { setupOffscreenDocument } from "~/lib/offscreen" import report from "~/lib/report" import type { RSSData } from "~/lib/types" -import { getRSS as sandboxGetRSS } from "~/sandboxes" +import { getRSSHub as sandboxGetRSSHub } from "~/sandboxes" import { setBadge } from "./badge" @@ -16,9 +16,9 @@ const storage = new Storage({ const savedRSS: { [tabId: number]: { - pageRSS: RSSData[] pageRSSHub: RSSData[] websiteRSSHub: RSSData[] + pageRSS: RSSData[] } } = {} @@ -43,7 +43,7 @@ export const getRSS = async (tabId, url) => { chrome.runtime.sendMessage({ target: "offscreen", data: { - name: "requestRSS", + name: "requestRSSHub", body: { tabId, html, @@ -52,16 +52,20 @@ export const getRSS = async (tabId, url) => { }, }, }) - - await new Promise((resolve) => setTimeout(resolve, 100)) } else { - sandboxGetRSS({ + const rsshub = sandboxGetRSSHub({ html, url, rules: await storage.get("rules"), - callback: (rss) => setRSS(tabId, rss), }) + setRSS(tabId, rsshub) } + + const pageRSS = await sendToContentScript({ + name: "requestPageRSS", + tabId, + }) + setRSS(tabId, pageRSS) }) } @@ -69,63 +73,44 @@ export const getCachedRSS = (tabId) => { return savedRSS[tabId] } -function applyRSS( +export const setRSS = async ( tabId, data: { pageRSS: RSSData[] + } | { pageRSSHub: RSSData[] websiteRSSHub: RSSData[] }, -) { - savedRSS[tabId] = data +) => { + if (!data) { + return + } + if (!savedRSS[tabId]) { + savedRSS[tabId] = { + pageRSS: [], + pageRSSHub: [], + websiteRSSHub: [], + } + } + if ("pageRSS" in data) { + savedRSS[tabId].pageRSS = data.pageRSS + } else { + savedRSS[tabId].pageRSSHub = data.pageRSSHub + savedRSS[tabId].websiteRSSHub = data.websiteRSSHub + } let text = "" - if (data.pageRSS.length || data.pageRSSHub.length) { + if (savedRSS[tabId].pageRSS.length || savedRSS[tabId].pageRSSHub.length) { text = - data.pageRSS.filter((rss) => !rss.uncertain).length + - data.pageRSSHub.length + + savedRSS[tabId].pageRSS.length + + savedRSS[tabId].pageRSSHub.length + "" - } else if (data.websiteRSSHub.length) { + } else if (savedRSS[tabId].websiteRSSHub.length) { text = " " } setBadge(text, tabId) } -export const setRSS = async ( - tabId, - data: { - pageRSS: RSSData[] - pageRSSHub: RSSData[] - websiteRSSHub: RSSData[] - }, -) => { - applyRSS(tabId, data) - - const res = await sendToContentScript({ - name: "parseRSS", - tabId, - body: data.pageRSS.filter((rss) => rss.uncertain).map((rss) => rss.url), - }) - data.pageRSS = data.pageRSS.filter((rss) => { - if (rss.uncertain) { - const parsed = res.find((r) => r.url === rss.url) - if (parsed && parsed.title !== null) { - if (parsed.title) { - rss.title = parsed.title - } - rss.uncertain = false - return true - } else { - return false - } - } else { - return true - } - }) - - applyRSS(tabId, data) -} - export const deleteCachedRSS = (tabId) => { delete savedRSS[tabId] } diff --git a/src/contents/index.ts b/src/contents/index.ts index 958e062..1133c4f 100644 --- a/src/contents/index.ts +++ b/src/contents/index.ts @@ -1,32 +1,16 @@ import { sendToBackground } from "@plasmohq/messaging" -import { fetchRSSContent, parseRSS } from "~/lib/utils" +import { getPageRSS } from "~/lib/rss" sendToBackground({ name: "contentReady", }) -async function getRSS(url) { - let title = null - try { - const content = await fetchRSSContent(url) - const result = parseRSS(content) - if (result) { - title = result.title || "" - } - } catch (error) {} - - return { - url, - title, - } -} - chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg.name === "requestHTML") { sendResponse(document.documentElement.outerHTML) - } else if (msg.name === "parseRSS") { - Promise.all(msg.body?.map(getRSS)).then((data) => { + } else if (msg.name === "requestPageRSS") { + getPageRSS().then((data) => { sendResponse(data) }) return true diff --git a/src/lib/rss.ts b/src/lib/rss.ts index 7d3719d..a8c4292 100644 --- a/src/lib/rss.ts +++ b/src/lib/rss.ts @@ -1,11 +1,7 @@ import type { RSSData } from "./types" import { fetchRSSContent, parseRSS } from "./utils" -export async function getPageRSS(data: { html: string; url: string }) { - const parser = new DOMParser() - const document = parser.parseFromString(data.html, "text/html") - const location = new URL(data.url) - +export async function getPageRSS() { const defaultTitle = document.querySelector("title") && document.querySelector("title").innerHTML && @@ -22,7 +18,7 @@ export async function getPageRSS(data: { html: string; url: string }) { function handleUrl(url) { return new URL( - url.replace(/^(feed:\/\/)/, "https://").replace(/^(feed:)/, ""), + url.replace(/^(feed:\/\/)/, "https://").replace(/^(feed:)/, "").replace(/^(http:\/\/)/, "https://"), location.href, ).toString() } @@ -61,7 +57,9 @@ export async function getPageRSS(data: { html: string; url: string }) { }) // skip the following check if this page is an RSS feed - return pageRSS + return { + pageRSS, + } } } @@ -158,23 +156,15 @@ export async function getPageRSS(data: { html: string; url: string }) { feed.title = result.title } pageRSS.push(feed) - } else { - pageRSS.push({ - ...feed, - uncertain: true, - }) + unique.save(feed.url) } - } catch (error) { - pageRSS.push({ - ...feed, - uncertain: true, - }) - } - unique.save(feed.url) + } catch (error) { } resolve() }) }), ) - return pageRSS + return { + pageRSS, + } } diff --git a/src/lib/types.ts b/src/lib/types.ts index 8259c4b..4362c22 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -18,5 +18,4 @@ export type RSSData = { image?: string path?: string isDocs?: boolean - uncertain?: boolean } diff --git a/src/sandboxes/index.ts b/src/sandboxes/index.ts index 355da34..923110d 100644 --- a/src/sandboxes/index.ts +++ b/src/sandboxes/index.ts @@ -1,20 +1,17 @@ -import { getPageRSS } from "~/lib/rss" import { getPageRSSHub, getWebsiteRSSHub } from "~/lib/rsshub" import { parseRules } from "~/lib/rules" import { removeFunctionFields } from "~/lib/utils" export {} -export const getRSS = async ({ +export const getRSSHub = ({ html, url, rules, - callback, }: { html: string url: string rules: string - callback }) => { const pageRSSHub = getPageRSSHub({ html, @@ -25,20 +22,10 @@ export const getRSS = async ({ url, rules, }) - callback({ - pageRSS: [], + return { pageRSSHub, websiteRSSHub, - }) - const pageRSS = await getPageRSS({ - html, - url, - }) - callback({ - pageRSS, - pageRSSHub, - websiteRSSHub, - }) + } } export const getDisplayedRules = (rules: string) => { @@ -53,7 +40,7 @@ if (typeof window !== "undefined") { ( event: MessageEvent< | { - name: "requestRSS" + name: "requestRSSHub" body: { html: string url: string @@ -70,25 +57,23 @@ if (typeof window !== "undefined") { >, ) => { switch (event.data?.name) { - case "requestRSS": { - getRSS({ + case "requestRSSHub": { + const rsshub = getRSSHub({ html: event.data.body.html, url: event.data.body.url, rules: event.data.body.rules, - callback: (rss) => { - event.source.postMessage( - { - name: "responseRSS", - body: { - url: "url" in event.data.body && event.data.body.url, - tabId: "tabId" in event.data.body && event.data.body.tabId, - rss, - }, - }, - event.origin as any, - ) - }, }) + event.source.postMessage( + { + name: "responseRSS", + body: { + url: "url" in event.data.body && event.data.body.url, + tabId: "tabId" in event.data.body && event.data.body.tabId, + rss: rsshub, + }, + }, + event.origin as any, + ) break } case "requestDisplayedRules": {