value问题处理
Some checks failed
test / Run tests (push) Failing after 3s
build / Build (push) Failing after 6s

This commit is contained in:
2025-04-09 18:05:59 +08:00
parent 9f70b7eb7a
commit 0d86dae710
18 changed files with 122 additions and 68 deletions

View File

@ -3,6 +3,8 @@ import Logger from "@App/app/logger/logger";
import { GetSender, Group, MessageConnect } from "@Packages/message/server";
export default class GMApi {
logger: Logger = LoggerCore.logger().with({ service: "gmApi" });
constructor(private group: Group) {}
async dealXhrResponse(

View File

@ -282,7 +282,6 @@ export class Runtime {
}
async runScript(script: ScriptRunResouce) {
console.log("runScript", script);
const exec = this.execScripts.get(script.uuid);
// 如果正在运行,先释放
if (exec) {

View File

@ -71,13 +71,15 @@ export default class GMApi {
}
@PermissionVerify.API()
async GM_setValue(request: Request) {
console.log("setValue", request);
async GM_setValue(request: Request, sender: GetSender) {
if (!request.params || request.params.length !== 2) {
return Promise.reject(new Error("param is failed"));
}
const [key, value] = request.params;
await this.value.setValue(request.script.uuid, key, value);
await this.value.setValue(request.script.uuid, key, value, {
runFlag: request.runFlag,
tabId: sender.getSender().tab?.id,
});
}
// 根据header生成dnr规则
@ -183,7 +185,6 @@ export default class GMApi {
@PermissionVerify.API()
GM_registerMenuCommand(request: Request, sender: GetSender) {
console.log("registerMenuCommand", request.params, sender.getSender(), sender.getSender().tab!.id!);
const [id, name, accessKey] = request.params;
// 触发菜单注册, 在popup中处理
this.mq.emit("registerMenuCommand", {

View File

@ -20,7 +20,7 @@ import {
subscribeScriptMenuRegister,
subscribeScriptRunStatus,
} from "../queue";
import { storageKey } from "@App/runtime/utils";
import { getStorageName } from "@App/runtime/utils";
export type ScriptMenuItem = {
id: number;
@ -87,7 +87,6 @@ export class PopupService {
// 移除之前所有的菜单
chrome.contextMenus.removeAll();
const [menu, backgroundMenu] = await Promise.all([this.getScriptMenu(tabId), this.getScriptMenu(-1)]);
console.log(menu, backgroundMenu, tabId);
if (!menu.length && !backgroundMenu.length) {
return;
}
@ -140,7 +139,6 @@ export class PopupService {
if (script) {
script.menus = script.menus.filter((item) => item.id !== id);
}
console.log("unregister menu", data);
this.updateScriptMenu();
return data;
});
@ -149,7 +147,6 @@ export class PopupService {
updateScriptMenu() {
// 获取当前页面并更新菜单
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
console.log("query", tabs);
if (!tabs.length) {
return;
}
@ -163,7 +160,7 @@ export class PopupService {
return {
uuid: script.uuid,
name: script.name,
storageName: storageKey(script),
storageName: getStorageName(script),
enable: script.status === SCRIPT_STATUS_ENABLE,
updatetime: script.updatetime || 0,
hasUserConfig: !!script.config,

View File

@ -194,6 +194,8 @@ export class RuntimeService {
})
);
console.log("pageLoad", enableScript);
this.mq.emit("pageLoad", {
tabId: chromeSender.tab?.id,
frameId: chromeSender.frameId,

View File

@ -2,12 +2,13 @@ import LoggerCore from "@App/app/logger/core";
import Logger from "@App/app/logger/logger";
import { Script, SCRIPT_TYPE_NORMAL, ScriptDAO } from "@App/app/repo/scripts";
import { ValueDAO } from "@App/app/repo/value";
import { storageKey } from "@App/runtime/utils";
import { getStorageName } from "@App/runtime/utils";
import { Group, MessageSend } from "@Packages/message/server";
import { RuntimeService } from "./runtime";
import { PopupService } from "./popup";
import { ValueUpdateData } from "@App/runtime/content/exec_script";
import { ValueUpdateData, ValueUpdateSender } from "@App/runtime/content/exec_script";
import { sendMessage } from "@Packages/message/client";
import Cache from "@App/app/cache";
export class ValueService {
logger: Logger;
@ -24,46 +25,50 @@ export class ValueService {
}
async getScriptValue(script: Script) {
const ret = await this.valueDAO.get(storageKey(script));
const ret = await this.valueDAO.get(getStorageName(script));
if (!ret) {
return {};
}
return ret.data;
}
async setValue(uuid: string, key: string, value: any, sender?: any): Promise<boolean> {
async setValue(uuid: string, key: string, value: any, sender: ValueUpdateSender): Promise<boolean> {
// 查询出脚本
const script = await this.scriptDAO.get(uuid);
if (!script) {
return Promise.reject(new Error("script not found"));
}
// 查询老的值
const storageName = storageKey(script);
const valueModel = await this.valueDAO.get(storageName);
const storageName = getStorageName(script);
let oldValue;
if (!valueModel) {
this.valueDAO.save(storageName, {
uuid: script.uuid,
storageName: storageName,
data: { [key]: value },
createtime: Date.now(),
updatetime: Date.now(),
});
} else {
oldValue = valueModel.data[key];
valueModel.data[key] = value;
this.valueDAO.save(storageName, valueModel);
}
// 使用事务来保证数据一致性
await Cache.getInstance().tx("setValue:" + storageName, async () => {
const valueModel = await this.valueDAO.get(storageName);
if (!valueModel) {
await this.valueDAO.save(storageName, {
uuid: script.uuid,
storageName: storageName,
data: { [key]: value },
createtime: Date.now(),
updatetime: Date.now(),
});
} else {
oldValue = valueModel.data[key];
valueModel.data[key] = value;
await this.valueDAO.save(storageName, valueModel);
}
console.log(valueModel);
return true;
});
const sendData: ValueUpdateData = {
oldValue,
sender,
value,
key,
uuid,
storageKey: storageName,
storageName: storageName,
};
// 判断是后台脚本还是前台脚本
console.log("value update", script, sendData);
if (script.type === SCRIPT_TYPE_NORMAL) {
chrome.tabs.query({}, (tabs) => {
// 推送到所有加载了本脚本的tab中