diff --git a/packages/message/client.ts b/packages/message/client.ts index ec41def..cf44d32 100644 --- a/packages/message/client.ts +++ b/packages/message/client.ts @@ -1,9 +1,10 @@ import LoggerCore from "@App/app/logger/core"; -import { Message, MessageConnect } from "./server"; +import { Message, MessageConnect, MessageSend } from "./server"; +import { ExtensionMessageSend } from "./extension_message"; -export async function sendMessage(msg: Message, action: string, data?: any): Promise { +export async function sendMessage(msg: MessageSend, action: string, data?: any): Promise { const res = await msg.sendMessage({ action, data }); - LoggerCore.getInstance().logger().debug("sendMessage", { action, data, response: res }); + LoggerCore.getInstance().logger().trace("sendMessage", { action, data, response: res }); if (res && res.code) { console.error(res); return Promise.reject(res.message); @@ -18,7 +19,7 @@ export function connect(msg: Message, action: string, data?: any): Promise { + return new Promise((resolve) => { + const con = chrome.runtime.connect(); + con.postMessage(data); + resolve(new ExtensionMessageConnect(con)); + }); + } + + // 发送消息 注意不进行回调的内存泄漏 + sendMessage(data: any): Promise { + return new Promise((resolve) => { + chrome.runtime.sendMessage(data, (resp) => { + resolve(resp); + }); + }); + } +} + +export class ExtensionMessage extends ExtensionMessageSend implements Message { onConnect(callback: (data: any, con: MessageConnect) => void) { chrome.runtime.onConnect.addListener((port) => { const handler = (msg: any) => { @@ -11,29 +30,12 @@ export class ExtensionMessage implements Message { }); } - connect(data: any): Promise { - return new Promise((resolve) => { - const con = chrome.runtime.connect(); - con.postMessage(data); - resolve(new ExtensionMessageConnect(con)); - }); - } - // 注意chrome.runtime.onMessage.addListener的回调函数需要返回true才能处理异步请求 onMessage(callback: (data: any, sendResponse: (data: any) => void) => void) { chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { return callback(msg, sendResponse); }); } - - // 发送消息 注意不进行回调的内存泄漏 - sendMessage(data: any): Promise { - return new Promise((resolve) => { - chrome.runtime.sendMessage(data, (resp) => { - resolve(resp); - }); - }); - } } export class ExtensionMessageConnect implements MessageConnect { diff --git a/packages/message/message_queue.ts b/packages/message/message_queue.ts index ee79151..ed110a0 100644 --- a/packages/message/message_queue.ts +++ b/packages/message/message_queue.ts @@ -1,10 +1,13 @@ import EventEmitter from "eventemitter3"; -import { ApiFunction, Message, MessageConnect, Server } from "./server"; +import { ApiFunction, MessageConnect, MessageSend, Server } from "./server"; +import { sendMessage } from "./client"; +import Logger from "@App/app/logger/logger"; +import LoggerCore from "@App/app/logger/core"; export type SubscribeCallback = (message: any) => void; export class Broker { - constructor(private msg: Message) {} + constructor(private msg: MessageSend) {} // 订阅 async subscribe(topic: string, handler: SubscribeCallback): Promise { @@ -19,7 +22,7 @@ export class Broker { // 发布 publish(topic: string, message: any) { - chrome.runtime.sendMessage({ action: "publish", topic, message }); + sendMessage(this.msg, "messageQueue", { action: "publish", topic, message }); } } @@ -29,12 +32,15 @@ export class MessageQueue { private EE: EventEmitter = new EventEmitter(); + logger: Logger; constructor(api: Server) { api.on("messageQueue", this.handler()); + this.logger = LoggerCore.getInstance().logger({ service: "messageQueue" }); } handler(): ApiFunction { return ({ action, topic, message }: { action: string; topic: string; message: any }, con) => { + this.logger.trace("messageQueueHandler", { action, topic, message }); if (!con) { throw new Error("con is required"); } @@ -66,6 +72,7 @@ export class MessageQueue { // 移除断开连接的con list = list!.filter((item) => item.con !== con); this.topicConMap.set(topic, list); + this.logger.debug("disconnect", { topic }); }); } @@ -75,6 +82,7 @@ export class MessageQueue { item.con.sendMessage({ action: "message", topic, message }); }); this.EE.emit(topic, message); + this.logger.trace("publish", { topic, message, list: list?.length }); } // 只发布给当前环境 diff --git a/packages/message/server.ts b/packages/message/server.ts index e8c4acd..3d1fcc7 100644 --- a/packages/message/server.ts +++ b/packages/message/server.ts @@ -1,8 +1,12 @@ import LoggerCore from "@App/app/logger/core"; +import { ExtensionMessageSend } from "./extension_message"; -export interface Message { +export interface Message extends MessageSend { onConnect(callback: (data: any, con: MessageConnect) => void): void; onMessage(callback: (data: any, sendResponse: (data: any) => void) => void): void; +} + +export interface MessageSend { connect(data: any): Promise; sendMessage(data: any): Promise; } @@ -53,7 +57,7 @@ export class Server { private messageHandle(msg: string, params: any, sendResponse: (response: any) => void) { const logger = LoggerCore.getInstance().logger({ env: this.env, msg }); - logger.debug("messageHandle", { params }); + logger.trace("messageHandle", { params }); const func = this.apiFunctionMap.get(msg); if (func) { try { @@ -96,7 +100,7 @@ export class Group { } // 转发消息 -export function forwardMessage(path: string, from: Server, to: Message) { +export function forwardMessage(path: string, from: Server, to: ExtensionMessageSend) { from.on(path, (params, fromCon) => { if (fromCon) { to.connect({ action: path, data: params }).then((toCon) => { diff --git a/src/app/logger/core.ts b/src/app/logger/core.ts index 9c2f14d..dfd7cac 100644 --- a/src/app/logger/core.ts +++ b/src/app/logger/core.ts @@ -1,6 +1,6 @@ import Logger from "./logger"; -export type LogLevel = "debug" | "info" | "warn" | "error"; +export type LogLevel = "trace" | "debug" | "info" | "warn" | "error"; export interface LogLabel { [key: string]: string | string[] | boolean | number | undefined; @@ -25,17 +25,22 @@ export default class LoggerCore { writer: Writer; + // 日志级别, 会记录在日志文件中 level: LogLevel = "info"; - debug: boolean = false; + // 日志debug等级, 会在控制台输出 + debug: LogLevel | "none" = "none"; labels: LogLabel; - constructor(config: { level?: LogLevel; debug?: boolean; writer: Writer; labels: LogLabel }) { + constructor(config: { level?: LogLevel; writer: Writer; labels: LogLabel }) { this.writer = config.writer; this.level = config.level || this.level; - this.debug = config.debug || this.debug; this.labels = config.labels || {}; + // 获取日志debug等级, 如果是开发环境, 则默认为trace + if (process.env.NODE_ENV === "development") { + this.debug = "trace"; + } if (!LoggerCore.instance) { LoggerCore.instance = this; } diff --git a/src/app/logger/logger.ts b/src/app/logger/logger.ts index 7ad471b..3f77c3e 100644 --- a/src/app/logger/logger.ts +++ b/src/app/logger/logger.ts @@ -2,10 +2,11 @@ import dayjs from "dayjs"; import LoggerCore, { LogLabel, LogLevel } from "./core"; const levelNumber = { - debug: 10, - info: 100, - warn: 1000, - error: 10000, + trace: 10, + debug: 100, + info: 1000, + warn: 10000, + error: 100000, }; function buildLabel(...label: LogLabel[][]): LogLabel { @@ -34,7 +35,7 @@ export default class Logger { if (levelNumber[level] >= levelNumber[this.core.level]) { this.core.writer.write(level, message, buildLabel(this.label, label)); } - if (this.core.debug) { + if (this.core.debug !== "none" && levelNumber[level] >= levelNumber[this.core.debug]) { if (typeof message === "object") { message = JSON.stringify(message); } @@ -48,6 +49,9 @@ export default class Logger { case "warn": console.warn(msg); break; + case "trace": + console.trace(msg); + break; default: console.info(msg); break; @@ -59,6 +63,10 @@ export default class Logger { return new Logger(this.core, ...this.label, ...label); } + trace(message: string, ...label: LogLabel[]) { + this.log("trace", message, ...label); + } + debug(message: string, ...label: LogLabel[]) { this.log("debug", message, ...label); } diff --git a/src/app/repo/repo.ts b/src/app/repo/repo.ts index e9f3aa1..0570f8b 100644 --- a/src/app/repo/repo.ts +++ b/src/app/repo/repo.ts @@ -9,7 +9,7 @@ export abstract class Repo { return this.prefix + key; } - protected async _save(key: string, val: T) { + protected async _save(key: string, val: T):Promise { return new Promise((resolve) => { const data = { [this.joinKey(key)]: val, diff --git a/src/app/service/offscreen/index.ts b/src/app/service/offscreen/index.ts index 7adfd51..89af953 100644 --- a/src/app/service/offscreen/index.ts +++ b/src/app/service/offscreen/index.ts @@ -1,24 +1,20 @@ import { forwardMessage, Server } from "@Packages/message/server"; import { ScriptService } from "./script"; -import { Broker, MessageQueue } from "@Packages/message/message_queue"; +import { Broker } from "@Packages/message/message_queue"; import { Logger, LoggerDAO } from "@App/app/repo/logger"; import { WindowMessage } from "@Packages/message/window_message"; -import { ExtensionMessage } from "@Packages/message/extension_message"; +import { ExtensionMessageSend } from "@Packages/message/extension_message"; import { ServiceWorkerClient } from "../service_worker/client"; import { sendMessage } from "@Packages/message/client"; // offscreen环境的管理器 export class OffscreenManager { - private extensionMessage = new ExtensionMessage(); - - private api: Server = new Server("offscreen", this.extensionMessage); + private extensionMessage = new ExtensionMessageSend(); private windowMessage = new WindowMessage(window, sandbox); private windowApi: Server = new Server("offscreen-window", this.windowMessage); - private mq: MessageQueue = new MessageQueue(this.api); - private broker: Broker = new Broker(this.extensionMessage); private serviceWorker = new ServiceWorkerClient(this.extensionMessage); @@ -39,33 +35,27 @@ export class OffscreenManager { async initManager() { // 监听消息 - const group = this.api.group("offscreen"); this.windowApi.on("logger", this.logger.bind(this)); this.windowApi.on("preparationSandbox", this.preparationSandbox.bind(this)); this.windowApi.on("sendMessageToServiceWorker", this.sendMessageToServiceWorker.bind(this)); - const script = new ScriptService( - group.group("script"), - this.mq, - this.extensionMessage, - this.windowMessage, - this.broker - ); + const script = new ScriptService(this.extensionMessage, this.windowMessage, this.broker); script.init(); // 转发gm api请求 forwardMessage("serviceWorker/runtime/gmApi", this.windowApi, this.extensionMessage); - // 处理gm xhr请求 - this.api.on("gmXhr", (data) => { - console.log("123"); - }); - // 测试xhr - const ret = await sendMessage(this.extensionMessage, "serviceWorker/testGmApi"); - console.log("test xhr", ret); - const xhr = new XMLHttpRequest(); - xhr.onload = () => { - console.log(xhr); - }; - xhr.open("GET", "https://scriptcat.org/zh-CN"); - xhr.send(); + // // 处理gm xhr请求 + // this.api.on("gmXhr", (data) => { + // console.log("123"); + // }); + // // 测试xhr + // const ret = await sendMessage(this.extensionMessage, "serviceWorker/testGmApi"); + // console.log("test xhr", ret); + // const xhr = new XMLHttpRequest(); + // xhr.onload = () => { + // console.log(xhr); + // }; + // xhr.open("GET", "https://scriptcat.org/zh-CN"); + + // xhr.send(); } } diff --git a/src/app/service/offscreen/script.ts b/src/app/service/offscreen/script.ts index 335c449..31a5433 100644 --- a/src/app/service/offscreen/script.ts +++ b/src/app/service/offscreen/script.ts @@ -1,7 +1,6 @@ import LoggerCore from "@App/app/logger/core"; import Logger from "@App/app/logger/logger"; -import { Broker, MessageQueue } from "@Packages/message/message_queue"; -import { Group, Message } from "@Packages/message/server"; +import { Broker } from "@Packages/message/message_queue"; import { WindowMessage } from "@Packages/message/window_message"; import { ResourceClient, @@ -12,6 +11,7 @@ import { } from "../service_worker/client"; import { SCRIPT_STATUS_ENABLE, SCRIPT_TYPE_NORMAL } from "@App/app/repo/scripts"; import { disableScript, enableScript } from "../sandbox/client"; +import { ExtensionMessageSend } from "@Packages/message/extension_message"; export class ScriptService { logger: Logger; @@ -21,9 +21,7 @@ export class ScriptService { valueClient: ValueClient = new ValueClient(this.extensionMessage); constructor( - private group: Group, - private mq: MessageQueue, - private extensionMessage: Message, + private extensionMessage: ExtensionMessageSend, private windowMessage: WindowMessage, private broker: Broker ) { @@ -46,7 +44,6 @@ export class ScriptService { }); subscribeScriptInstall(this.broker, async (data) => { // 判断是开启还是关闭 - console.log("1dd23", data); if (data.script.status === SCRIPT_STATUS_ENABLE) { // 构造脚本运行资源,发送给沙盒运行 enableScript(this.windowMessage, await this.scriptClient.getScriptRunResource(data.script)); diff --git a/src/app/service/service_worker/client.ts b/src/app/service/service_worker/client.ts index 661d000..68ee2eb 100644 --- a/src/app/service/service_worker/client.ts +++ b/src/app/service/service_worker/client.ts @@ -3,10 +3,10 @@ import { Client } from "@Packages/message/client"; import { InstallSource } from "."; import { Broker } from "@Packages/message/message_queue"; import { Resource } from "@App/app/repo/resource"; -import { Message } from "@Packages/message/server"; +import { ExtensionMessageSend } from "@Packages/message/extension_message"; export class ServiceWorkerClient extends Client { - constructor(msg: Message) { + constructor(msg: ExtensionMessageSend) { super(msg, "serviceWorker"); } @@ -16,7 +16,7 @@ export class ServiceWorkerClient extends Client { } export class ScriptClient extends Client { - constructor(msg: Message) { + constructor(msg: ExtensionMessageSend) { super(msg, "serviceWorker/script"); } @@ -51,7 +51,7 @@ export class ScriptClient extends Client { } export class ResourceClient extends Client { - constructor(msg: Message) { + constructor(msg: ExtensionMessageSend) { super(msg, "serviceWorker/resource"); } @@ -61,7 +61,7 @@ export class ResourceClient extends Client { } export class ValueClient extends Client { - constructor(msg: Message) { + constructor(msg: ExtensionMessageSend) { super(msg, "serviceWorker/value"); } diff --git a/src/app/service/service_worker/index.ts b/src/app/service/service_worker/index.ts index 079db03..125d4ac 100644 --- a/src/app/service/service_worker/index.ts +++ b/src/app/service/service_worker/index.ts @@ -33,77 +33,77 @@ export default class ServiceWorkerManager { runtime.init(); // 测试xhr - setTimeout(() => { - chrome.tabs.query( - { - url: chrome.runtime.getURL("src/offscreen.html"), - }, - (result) => { - console.log(result); - } - ); - }, 2000); - group.on("testGmApi", () => { - console.log(chrome.runtime.getURL("src/offscreen.html")); - return new Promise((resolve) => { - chrome.tabs.query({}, (tabs) => { - const excludedTabIds: number[] = []; - tabs.forEach((tab) => { - if (tab.id) { - excludedTabIds.push(tab.id); - } - }); - chrome.declarativeNetRequest.updateSessionRules( - { - removeRuleIds: [100], - addRules: [ - { - id: 100, - priority: 1, - action: { - type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS, - requestHeaders: [ - { - header: "cookie", - operation: chrome.declarativeNetRequest.HeaderOperation.SET, - value: "test=1234314", - }, - { - header: "origin", - operation: chrome.declarativeNetRequest.HeaderOperation.SET, - value: "https://learn.scriptcat.org", - }, - { - header: "user-agent", - operation: chrome.declarativeNetRequest.HeaderOperation.SET, - value: "test", - }, - ], - }, - condition: { - resourceTypes: [chrome.declarativeNetRequest.ResourceType.XMLHTTPREQUEST], - urlFilter: "https://scriptcat.org/zh-CN", - excludedTabIds: excludedTabIds, - }, - }, - ], - }, - () => { - resolve(1); - } - ); - }); - }); - }); - chrome.webRequest.onHeadersReceived.addListener( - (details) => { - console.log(details); - }, - { - urls: [""], - types: ["xmlhttprequest"], - }, - ["responseHeaders", "extraHeaders"] - ); + // setTimeout(() => { + // chrome.tabs.query( + // { + // url: chrome.runtime.getURL("src/offscreen.html"), + // }, + // (result) => { + // console.log(result); + // } + // ); + // }, 2000); + // group.on("testGmApi", () => { + // console.log(chrome.runtime.getURL("src/offscreen.html")); + // return new Promise((resolve) => { + // chrome.tabs.query({}, (tabs) => { + // const excludedTabIds: number[] = []; + // tabs.forEach((tab) => { + // if (tab.id) { + // excludedTabIds.push(tab.id); + // } + // }); + // chrome.declarativeNetRequest.updateSessionRules( + // { + // removeRuleIds: [100], + // addRules: [ + // { + // id: 100, + // priority: 1, + // action: { + // type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS, + // requestHeaders: [ + // { + // header: "cookie", + // operation: chrome.declarativeNetRequest.HeaderOperation.SET, + // value: "test=1234314", + // }, + // { + // header: "origin", + // operation: chrome.declarativeNetRequest.HeaderOperation.SET, + // value: "https://learn.scriptcat.org", + // }, + // { + // header: "user-agent", + // operation: chrome.declarativeNetRequest.HeaderOperation.SET, + // value: "test", + // }, + // ], + // }, + // condition: { + // resourceTypes: [chrome.declarativeNetRequest.ResourceType.XMLHTTPREQUEST], + // urlFilter: "https://scriptcat.org/zh-CN", + // excludedTabIds: excludedTabIds, + // }, + // }, + // ], + // }, + // () => { + // resolve(1); + // } + // ); + // }); + // }); + // }); + // chrome.webRequest.onHeadersReceived.addListener( + // (details) => { + // console.log(details); + // }, + // { + // urls: [""], + // types: ["xmlhttprequest"], + // }, + // ["responseHeaders", "extraHeaders"] + // ); } } diff --git a/src/app/service/service_worker/script.ts b/src/app/service/service_worker/script.ts index aa80e39..57a12c3 100644 --- a/src/app/service/service_worker/script.ts +++ b/src/app/service/service_worker/script.ts @@ -178,7 +178,7 @@ export class ScriptService { logger.info("install success"); // 广播一下 this.mq.publish("installScript", { script, update }); - return {}; + return Promise.resolve(true); }) .catch((e: any) => { logger.error("install error", Logger.E(e)); diff --git a/src/offscreen.ts b/src/offscreen.ts index f2783b8..5e529b9 100644 --- a/src/offscreen.ts +++ b/src/offscreen.ts @@ -9,7 +9,6 @@ function main() { migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ - debug: process.env.NODE_ENV === "development", writer: new DBWriter(new LoggerDAO()), labels: { env: "offscreen" }, }); diff --git a/src/pages/install/main.tsx b/src/pages/install/main.tsx index 6bbc336..4a85f4a 100644 --- a/src/pages/install/main.tsx +++ b/src/pages/install/main.tsx @@ -16,7 +16,6 @@ import DBWriter from "@App/app/logger/db_writer.ts"; migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ - debug: process.env.NODE_ENV === "development", writer: new DBWriter(new LoggerDAO()), labels: { env: "install" }, }); diff --git a/src/pages/options/main.tsx b/src/pages/options/main.tsx index 7801341..45592a0 100644 --- a/src/pages/options/main.tsx +++ b/src/pages/options/main.tsx @@ -8,6 +8,20 @@ import "@arco-design/web-react/dist/css/arco.css"; import "@App/locales/locales"; import "@App/index.css"; import "./index.css"; +import migrate from "@App/app/migrate.ts"; +import LoggerCore from "@App/app/logger/core.ts"; +import { LoggerDAO } from "@App/app/repo/logger.ts"; +import DBWriter from "@App/app/logger/db_writer.ts"; + +// 初始化数据库 +migrate(); +// 初始化日志组件 +const loggerCore = new LoggerCore({ + writer: new DBWriter(new LoggerDAO()), + labels: { env: "options" }, +}); + +loggerCore.logger().debug("page start"); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( diff --git a/src/pages/options/routes/ScriptList.tsx b/src/pages/options/routes/ScriptList.tsx index a15cded..b0bc887 100644 --- a/src/pages/options/routes/ScriptList.tsx +++ b/src/pages/options/routes/ScriptList.tsx @@ -83,7 +83,7 @@ import { import { selectScriptListColumnWidth } from "@App/pages/store/features/setting"; import { Broker } from "@Packages/message/message_queue"; import { subscribeScriptDelete, subscribeScriptInstall } from "@App/app/service/service_worker/client"; -import { ExtensionMessage } from "@Packages/message/extension_message"; +import { ExtensionMessageSend } from "@Packages/message/extension_message"; import { MessageConnect } from "@Packages/message/server"; type ListType = Script & { loading?: boolean }; @@ -111,7 +111,7 @@ function ScriptList() { useEffect(() => { dispatch(fetchAndSortScriptList()); // 监听脚本安装/运行 - const msg = new ExtensionMessage(); + const msg = new ExtensionMessageSend(); const border = new Broker(msg); const subCon: MessageConnect[] = []; diff --git a/src/sandbox.ts b/src/sandbox.ts index f3fcffb..94b2c4d 100644 --- a/src/sandbox.ts +++ b/src/sandbox.ts @@ -9,7 +9,6 @@ function main() { // 初始化日志组件 const loggerCore = new LoggerCore({ - debug: process.env.NODE_ENV === "development", writer: new MessageWriter(msg), labels: { env: "sandbox" }, }); diff --git a/src/service_worker.ts b/src/service_worker.ts index b5e9643..5bd04c5 100644 --- a/src/service_worker.ts +++ b/src/service_worker.ts @@ -46,7 +46,6 @@ async function main() { migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ - debug: process.env.NODE_ENV === "development", writer: new DBWriter(new LoggerDAO()), labels: { env: "service_worker" }, });