From 2849e2684571641cd1cdd91fcf066855e318b3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Mon, 11 Nov 2024 18:00:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/{messages/src => message}/client.ts | 0 packages/message/extension.ts | 54 +++++++++++++ packages/message/index.ts | 63 +++++++++++++++ packages/messages/.gitignore | 13 --- packages/messages/.prettierignore | 4 - packages/messages/.prettierrc | 3 - packages/messages/README.md | 23 ------ packages/messages/eslint.config.mjs | 10 --- packages/messages/package.json | 40 ---------- packages/messages/rslib.config.ts | 16 ---- packages/messages/src/index.ts | 3 - packages/messages/src/server.ts | 37 --------- packages/messages/tests/index.test.ts | 5 -- packages/messages/tsconfig.json | 15 ---- packages/messages/vitest.config.ts | 6 -- pnpm-lock.yaml | 84 +++++++++++++++++++- pnpm-workspace.yaml | 2 - rspack.config.ts | 2 +- src/service_worker.ts | 13 ++- tsconfig.json | 7 +- 20 files changed, 214 insertions(+), 186 deletions(-) rename packages/{messages/src => message}/client.ts (100%) create mode 100644 packages/message/extension.ts create mode 100644 packages/message/index.ts delete mode 100644 packages/messages/.gitignore delete mode 100644 packages/messages/.prettierignore delete mode 100644 packages/messages/.prettierrc delete mode 100644 packages/messages/README.md delete mode 100644 packages/messages/eslint.config.mjs delete mode 100644 packages/messages/package.json delete mode 100644 packages/messages/rslib.config.ts delete mode 100644 packages/messages/src/index.ts delete mode 100644 packages/messages/src/server.ts delete mode 100644 packages/messages/tests/index.test.ts delete mode 100644 packages/messages/tsconfig.json delete mode 100644 packages/messages/vitest.config.ts delete mode 100644 pnpm-workspace.yaml diff --git a/packages/messages/src/client.ts b/packages/message/client.ts similarity index 100% rename from packages/messages/src/client.ts rename to packages/message/client.ts diff --git a/packages/message/extension.ts b/packages/message/extension.ts new file mode 100644 index 0000000..e32c088 --- /dev/null +++ b/packages/message/extension.ts @@ -0,0 +1,54 @@ +import EventEmitter from 'eventemitter3'; +import { Connect } from '.'; + +export class ExtServer { + private EE: EventEmitter; + + constructor() { + this.EE = new EventEmitter(); + chrome.runtime.onConnect.addListener((port) => { + this.EE.emit('connect', new ExtConnect(port)); + }); + } + + onConnect(callback: (con: Connect) => void) { + this.EE.on('connect', callback); + } +} + +export function connect() { + return new ExtConnect(chrome.runtime.connect()); +} + +export class ExtConnect implements Connect { + private EE: EventEmitter; + private port: chrome.runtime.Port; + + constructor(port: chrome.runtime.Port) { + this.EE = new EventEmitter(); + this.port = port; + port.onMessage.addListener((message) => { + this.EE.emit('message', message); + }); + port.onDisconnect.addListener(() => { + this.EE.emit('disconnect'); + this.EE.removeAllListeners(); + }); + } + + postMessage(message: unknown) { + this.port.postMessage(message); + } + + onMessage(callback: (message: unknown) => void) { + this.EE.on('message', callback); + } + + onDisconnect(callback: () => void) { + this.EE.on('disconnect', callback); + } + + disconnect() { + this.port.disconnect(); + } +} diff --git a/packages/message/index.ts b/packages/message/index.ts new file mode 100644 index 0000000..77c4d9e --- /dev/null +++ b/packages/message/index.ts @@ -0,0 +1,63 @@ +import EventEmitter from 'eventemitter3'; +import { v4 as uuidv4 } from 'uuid'; + +export interface Server { + onConnect: (callback: (con: Connect) => void) => void; +} + +export interface Connect { + postMessage: (message: unknown) => void; + onMessage: (callback: (message: unknown) => void) => void; + onDisconnect: (callback: () => void) => void; + disconnect: () => void; +} + +// 消息通道, 通过连接封装消息通道 +export class MessageChannel { + private EE: EventEmitter; + // 实例id + private id: string; + + constructor(private connect: Connect) { + this.EE = new EventEmitter(); + this.id = uuidv4(); + connect.onMessage((message) => { + // 判断消息是否为连接消息 + if (message && typeof message === 'object') { + const data = message as { type: string; id: string }; + // 判断实例 + if (data.id == this.id) { + switch (data.type) { + case 'connect': + // 建立连接 + break; + case 'message': + // 发送消息 + break; + } + } + } + }); + } + + // 发送一次消息并接收结果 + async send(message: unknown) { + return new Promise((resolve) => { + const callback = (message: unknown) => { + this.connect.onMessage(callback); + resolve(message); + }; + this.connect.onMessage(callback); + this.connect.postMessage(message); + }); + } + + // 发送消息 + postMessage(message: unknown) { + this.connect.postMessage({ + type: 'message', + id: this.id, + data: message, + }); + } +} diff --git a/packages/messages/.gitignore b/packages/messages/.gitignore deleted file mode 100644 index 38d7344..0000000 --- a/packages/messages/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Local -.DS_Store -*.local -*.log* - -# Dist -node_modules -dist/ - -# IDE -.vscode/* -!.vscode/extensions.json -.idea diff --git a/packages/messages/.prettierignore b/packages/messages/.prettierignore deleted file mode 100644 index ac66857..0000000 --- a/packages/messages/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -# Lock files -package-lock.json -pnpm-lock.yaml -yarn.lock diff --git a/packages/messages/.prettierrc b/packages/messages/.prettierrc deleted file mode 100644 index 544138b..0000000 --- a/packages/messages/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "singleQuote": true -} diff --git a/packages/messages/README.md b/packages/messages/README.md deleted file mode 100644 index 46ae92e..0000000 --- a/packages/messages/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Rslib Project - -## Setup - -Install the dependencies: - -```bash -pnpm install -``` - -## Get Started - -Build the library: - -```bash -pnpm build -``` - -Build the library in watch mode: - -```bash -pnpm dev -``` diff --git a/packages/messages/eslint.config.mjs b/packages/messages/eslint.config.mjs deleted file mode 100644 index 84a10c6..0000000 --- a/packages/messages/eslint.config.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import js from '@eslint/js'; -import globals from 'globals'; -import ts from 'typescript-eslint'; - -export default [ - { languageOptions: { globals: globals.browser } }, - js.configs.recommended, - ...ts.configs.recommended, - { ignores: ['dist/'] }, -]; diff --git a/packages/messages/package.json b/packages/messages/package.json deleted file mode 100644 index d12a6ba..0000000 --- a/packages/messages/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "messages", - "version": "1.0.0", - "type": "module", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" - } - }, - "main": "./dist/index.cjs", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "rslib build", - "dev": "rslib build --watch", - "format": "prettier --write .", - "lint": "eslint .", - "test": "vitest run" - }, - "dependencies": { - "eventemitter3": "~5.0.1" - }, - "devDependencies": { - "@eslint/js": "^9.12.0", - "@rslib/core": "^0.0.16", - "@types/node": "^22.8.1", - "eslint": "^9.12.0", - "globals": "^15.11.0", - "prettier": "^3.3.3", - "typescript": "^5.6.3", - "typescript-eslint": "^8.8.1", - "vitest": "^2.1.4" - }, - "private": true -} \ No newline at end of file diff --git a/packages/messages/rslib.config.ts b/packages/messages/rslib.config.ts deleted file mode 100644 index cfac279..0000000 --- a/packages/messages/rslib.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig } from '@rslib/core'; - -export default defineConfig({ - lib: [ - { - format: 'esm', - syntax: 'es2021', - dts: true, - }, - { - format: 'cjs', - syntax: 'es2021', - }, - ], - output: { target: 'node' }, -}); diff --git a/packages/messages/src/index.ts b/packages/messages/src/index.ts deleted file mode 100644 index b28b04f..0000000 --- a/packages/messages/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/messages/src/server.ts b/packages/messages/src/server.ts deleted file mode 100644 index 4980061..0000000 --- a/packages/messages/src/server.ts +++ /dev/null @@ -1,37 +0,0 @@ -import EventEmitter from 'eventemitter3'; - -export class Server { - private EE: EventEmitter; - - constructor() { - this.EE = new EventEmitter(); - } - - onConnect(callback: (con: Connect) => void) { - this.EE.on('connect', callback); - } -} - -export interface Connect { - postMessage: (message: unknown) => void; - onMessage: (callback: (message: unknown) => void) => void; -} - -export class ChromeServer { - - private EE: EventEmitter; - - constructor() { - chrome.runtime.onConnect.addListener((port) => { - this.EE.emit('connect', { - postMessage: (message: unknown) => port.postMessage(message), - onMessage: (callback: (message: unknown) => void) => - port.onMessage.addListener(callback), - }); - }); - } - - onConnect(callback: (con: Connect) => void) { - this.EE.on('connect', callback); - } -} diff --git a/packages/messages/tests/index.test.ts b/packages/messages/tests/index.test.ts deleted file mode 100644 index 5df36f0..0000000 --- a/packages/messages/tests/index.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { expect, test } from 'vitest'; - -test('squared', () => { - expect(4).toBe(4); -}); diff --git a/packages/messages/tsconfig.json b/packages/messages/tsconfig.json deleted file mode 100644 index 8c5c4d6..0000000 --- a/packages/messages/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "lib": ["ES2021"], - "module": "ESNext", - "noEmit": true, - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, - "resolveJsonModule": true, - "moduleResolution": "bundler", - "useDefineForClassFields": true, - "allowImportingTsExtensions": true - }, - "include": ["src"] -} diff --git a/packages/messages/vitest.config.ts b/packages/messages/vitest.config.ts deleted file mode 100644 index e83eaf4..0000000 --- a/packages/messages/vitest.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - // Configure Vitest (https://vitest.dev/config/) - test: {}, -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cb745c..4aa547e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,11 +73,14 @@ importers: specifier: ^8.8.1 version: 8.11.0(eslint@9.13.0)(typescript@5.6.3) - packages/messages: + packages/message: dependencies: eventemitter3: specifier: ~5.0.1 version: 5.0.1 + uuid: + specifier: ^11.0.3 + version: 11.0.3 devDependencies: '@eslint/js': specifier: ^9.12.0 @@ -85,6 +88,9 @@ importers: '@rslib/core': specifier: ^0.0.16 version: 0.0.16(typescript@5.6.3) + '@types/chrome': + specifier: ^0.0.279 + version: 0.0.279 '@types/node': specifier: ^22.8.1 version: 22.8.1 @@ -107,6 +113,76 @@ importers: specifier: ^2.1.4 version: 2.1.4(@types/node@22.8.1) + packages/scriptcat: + dependencies: + '@scriptcat/message': + specifier: workspace:* + version: link:../message + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + i18next: + specifier: ^23.16.4 + version: 23.16.4 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-i18next: + specifier: ^15.1.0 + version: 15.1.0(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@eslint/compat': + specifier: ^1.2.0 + version: 1.2.1(eslint@9.13.0) + '@eslint/js': + specifier: ^9.12.0 + version: 9.13.0 + '@rspack/cli': + specifier: ^1.0.14 + version: 1.0.14(@rspack/core@1.0.14(@swc/helpers@0.5.13))(@types/express@4.17.21) + '@rspack/core': + specifier: ^1.0.14 + version: 1.0.14(@swc/helpers@0.5.13) + '@types/chrome': + specifier: ^0.0.279 + version: 0.0.279 + '@types/react': + specifier: ^18.2.48 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.3.1 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^9.12.0 + version: 9.13.0 + eslint-plugin-react: + specifier: ^7.37.1 + version: 7.37.2(eslint@9.13.0) + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.0.0(eslint@9.13.0) + globals: + specifier: ^15.11.0 + version: 15.11.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.8.1)(typescript@5.6.3) + typescript: + specifier: ^5.6.3 + version: 5.6.3 + typescript-eslint: + specifier: ^8.8.1 + version: 8.11.0(eslint@9.13.0)(typescript@5.6.3) + packages: '@babel/runtime@7.26.0': @@ -2409,6 +2485,10 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@11.0.3: + resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -5037,6 +5117,8 @@ snapshots: utils-merge@1.0.1: {} + uuid@11.0.3: {} + uuid@8.3.2: {} v8-compile-cache-lib@3.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index ccdc80c..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - "packages/*" \ No newline at end of file diff --git a/rspack.config.ts b/rspack.config.ts index 5ea4b46..091d211 100644 --- a/rspack.config.ts +++ b/rspack.config.ts @@ -37,7 +37,7 @@ export default defineConfig({ extensions: ["...", ".ts", ".tsx", ".jsx"], alias: { "@App": path.resolve(__dirname, "src/"), - "@Pkg": path.resolve(__dirname, "pkg/"), + "@Packages": path.resolve(__dirname, "packages/"), }, }, module: { diff --git a/src/service_worker.ts b/src/service_worker.ts index 4546457..b491783 100644 --- a/src/service_worker.ts +++ b/src/service_worker.ts @@ -1,6 +1,4 @@ -chrome.runtime.onConnect.addListener((port) => { - console.log("service worker connected", port); -}); +import { ExtServer } from "@Packages/message/extension"; async function setupOffscreenDocument() { // 创建运行后台脚本的沙盒环境 @@ -18,4 +16,11 @@ async function setupOffscreenDocument() { }); } -setupOffscreenDocument(); +async function main() { + // 初始化沙盒环境 + await setupOffscreenDocument(); + // 监听消息 + new ExtServer(); +} + +main(); diff --git a/tsconfig.json b/tsconfig.json index d680111..bf187e2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,13 +20,14 @@ "@App/*": [ "src/*" ], - "@Pkg/*": [ - "pkg/*" + "@Packages/*": [ + "packages/*" ] }, }, "include": [ - "src" + "src", + "packages" ], "ts-node": { "compilerOptions": {