This commit is contained in:
王一之 2025-02-13 18:04:34 +08:00
parent fcf9f6fd63
commit 3d869643b4
3 changed files with 9 additions and 9 deletions

View File

@ -4,6 +4,7 @@ import { Script, ScriptDAO } from "@App/app/repo/scripts";
import { Group, MessageConnect, MessageSender } from "@Packages/message/server";
import { ValueService } from "@App/app/service/service_worker/value";
import PermissionVerify from "./permission_verify";
import { ServiceWorkerMessageSend } from "@Packages/message/window_message";
// GMApi,处理脚本的GM API调用请求
@ -30,6 +31,7 @@ export default class GMApi {
constructor(
private group: Group,
private sender: ServiceWorkerMessageSend,
private value: ValueService
) {
this.logger = LoggerCore.logger().with({ service: "runtime/gm_api" });
@ -79,7 +81,7 @@ export default class GMApi {
console.log("xml request", request, con);
// 先处理unsafe hearder
// 再发送到offscreen, 处理请求
sendMessageToOffscreen("offscreen/gmApi/requestXhr", request.params);
sendMessageToOffscreen(this.sender, "offscreen/gmApi/requestXhr", request.params);
}
start() {
@ -87,12 +89,11 @@ export default class GMApi {
}
}
export async function sendMessageToOffscreen(action: string, data?: any) {
export async function sendMessageToOffscreen(sender: ServiceWorkerMessageSend, action: string, data?: any) {
// service_worker和offscreen同时监听消息,会导致消息被两边同时接收,但是返回结果时会产生问题,导致报错
// 不进行监听的话又无法从service_worker主动发送消息
// 所以这里通过clients.matchAll()获取到所有的client,然后通过postMessage发送消息
const list = await clients.matchAll({ includeUncontrolled: true, type: "window" });
list[0].postMessage({
sender.sendMessage({
type: "sendMessage",
data: { action, data },
});

View File

@ -6,7 +6,6 @@ import { ResourceService } from "./resource";
import { ValueService } from "./value";
import { RuntimeService } from "./runtime";
import { ServiceWorkerMessageSend } from "@Packages/message/window_message";
import { sendMessageToOffscreen } from "./gm_api";
export type InstallSource = "user" | "system" | "sync" | "subscribe" | "vscode";
@ -22,10 +21,8 @@ export default class ServiceWorkerManager {
const group = this.api.group("serviceWorker");
group.on("preparationOffscreen", async () => {
// 准备好环境
sendMessageToOffscreen("aa", "aa");
await this.sender.init();
this.mq.emit("preparationOffscreen", {});
this.sender.sendMessage("test");
});
const resource = new ResourceService(group.group("resource"), this.mq);
@ -34,7 +31,7 @@ export default class ServiceWorkerManager {
value.init();
const script = new ScriptService(group.group("script"), this.mq, value, resource);
script.init();
const runtime = new RuntimeService(group.group("runtime"), this.mq, value);
const runtime = new RuntimeService(group.group("runtime"), this.sender, this.mq, value);
runtime.init();
// 测试xhr

View File

@ -4,12 +4,14 @@ import { Group } from "@Packages/message/server";
import { Script, SCRIPT_STATUS_ENABLE, SCRIPT_TYPE_NORMAL, ScriptAndCode, ScriptDAO } from "@App/app/repo/scripts";
import { ValueService } from "./value";
import GMApi from "./gm_api";
import { ServiceWorkerMessageSend } from "@Packages/message/window_message";
export class RuntimeService {
scriptDAO: ScriptDAO = new ScriptDAO();
constructor(
private group: Group,
private sender: ServiceWorkerMessageSend,
private mq: MessageQueue,
private value: ValueService
) {}
@ -53,7 +55,7 @@ export class RuntimeService {
});
// 启动gm api
const gmApi = new GMApi(this.group, this.value);
const gmApi = new GMApi(this.group, this.sender, this.value);
gmApi.start();
}