From 1e8b5e64530923530a0f65018226d5df3fe44a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Sat, 8 Feb 2025 17:59:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/message/client.ts | 2 +- packages/message/extension_message.ts | 15 +- packages/message/server.ts | 11 +- src/app/cache.ts | 123 +++++++++++-- src/app/cache_key.ts | 6 + src/app/repo/permission.ts | 24 ++- src/app/repo/scripts.ts | 4 +- src/app/service/offscreen/gm_api.ts | 7 + src/app/service/offscreen/index.ts | 12 +- src/app/service/offscreen/script.ts | 4 +- src/app/service/service_worker/client.ts | 10 +- src/app/service/service_worker/gm_api.ts | 87 ++++++++++ src/app/service/service_worker/index.ts | 4 +- .../service_worker/permission_verify.ts | 161 +++--------------- src/app/service/service_worker/runtime.ts | 6 +- src/app/service/service_worker/script.ts | 2 +- .../components/ScriptSetting/Permission.tsx | 4 +- src/runtime/content/exec_script.ts | 2 +- src/runtime/content/gm_api.ts | 2 + src/runtime/service_worker/gm_api.ts | 55 ------ src/runtime/service_worker/runtime.ts | 8 +- 21 files changed, 295 insertions(+), 254 deletions(-) create mode 100644 src/app/service/offscreen/gm_api.ts create mode 100644 src/app/service/service_worker/gm_api.ts rename src/{runtime => app/service}/service_worker/permission_verify.ts (56%) delete mode 100644 src/runtime/service_worker/gm_api.ts diff --git a/packages/message/client.ts b/packages/message/client.ts index cf44d32..0118aac 100644 --- a/packages/message/client.ts +++ b/packages/message/client.ts @@ -19,7 +19,7 @@ export function connect(msg: Message, action: string, data?: any): Promise { return new Promise((resolve) => { const con = chrome.runtime.connect(); @@ -12,9 +16,14 @@ export class ExtensionMessageSend implements MessageSend { // 发送消息 注意不进行回调的内存泄漏 sendMessage(data: any): Promise { return new Promise((resolve) => { - chrome.runtime.sendMessage(data, (resp) => { - resolve(resp); - }); + chrome.runtime.sendMessage( + Object.assign(data, { + serverEnv: this.serverEnv, + }), + (resp) => { + resolve(resp); + } + ); }); } } diff --git a/packages/message/server.ts b/packages/message/server.ts index 3d1fcc7..a0060dd 100644 --- a/packages/message/server.ts +++ b/packages/message/server.ts @@ -22,7 +22,7 @@ export type MessageSender = { tabId: number; }; -export type ApiFunction = (params: any, con: MessageConnect | null) => any; +export type ApiFunction = (params: any, con: MessageConnect | null) => Promise | void; export class Server { private apiFunctionMap: Map = new Map(); @@ -32,10 +32,17 @@ export class Server { message: Message ) { message.onConnect((msg: any, con: MessageConnect) => { + if (msg.serverEnv !== this.env) { + con.disconnect(); + return; + } this.connectHandle(msg.action, msg.data, con); }); message.onMessage((msg, sendResponse) => { + if (msg.serverEnv !== this.env) { + return; + } return this.messageHandle(msg.action, msg.data, sendResponse); }); } @@ -100,7 +107,7 @@ export class Group { } // 转发消息 -export function forwardMessage(path: string, from: Server, to: ExtensionMessageSend) { +export function forwardMessage(path: string, from: Server, to: MessageSend) { from.on(path, (params, fromCon) => { if (fromCon) { to.connect({ action: path, data: params }).then((toCon) => { diff --git a/src/app/cache.ts b/src/app/cache.ts index ec771e9..f466541 100644 --- a/src/app/cache.ts +++ b/src/app/cache.ts @@ -1,22 +1,109 @@ +export interface CacheStorage { + get(key: string): Promise; + set(key: string, value: any): Promise; + has(key: string): Promise; + del(key: string): Promise; + list(): Promise; +} + +export class ExtCache implements CacheStorage { + get(key: string): Promise { + return new Promise((resolve) => { + chrome.storage.local.get(key, (value) => { + resolve(value); + }); + }); + } + + set(key: string, value: any): Promise { + return new Promise((resolve) => { + chrome.storage.local.set( + { + [key]: value, + }, + () => { + resolve(); + } + ); + }); + } + + has(key: string): Promise { + return new Promise((resolve) => { + chrome.storage.local.get(key, (value) => { + resolve(value[key] !== undefined); + }); + }); + } + + del(key: string): Promise { + return new Promise((resolve) => { + chrome.storage.local.remove(key, () => { + resolve(); + }); + }); + } + + list(): Promise { + return new Promise((resolve) => { + chrome.storage.local.get(null, (value) => { + resolve(Object.keys(value)); + }); + }); + } +} + +export class MapCache { + private map: Map = new Map(); + + get(key: string): Promise { + return new Promise((resolve) => { + resolve(this.map.get(key)); + }); + } + + set(key: string, value: any): Promise { + return new Promise((resolve) => { + this.map.set(key, value); + resolve(); + }); + } + + has(key: string): Promise { + return new Promise((resolve) => { + resolve(this.map.has(key)); + }); + } + + del(key: string): Promise { + return new Promise((resolve) => { + this.map.delete(key); + resolve(); + }); + } + + list(): Promise { + return new Promise((resolve) => { + resolve(Array.from(this.map.keys())); + }); + } +} + export default class Cache { - static instance: Cache = new Cache(); + static instance: Cache = new Cache(new ExtCache()); static getInstance(): Cache { return Cache.instance; } - map: Map; + private constructor(private storage: CacheStorage) {} - private constructor() { - this.map = new Map(); + public get(key: string): Promise { + return this.storage.get(key); } - public get(key: string): unknown { - return this.map.get(key); - } - - public async getOrSet(key: string, set: () => Promise): Promise { - let ret = this.get(key); + public async getOrSet(key: string, set: () => Promise): Promise { + let ret = await this.get(key); if (!ret) { ret = await set(); this.set(key, ret); @@ -24,19 +111,19 @@ export default class Cache { return Promise.resolve(ret); } - public set(key: string, value: unknown): void { - this.map.set(key, value); + public set(key: string, value: any): Promise { + return this.storage.set(key, value); } - public has(key: string): boolean { - return this.map.has(key); + public has(key: string): Promise { + return this.storage.has(key); } - public del(key: string): void { - this.map.delete(key); + public del(key: string): Promise { + return this.storage.del(key); } - public list(): string[] { - return Array.from(this.map.keys()); + public list(): Promise { + return this.storage.list(); } } diff --git a/src/app/cache_key.ts b/src/app/cache_key.ts index d4d4191..731416b 100644 --- a/src/app/cache_key.ts +++ b/src/app/cache_key.ts @@ -1,6 +1,12 @@ +import { ConfirmParam } from "@App/runtime/service_worker/permission_verify"; + export default class CacheKey { // 加载脚本信息时的缓存 static scriptInstallInfo(uuid: string): string { return `scriptInfo:${uuid}`; } + + static permissionConfirm(scriptUuid: string, confirm: ConfirmParam): string { + return `permission:${scriptUuid}:${confirm.permissionValue || ""}:${confirm.permission || ""}`; + } } diff --git a/src/app/repo/permission.ts b/src/app/repo/permission.ts index 39edb21..0db6dde 100644 --- a/src/app/repo/permission.ts +++ b/src/app/repo/permission.ts @@ -1,8 +1,7 @@ -import { DAO, db } from "./dao"; +import { Repo } from "./repo"; export interface Permission { - id: number; - scriptId: number; + uuid: string; permission: string; permissionValue: string; allow: boolean; @@ -10,11 +9,20 @@ export interface Permission { updatetime: number; } -export class PermissionDAO extends DAO { - public tableName = "permission"; - +export class PermissionDAO extends Repo { constructor() { - super(); - this.table = db.table(this.tableName); + super("permission"); + } + + key(model: Permission) { + return model.uuid + ":" + model.permission + ":" + model.permissionValue; + } + + findByKey(uuid: string, permission: string, permissionValue: string) { + return this.get(uuid + ":" + permission + ":" + permissionValue); + } + + save(value: Permission) { + return super._save(this.key(value), value); } } diff --git a/src/app/repo/scripts.ts b/src/app/repo/scripts.ts index 6412aec..d36ed76 100644 --- a/src/app/repo/scripts.ts +++ b/src/app/repo/scripts.ts @@ -18,7 +18,7 @@ export const SCRIPT_RUN_STATUS_RUNNING: SCRIPT_RUN_STATUS = "running"; export const SCRIPT_RUN_STATUS_COMPLETE: SCRIPT_RUN_STATUS = "complete"; export const SCRIPT_RUN_STATUS_ERROR: SCRIPT_RUN_STATUS = "error"; -export type Metadata = { [key: string]: string[] }; +export type Metadata = { [key: string]: string[] | undefined }; export type ConfigType = "text" | "checkbox" | "select" | "mult-select" | "number" | "textarea" | "time"; @@ -91,7 +91,7 @@ export class ScriptDAO extends Repo