Skip to content

Commit 556c493

Browse files
cyfung1031CodFrmCopilot
authored
♻️ ScriptMatchInfo 相关代码优化 (#653)
* ScriptMatchInfo 相关代码优化 * 不能使用delete * ruleContent 不能含有 RegExp * 修复后台脚本资源 * SUFFIX含义 * Update src/app/service/service_worker/runtime.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/app/service/service_worker/runtime.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * 增加注释 * oriMetadata -> originalMetadata * n和s修改为 key、valueSet 之类的名字是不是更直观一点 * a=>value & e=>item & 空值 * 类型定义的 UserConfig * bExclude -> isExclude * 可以修改为 const arr = Object.entries(data).sort(([, a], [, b]) => a.sort! - b.sort!); 这种链式 * SCMetadata是确定了类型的,只会为 string[]|undefined,可以不用做这么多判断selfMetadataUpdate * 用不到第一个成员 * 用不到第一个成员(2) * 添加单元测试 * selfMetadata! -> selfMetadata * 增加单元测试 * 补充单元测试 * 添加单元测试 * metaCustom? -> metaCustom? * 一般情况下请不要直接访问 loadingScript 此变数 (私有变数) --------- Co-authored-by: 王一之 <yz@ggnb.top> Co-authored-by: wangyizhi <i@xloli.top> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent f8eafb7 commit 556c493

14 files changed

Lines changed: 660 additions & 183 deletions

File tree

src/app/repo/scripts.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ export interface ScriptRunResource extends Script {
8181
value: { [key: string]: any };
8282
flag: string;
8383
resource: { [key: string]: { base64?: string } & Omit<Resource, "base64"> }; // 资源列表,包含脚本需要的资源
84+
metadata: SCMetadata; // 经自定义覆盖的 Metadata
85+
originalMetadata: SCMetadata; // 原本的 Metadata (目前只需要 match, include, exclude)
8486
}
8587

8688
export class ScriptDAO extends Repo<Script> {

src/app/service/content/exec_script.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ export default class ExecScript {
3434
this.scriptRes = scriptRes;
3535
this.logger = LoggerCore.getInstance().logger({
3636
component: "exec",
37-
uuid: this.scriptRes.uuid,
38-
name: this.scriptRes.name,
37+
uuid: scriptRes.uuid,
38+
name: scriptRes.name,
3939
});
40-
const GM_info = evaluateGMInfo(envInfo, this.scriptRes);
40+
const GM_info = evaluateGMInfo(envInfo, scriptRes);
4141
// 构建脚本资源
4242
if (typeof code === "string") {
4343
this.scriptFunc = compileScript(code);

src/app/service/content/gm_info.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { ExtVersion } from "@App/app/const";
2-
import { parseUserConfig } from "@App/pkg/utils/yaml";
32
import type { GMInfoEnv } from "./types";
43
import type { ScriptLoadInfo } from "../service_worker/types";
54

@@ -28,7 +27,7 @@ export function evaluateGMInfo(envInfo: GMInfoEnv, script: ScriptLoadInfo) {
2827
// "" => null
2928
scriptUpdateURL: script.downloadUrl || null,
3029
scriptMetaStr: script.metadataStr,
31-
userConfig: parseUserConfig(script.userConfigStr),
30+
userConfig: script.userConfig,
3231
userConfigStr: script.userConfigStr,
3332
// scriptSource: script.sourceCode,
3433
version: ExtVersion,

src/app/service/sandbox/runtime.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import { proxyUpdateRunStatus } from "../offscreen/client";
1414
import { BgExecScriptWarp } from "../content/exec_warp";
1515
import type ExecScript from "../content/exec_script";
1616
import type { ValueUpdateData } from "../content/types";
17-
import { getStorageName } from "@App/pkg/utils/utils";
17+
import { getStorageName, getMetadataStr, getUserConfigStr } from "@App/pkg/utils/utils";
1818
import type { EmitEventRequest, ScriptLoadInfo } from "../service_worker/types";
1919
import { CATRetryError } from "../content/exec_warp";
20-
import { getMetadataStr, getUserConfigStr } from "@App/pkg/utils/utils";
20+
import { parseUserConfig } from "@App/pkg/utils/yaml";
2121

2222
export class Runtime {
2323
cronJob: Map<string, Array<CronJob>> = new Map();
@@ -83,15 +83,21 @@ export class Runtime {
8383
if (this.execScripts.has(script.uuid)) {
8484
await this.disableScript(script.uuid);
8585
}
86-
const loadScript = script as ScriptLoadInfo;
87-
loadScript.metadataStr = getMetadataStr(script.code) || "";
88-
loadScript.userConfigStr = getUserConfigStr(script.code) || "";
86+
const metadataStr = getMetadataStr(script.code) || "";
87+
const userConfigStr = getUserConfigStr(script.code) || "";
88+
const userConfig = parseUserConfig(userConfigStr);
89+
const loadScript = {
90+
...script,
91+
metadataStr,
92+
userConfigStr,
93+
userConfig,
94+
} as ScriptLoadInfo;
8995
if (script.type === SCRIPT_TYPE_BACKGROUND) {
9096
// 后台脚本直接运行起来
9197
return this.execScript(loadScript);
9298
} else {
9399
// 定时脚本加入定时任务
94-
await this.stopCronJob(script.uuid);
100+
this.stopCronJob(script.uuid);
95101
return this.crontabScript(loadScript);
96102
}
97103
}
@@ -164,7 +170,7 @@ export class Runtime {
164170
return ret;
165171
}
166172

167-
private crontabSripts: ScriptLoadInfo[] = [];
173+
private crontabSripts: ScriptRunResource[] = [];
168174

169175
crontabScript(script: ScriptLoadInfo) {
170176
// 执行定时脚本 运行表达式
@@ -299,9 +305,15 @@ export class Runtime {
299305
if (exec) {
300306
await this.stopScript(script.uuid);
301307
}
302-
const loadScript = script as ScriptLoadInfo;
303-
loadScript.metadataStr = getMetadataStr(script.code) || "";
304-
loadScript.userConfigStr = getUserConfigStr(script.code) || "";
308+
const metadataStr = getMetadataStr(script.code) || "";
309+
const userConfigStr = getUserConfigStr(script.code) || "";
310+
const userConfig = parseUserConfig(userConfigStr);
311+
const loadScript = {
312+
...script,
313+
metadataStr,
314+
userConfigStr,
315+
userConfig,
316+
} as ScriptLoadInfo;
305317
return this.execScript(loadScript, true);
306318
}
307319

src/app/service/service_worker/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ export class ScriptClient extends Client {
6666
return this.doThrow("getScriptRunResource", script);
6767
}
6868

69-
excludeUrl(uuid: string, url: string, remove: boolean) {
70-
return this.do("excludeUrl", { uuid, url, remove });
69+
excludeUrl(uuid: string, excludePattern: string, remove: boolean) {
70+
return this.do("excludeUrl", { uuid, excludePattern, remove });
7171
}
7272

7373
// 重置匹配项

src/app/service/service_worker/popup.ts

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { type MessageQueue } from "@Packages/message/message_queue";
22
import { type Group } from "@Packages/message/server";
33
import type { ExtMessageSender } from "@Packages/message/types";
44
import { type RuntimeService } from "./runtime";
5-
import type { ScriptMatchInfo, ScriptMenu } from "./types";
5+
import type { TScriptMatchInfoEntry, ScriptMenu } from "./types";
66
import type { GetPopupDataReq, GetPopupDataRes } from "./client";
77
import { cacheInstance } from "@App/app/cache";
88
import type { Script, ScriptDAO } from "@App/app/repo/scripts";
@@ -161,14 +161,14 @@ export class PopupService {
161161
runNum: script.type === SCRIPT_TYPE_NORMAL ? 0 : script.runStatus === SCRIPT_RUN_STATUS_RUNNING ? 1 : 0,
162162
runNumByIframe: 0,
163163
menus: [],
164-
customUrlPatterns: (script as ScriptMatchInfo).customUrlPatterns || null,
164+
isEffective: null,
165165
};
166166
}
167167

168168
// 获取popup页面数据
169169
async getPopupData(req: GetPopupDataReq): Promise<GetPopupDataRes> {
170-
const [scripts, runScripts, backScriptList] = await Promise.all([
171-
this.runtime.getPageScriptByUrl(req.url, true),
170+
const [matchingResult, runScripts, backScriptList] = await Promise.all([
171+
this.runtime.getPageScriptMatchingResultByUrl(req.url, true),
172172
this.getScriptMenu(req.tabId),
173173
this.getScriptMenu(-1),
174174
]);
@@ -177,15 +177,17 @@ export class PopupService {
177177
// 合并后结果
178178
const scriptMenuMap = new Map<string, ScriptMenu>();
179179
// 合并数据
180-
for (const script of scripts) {
181-
let run = runMap.get(script.uuid);
180+
for (const [uuid, o] of matchingResult) {
181+
const script = o.matchInfo || ({} as TScriptMatchInfoEntry);
182+
let run = runMap.get(uuid);
182183
if (run) {
183184
// 如果脚本已经存在,则不添加,更新信息
184185
run.enable = script.status === SCRIPT_STATUS_ENABLE;
185-
run.customUrlPatterns = script.customUrlPatterns || run.customUrlPatterns;
186+
run.isEffective = o.effective!;
186187
run.hasUserConfig = !!script.config;
187188
} else {
188189
run = this.scriptToMenu(script);
190+
run.isEffective = o.effective!;
189191
}
190192
scriptMenuMap.set(script.uuid, run);
191193
}
@@ -214,15 +216,7 @@ export class PopupService {
214216
return cacheInstance.tx<ScriptMenu[]>(cacheKey, (menu) => callback(menu || []));
215217
}
216218

217-
async addScriptRunNumber({
218-
tabId,
219-
frameId,
220-
scripts,
221-
}: {
222-
tabId: number;
223-
frameId: number;
224-
scripts: ScriptMatchInfo[];
225-
}) {
219+
async addScriptRunNumber({ tabId, frameId, scripts }: { tabId: number; frameId: number; scripts: Script[] }) {
226220
// 设置数据
227221
return await this.txUpdateScriptMenu(tabId, async (data) => {
228222
if (!frameId) {
@@ -238,6 +232,7 @@ export class PopupService {
238232
}
239233
} else {
240234
const item = this.scriptToMenu(script);
235+
item.isEffective = true;
241236
item.runNum = 1;
242237
if (frameId) {
243238
item.runNumByIframe = 1;
@@ -501,16 +496,7 @@ export class PopupService {
501496
// 监听运行次数
502497
this.mq.subscribe(
503498
"pageLoad",
504-
async ({
505-
tabId,
506-
frameId,
507-
scripts,
508-
}: {
509-
tabId: number;
510-
frameId: number;
511-
document: string;
512-
scripts: ScriptMatchInfo[];
513-
}) => {
499+
async ({ tabId, frameId, scripts }: { tabId: number; frameId: number; document: string; scripts: Script[] }) => {
514500
await this.addScriptRunNumber({ tabId, frameId, scripts });
515501
// 设置角标
516502
await this.updateBadgeIcon(tabId);

0 commit comments

Comments
 (0)