From a849db0565bdf60e3f77fdfa2c9cf3dc88c4a6b8 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Mon, 17 Nov 2025 20:26:35 +0900 Subject: [PATCH 1/7] =?UTF-8?q?VSCodeConnect=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/offscreen/client.ts | 4 +- src/app/service/offscreen/index.ts | 4 +- src/app/service/offscreen/vscode-connect.ts | 192 ++++++++++++-------- src/app/service/service_worker/client.ts | 4 +- 4 files changed, 124 insertions(+), 80 deletions(-) diff --git a/src/app/service/offscreen/client.ts b/src/app/service/offscreen/client.ts index d24624b2b..0191c8649 100644 --- a/src/app/service/offscreen/client.ts +++ b/src/app/service/offscreen/client.ts @@ -2,7 +2,7 @@ import { type WindowMessage } from "@Packages/message/window_message"; import type { SCRIPT_RUN_STATUS, ScriptRunResource } from "@App/app/repo/scripts"; import { Client, sendMessage } from "@Packages/message/client"; import type { MessageSend } from "@Packages/message/types"; -import { type VSCodeConnect } from "./vscode-connect"; +import type { VSCodeConnectParam } from "./vscode-connect"; export function preparationSandbox(windowMessage: WindowMessage) { return sendMessage(windowMessage, "offscreen/preparationSandbox"); @@ -42,7 +42,7 @@ export class VscodeConnectClient extends Client { super(msgSender, "offscreen/vscodeConnect"); } - connect(params: Parameters[0]): ReturnType { + connect(params: VSCodeConnectParam): Promise { return this.do("connect", params); } } diff --git a/src/app/service/offscreen/index.ts b/src/app/service/offscreen/index.ts index 66836e735..a757e5335 100644 --- a/src/app/service/offscreen/index.ts +++ b/src/app/service/offscreen/index.ts @@ -58,8 +58,8 @@ export class OffscreenManager { const gmApi = new GMApi(this.windowServer.group("gmApi")); gmApi.init(); - const vscodeConnect = new VSCodeConnect(this.windowServer.group("vscodeConnect"), this.extMsgSender); - vscodeConnect.init(); + const vscodeConnectServer = this.windowServer.group("vscodeConnect"); + new VSCodeConnect(vscodeConnectServer, this.extMsgSender); this.windowServer.on("createObjectURL", async (params: { data: Blob; persistence: boolean }) => { const url = URL.createObjectURL(params.data); diff --git a/src/app/service/offscreen/vscode-connect.ts b/src/app/service/offscreen/vscode-connect.ts index dcb3a31b9..32807428d 100644 --- a/src/app/service/offscreen/vscode-connect.ts +++ b/src/app/service/offscreen/vscode-connect.ts @@ -5,99 +5,143 @@ import type { MessageSend } from "@Packages/message/types"; import { ScriptClient } from "../service_worker/client"; import { v5 as uuidv5 } from "uuid"; +/* ---------- Types ---------- */ +export type VSCodeConnectParam = { url: string; reconnect: boolean }; + +/** Actions received from VSCode WebSocket */ +enum VSCodeAction { + Hello = "hello", + OnChange = "onchange", +} + +/* ---------- Main Class ---------- */ // 在offscreen下与scriptcat-vscode建立websocket连接 // 需要在vscode中安装scriptcat-vscode插件 export class VSCodeConnect { - logger: Logger = LoggerCore.logger().with({ service: "VSCodeConnect" }); + private readonly logger: Logger = LoggerCore.logger().with({ service: "VSCodeConnect" }); - reconnect: boolean = false; + private ws: WebSocket | undefined; - wsConnect: WebSocket | undefined; + private timerId: number | NodeJS.Timeout | undefined; - connectVSCodeTimer: any; - - scriptClient: ScriptClient; + private readonly scriptClient: ScriptClient; constructor( - private group: Group, - private msgSender: MessageSend + vscodeConnectServer: Group, + private readonly msgSender: MessageSend ) { this.scriptClient = new ScriptClient(this.msgSender); + vscodeConnectServer.on("connect", (param: VSCodeConnectParam) => this.connect(param)); } - connect({ url, reconnect }: { url: string; reconnect: boolean }) { - // 如果已经连接,断开重连 - if (this.wsConnect) { - this.wsConnect.close(); - } - // 清理老的定时器 - if (this.connectVSCodeTimer) { - clearInterval(this.connectVSCodeTimer); - this.connectVSCodeTimer = undefined; - } - const handler = () => { - if (!this.wsConnect) { - return this.connectVSCode({ url }); - } - return Promise.resolve(); + /* ---------- Public API ---------- */ + /** 启动(或重新启动)与 VSCode 的连接 */ + public connect({ url, reconnect }: VSCodeConnectParam): Promise { + const doReconnect = () => { + // 如果已经连接,断开重连 + this.closeExisting(); + this.clearTimer(); + this.timerId = setTimeout(connectVSCode, 100); }; - if (reconnect) { - this.connectVSCodeTimer = setInterval(() => { - handler(); - }, 30 * 1000); - } - return handler(); - } + const connectVSCode = () => { + if (this.ws) return; // 已连接则忽略 + return new Promise((resolve, reject) => { + let ws; + try { + ws = new WebSocket(url); + } catch (e: any) { + this.logger.debug("connect vscode faild", Logger.E(e)); + reject(e); + return; + } + let connectOK = false; + ws.addEventListener("open", () => { + ws.send('{"action":"hello"}'); + connectOK = true; + // 如重复连接,则清除之前的 + if (this.ws) { + this.closeExisting(); + } + this.ws = ws; + resolve(); + this.clearTimer(); + }); + ws.addEventListener("message", (ev) => { + this.handleMessage(ev).catch((err) => { + this.logger.error("message handler error", Logger.E(err)); + }); + }); - // 连接到vscode - connectVSCode({ url }: { url: string }) { - return new Promise((resolve, reject) => { - // 如果已经连接,断开重连 - if (this.wsConnect) { - this.wsConnect.close(); - } - try { - this.wsConnect = new WebSocket(url); - } catch (e: any) { - this.logger.debug("connect vscode faild", Logger.E(e)); - reject(e); - return; - } - let ok = false; - this.wsConnect.addEventListener("open", () => { - this.wsConnect!.send('{"action":"hello"}'); - ok = true; - resolve(); - }); - this.wsConnect.addEventListener("message", async (ev) => { - const data = JSON.parse(ev.data); - switch (data.action) { - case "onchange": { - // 调用安装脚本接口 - const code = data.data.script; - this.scriptClient.installByCode(uuidv5(data.data.uri, uuidv5.URL), code, "vscode"); - break; + ws.addEventListener("error", (e) => { + this.ws = undefined; + this.logger.debug("connect vscode faild", Logger.E(e)); + if (!connectOK) { + reject(new Error("connect fail")); } - default: - } - }); + if (reconnect) doReconnect(); + }); - this.wsConnect.addEventListener("error", (e) => { - this.wsConnect = undefined; - this.logger.debug("connect vscode faild", Logger.E(e)); - if (!ok) { - reject(new Error("connect fail")); - } + ws.addEventListener("close", () => { + this.ws = undefined; + this.logger.debug("vscode connection closed"); + if (reconnect) doReconnect(); + }); + // 如 open, close, error 都不发生,30 秒后reject + this.clearTimer(); + this.timerId = setTimeout(() => { + if (!connectOK) { + reject(new Error("Timeout")); + try { + ws.close(); + } catch (e) { + console.error(e); + } + if (reconnect) doReconnect(); + } + }, 30_000); }); + }; + // 如果已经连接,断开重连 + this.closeExisting(); + // 清理老的定时器 + this.clearTimer(); + return Promise.resolve().then(() => connectVSCode()); + } - this.wsConnect.addEventListener("close", () => { - this.wsConnect = undefined; - this.logger.debug("vscode connection closed"); - }); - }); + /* ---------- Message Handling ---------- */ + private async handleMessage(ev: MessageEvent): Promise { + let data: any; + try { + data = JSON.parse(ev.data as string); + } catch { + return; // ignore malformed JSON + } + switch (data.action as VSCodeAction) { + case VSCodeAction.OnChange: { + // 调用安装脚本接口 + const { script, uri } = data.data; + const id = uuidv5(uri, uuidv5.URL); + await this.scriptClient.installByCode(id, script, "vscode"); + break; + } + default: + // ignore unknown actions + } } - init() { - this.group.on("connect", this.connect.bind(this)); + /* ---------- Helpers ---------- */ + private closeExisting(): void { + try { + this.ws?.close(); + } catch (e: any) { + console.error(e); + } + this.ws = undefined; + } + private clearTimer(): void { + if (this.timerId) { + clearTimeout(this.timerId); + this.timerId = undefined; + } } } diff --git a/src/app/service/service_worker/client.ts b/src/app/service/service_worker/client.ts index 94f2642d2..7898a1eea 100644 --- a/src/app/service/service_worker/client.ts +++ b/src/app/service/service_worker/client.ts @@ -12,7 +12,7 @@ import { v4 as uuidv4 } from "uuid"; import { cacheInstance } from "@App/app/cache"; import { CACHE_KEY_IMPORT_FILE } from "@App/app/cache_key"; import { type ResourceBackup } from "@App/pkg/backup/struct"; -import { type VSCodeConnect } from "../offscreen/vscode-connect"; +import type { VSCodeConnectParam, VSCodeConnect } from "../offscreen/vscode-connect"; import { type SystemService } from "./system"; import { type ScriptInfo } from "@App/pkg/utils/scriptInstall"; import type { ScriptService, TCheckScriptUpdateOption, TOpenBatchUpdatePageOption } from "./script"; @@ -393,7 +393,7 @@ export class SystemClient extends Client { super(msgSender, "serviceWorker/system"); } - connectVSCode(params: Parameters[0]): ReturnType { + connectVSCode(params: VSCodeConnectParam): ReturnType { return this.do("connectVSCode", params); } From 41f54863cf060383c2ab98a6cd77e370d09c8889 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:57:01 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/offscreen/index.ts | 4 ++-- src/app/service/offscreen/vscode-connect.ts | 17 ++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/app/service/offscreen/index.ts b/src/app/service/offscreen/index.ts index a757e5335..ebe4116c0 100644 --- a/src/app/service/offscreen/index.ts +++ b/src/app/service/offscreen/index.ts @@ -58,8 +58,8 @@ export class OffscreenManager { const gmApi = new GMApi(this.windowServer.group("gmApi")); gmApi.init(); - const vscodeConnectServer = this.windowServer.group("vscodeConnect"); - new VSCodeConnect(vscodeConnectServer, this.extMsgSender); + const vsCodeConnect = new VSCodeConnect(this.windowServer, this.extMsgSender); + vsCodeConnect.init(); this.windowServer.on("createObjectURL", async (params: { data: Blob; persistence: boolean }) => { const url = URL.createObjectURL(params.data); diff --git a/src/app/service/offscreen/vscode-connect.ts b/src/app/service/offscreen/vscode-connect.ts index 32807428d..a2080ffe4 100644 --- a/src/app/service/offscreen/vscode-connect.ts +++ b/src/app/service/offscreen/vscode-connect.ts @@ -1,6 +1,6 @@ import LoggerCore from "@App/app/logger/core"; import Logger from "@App/app/logger/logger"; -import { type Group } from "@Packages/message/server"; +import type { Server, Group } from "@Packages/message/server"; import type { MessageSend } from "@Packages/message/types"; import { ScriptClient } from "../service_worker/client"; import { v5 as uuidv5 } from "uuid"; @@ -26,12 +26,15 @@ export class VSCodeConnect { private readonly scriptClient: ScriptClient; - constructor( - vscodeConnectServer: Group, - private readonly msgSender: MessageSend - ) { - this.scriptClient = new ScriptClient(this.msgSender); - vscodeConnectServer.on("connect", (param: VSCodeConnectParam) => this.connect(param)); + private readonly vscodeConnectGroup: Group; + + constructor(windowServer: Server, msgSender: MessageSend) { + this.vscodeConnectGroup = windowServer.group("vscodeConnect"); + this.scriptClient = new ScriptClient(msgSender); + } + + init() { + this.vscodeConnectGroup.on("connect", (param: VSCodeConnectParam) => this.connect(param)); } /* ---------- Public API ---------- */ From 9a9e9b6844b983cfb75f870164eef07694b06ea4 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Sat, 27 Dec 2025 07:59:03 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/offscreen/vscode-connect.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/service/offscreen/vscode-connect.ts b/src/app/service/offscreen/vscode-connect.ts index a2080ffe4..661b2a16e 100644 --- a/src/app/service/offscreen/vscode-connect.ts +++ b/src/app/service/offscreen/vscode-connect.ts @@ -46,8 +46,8 @@ export class VSCodeConnect { this.clearTimer(); this.timerId = setTimeout(connectVSCode, 100); }; - const connectVSCode = () => { - if (this.ws) return; // 已连接则忽略 + const connectVSCode: () => Promise = () => { + if (this.ws) return Promise.resolve(); // 已连接则忽略 return new Promise((resolve, reject) => { let ws; try { From ee6afa20c712886bcddc184f848825bc94e20b00 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Sat, 27 Dec 2025 09:36:51 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/offscreen/vscode-connect.ts | 220 ++++++++++++-------- 1 file changed, 134 insertions(+), 86 deletions(-) diff --git a/src/app/service/offscreen/vscode-connect.ts b/src/app/service/offscreen/vscode-connect.ts index 661b2a16e..1de9d5bf6 100644 --- a/src/app/service/offscreen/vscode-connect.ts +++ b/src/app/service/offscreen/vscode-connect.ts @@ -5,135 +5,182 @@ import type { MessageSend } from "@Packages/message/types"; import { ScriptClient } from "../service_worker/client"; import { v5 as uuidv5 } from "uuid"; -/* ---------- Types ---------- */ -export type VSCodeConnectParam = { url: string; reconnect: boolean }; +/* ---------- 类型定义 ---------- */ +export type VSCodeConnectParam = { url: string; reconnect: boolean }; // 连接参数:WebSocket地址和是否自动重连 -/** Actions received from VSCode WebSocket */ +/** 从VSCode WebSocket接收的动作类型 */ enum VSCodeAction { - Hello = "hello", - OnChange = "onchange", + Hello = "hello", // VSCode问候消息 + OnChange = "onchange", // 文件变更通知 } -/* ---------- Main Class ---------- */ -// 在offscreen下与scriptcat-vscode建立websocket连接 -// 需要在vscode中安装scriptcat-vscode插件 +class WebSocketExtended extends WebSocket { + _handlers: Record void> = {}; + _isConnected: boolean = false; + addEventListeners() { + for (const [eventName, handler] of Object.entries(this._handlers)) { + this.addEventListener(eventName, handler); + } + } + removeEventListeners() { + for (const [eventName, handler] of Object.entries(this._handlers)) { + this.removeEventListener(eventName, handler); + } + } +} + +/* ---------- 主类 ---------- */ +// 在offscreen文档中与scriptcat-vscode插件建立WebSocket连接 +// 前提:VSCode需安装scriptcat-vscode扩展 export class VSCodeConnect { private readonly logger: Logger = LoggerCore.logger().with({ service: "VSCodeConnect" }); - private ws: WebSocket | undefined; + private ws: WebSocketExtended | undefined; // 当前WebSocket实例 - private timerId: number | NodeJS.Timeout | undefined; + private timerId: ReturnType | undefined; // 连接超时定时器 - private readonly scriptClient: ScriptClient; + private readonly scriptClient: ScriptClient; // 用于安装脚本的客户端 - private readonly vscodeConnectGroup: Group; + private readonly vscodeConnectGroup: Group; // 消息分组,用于接收连接指令 + + private mParam: VSCodeConnectParam | undefined; constructor(windowServer: Server, msgSender: MessageSend) { this.vscodeConnectGroup = windowServer.group("vscodeConnect"); this.scriptClient = new ScriptClient(msgSender); } + /** 初始化消息监听 */ init() { this.vscodeConnectGroup.on("connect", (param: VSCodeConnectParam) => this.connect(param)); } + doReconnect(): void { + this.clearTimer(); + this.closeExisting(); // 如果已经连接,先关闭已有连接 + // 旧连接已清除 + this.timerId = setTimeout(() => this.connectVSCode(), 100); // 稍后重试 + } - /* ---------- Public API ---------- */ - /** 启动(或重新启动)与 VSCode 的连接 */ - public connect({ url, reconnect }: VSCodeConnectParam): Promise { - const doReconnect = () => { - // 如果已经连接,断开重连 - this.closeExisting(); - this.clearTimer(); - this.timerId = setTimeout(connectVSCode, 100); - }; - const connectVSCode: () => Promise = () => { - if (this.ws) return Promise.resolve(); // 已连接则忽略 - return new Promise((resolve, reject) => { - let ws; - try { - ws = new WebSocket(url); - } catch (e: any) { - this.logger.debug("connect vscode faild", Logger.E(e)); - reject(e); - return; - } - let connectOK = false; - ws.addEventListener("open", () => { - ws.send('{"action":"hello"}'); - connectOK = true; - // 如重复连接,则清除之前的 + connectVSCode(): Promise { + const { url, reconnect } = this.mParam!; // 在初次连接 / 重连接时,取最后 mParam 的值。 + return new Promise((resolve, reject) => { + if (this.ws) { + this.logger.debug("unexpected error: vscode was connected."); + reject("vscode was connected"); + return; + } + try { + this.ws = new WebSocketExtended(url); + } catch (e: any) { + this.logger.debug("connect vscode failed", Logger.E(e)); // 连接VSCode失败 + reject(e); + return; + } + this.ws._handlers = { + open: () => { if (this.ws) { - this.closeExisting(); + this.clearTimer(); // 已触发 open, 清除30秒超时器 + this.ws.send('{"action":"hello"}'); // 发送问候 + this.ws._isConnected = true; + resolve(); } - this.ws = ws; - resolve(); - this.clearTimer(); - }); - ws.addEventListener("message", (ev) => { - this.handleMessage(ev).catch((err) => { - this.logger.error("message handler error", Logger.E(err)); - }); - }); - - ws.addEventListener("error", (e) => { - this.ws = undefined; - this.logger.debug("connect vscode faild", Logger.E(e)); - if (!connectOK) { - reject(new Error("connect fail")); + }, + message: (ev: MessageEvent) => { + if (this.ws) { + this.handleMessage(ev).catch((err) => { + this.logger.error("message handler error", Logger.E(err)); // 处理消息出错 + }); } - if (reconnect) doReconnect(); - }); - - ws.addEventListener("close", () => { - this.ws = undefined; - this.logger.debug("vscode connection closed"); - if (reconnect) doReconnect(); - }); - // 如 open, close, error 都不发生,30 秒后reject - this.clearTimer(); - this.timerId = setTimeout(() => { - if (!connectOK) { - reject(new Error("Timeout")); - try { - ws.close(); - } catch (e) { - console.error(e); + }, + error: (e: Event) => { + if (this.ws) { + const connectOK = this.ws._isConnected; // 已触发 open + this.clearTimer(); // 已触发 error, 清除30秒超时器 + this.ws.removeEventListeners(); + this.ws = undefined; // error / close / timeout 时清除 this.ws + this.logger.debug("connect vscode failed", Logger.E(e)); // 连接错误 + if (!connectOK) { + // 未触发 open + reject(new Error("connect fail")); } - if (reconnect) doReconnect(); + if (reconnect) this.doReconnect(); } - }, 30_000); - }); - }; - // 如果已经连接,断开重连 - this.closeExisting(); - // 清理老的定时器 - this.clearTimer(); - return Promise.resolve().then(() => connectVSCode()); + }, + close: () => { + if (this.ws) { + this.clearTimer(); // 已触发 close, 清除30秒超时器 + this.ws.removeEventListeners(); + this.ws = undefined; // error / close / timeout 时清除 this.ws + this.logger.debug("vscode connection closed"); // VSCode连接已关闭 + if (reconnect) this.doReconnect(); + } + }, + }; + this.ws.addEventListeners(); + + // 30秒超时处理: 如 open, close, error 都不发生,30 秒后reject + this.clearTimer(); + this.timerId = setTimeout(() => { + if (!this.ws) { + this.logger.debug("unexpected error: vscode connection is undefined."); + return; + } + if (this.ws?._isConnected) { + this.logger.debug("unexpected error: vscode was connected."); + return; + } + this.ws.removeEventListeners(); // 浏览器触发的 close 动作不需要消息处理 + try { + this.ws.close(); + } catch (e) { + console.error(e); + } + this.ws = undefined; // error / close / timeout 时清除 this.ws + this.logger.debug("vscode connection timeout"); // VSCode连接Timeout + reject(new Error("Timeout")); + if (reconnect) this.doReconnect(); + }, 30_000); + }); + } + + /* ---------- 公共方法 ---------- */ + /** 连接(或重连)到VSCode的WebSocket服务 */ + public connect({ url, reconnect }: VSCodeConnectParam): Promise { + this.mParam = { url, reconnect }; + this.clearTimer(); // 清理老的定时器 + this.closeExisting(); // 如果已经连接,连接前先关闭旧连接 + // 旧连接已清除 + return this.connectVSCode(); } - /* ---------- Message Handling ---------- */ + /* ---------- 消息处理 ---------- */ + /** 处理从VSCode收到的消息 */ private async handleMessage(ev: MessageEvent): Promise { let data: any; + const evData = ev.data; + if (typeof evData !== "string") return; try { - data = JSON.parse(ev.data as string); + data = JSON.parse(evData); } catch { - return; // ignore malformed JSON + return; // 忽略格式错误的JSON } switch (data.action as VSCodeAction) { case VSCodeAction.OnChange: { - // 调用安装脚本接口 + // 当VSCode通知脚本文件变更时,自动安装/更新脚本 const { script, uri } = data.data; - const id = uuidv5(uri, uuidv5.URL); + const id = uuidv5(uri, uuidv5.URL); // 用uri生成稳定脚本ID await this.scriptClient.installByCode(id, script, "vscode"); break; } default: - // ignore unknown actions + // 忽略未知动作 } } - /* ---------- Helpers ---------- */ + /* ---------- 辅助方法 ---------- */ + /** 关闭已有WebSocket连接 */ private closeExisting(): void { + this.ws?.removeEventListeners(); // 浏览器触发的 close 动作不需要消息处理 try { this.ws?.close(); } catch (e: any) { @@ -141,6 +188,7 @@ export class VSCodeConnect { } this.ws = undefined; } + /** 清除超时定时器 */ private clearTimer(): void { if (this.timerId) { clearTimeout(this.timerId); From a28102e4d690d442c7bd344e02f5427144e3358d Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Sat, 27 Dec 2025 09:40:14 +0900 Subject: [PATCH 5/7] =?UTF-8?q?Service=20=E5=BA=94=E8=AF=A5=E5=9C=A8?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0=E4=B8=AD=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=20Group=20=E5=AF=B9=E8=B1=A1=E4=BD=9C=E4=B8=BA=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/offscreen/index.ts | 2 +- src/app/service/offscreen/vscode-connect.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/service/offscreen/index.ts b/src/app/service/offscreen/index.ts index 0bf7d39ab..2fd63ae67 100644 --- a/src/app/service/offscreen/index.ts +++ b/src/app/service/offscreen/index.ts @@ -59,7 +59,7 @@ export class OffscreenManager { const gmApi = new GMApi(this.windowServer.group("gmApi")); gmApi.init(); - const vsCodeConnect = new VSCodeConnect(this.windowServer, this.extMsgSender); + const vsCodeConnect = new VSCodeConnect(this.windowServer.group("vscodeConnect"), this.extMsgSender); vsCodeConnect.init(); this.windowServer.on("createObjectURL", async (params: { blob: Blob; persistence: boolean }) => { diff --git a/src/app/service/offscreen/vscode-connect.ts b/src/app/service/offscreen/vscode-connect.ts index 1de9d5bf6..8078d30f6 100644 --- a/src/app/service/offscreen/vscode-connect.ts +++ b/src/app/service/offscreen/vscode-connect.ts @@ -1,6 +1,6 @@ import LoggerCore from "@App/app/logger/core"; import Logger from "@App/app/logger/logger"; -import type { Server, Group } from "@Packages/message/server"; +import type { Group } from "@Packages/message/server"; import type { MessageSend } from "@Packages/message/types"; import { ScriptClient } from "../service_worker/client"; import { v5 as uuidv5 } from "uuid"; @@ -45,8 +45,8 @@ export class VSCodeConnect { private mParam: VSCodeConnectParam | undefined; - constructor(windowServer: Server, msgSender: MessageSend) { - this.vscodeConnectGroup = windowServer.group("vscodeConnect"); + constructor(vscodeConnectGroup: Group, msgSender: MessageSend) { + this.vscodeConnectGroup = vscodeConnectGroup; this.scriptClient = new ScriptClient(msgSender); } From ecde7d2c7ce82b18d0e8fbee68cea987b1ec8769 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Sat, 27 Dec 2025 09:48:53 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/offscreen/vscode-connect.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/service/offscreen/vscode-connect.ts b/src/app/service/offscreen/vscode-connect.ts index 8078d30f6..9eadf5a69 100644 --- a/src/app/service/offscreen/vscode-connect.ts +++ b/src/app/service/offscreen/vscode-connect.ts @@ -101,17 +101,22 @@ export class VSCodeConnect { this.logger.debug("connect vscode failed", Logger.E(e)); // 连接错误 if (!connectOK) { // 未触发 open - reject(new Error("connect fail")); + reject(new Error("connect fail before open")); } if (reconnect) this.doReconnect(); } }, close: () => { if (this.ws) { + const connectOK = this.ws._isConnected; // 已触发 open this.clearTimer(); // 已触发 close, 清除30秒超时器 this.ws.removeEventListeners(); this.ws = undefined; // error / close / timeout 时清除 this.ws this.logger.debug("vscode connection closed"); // VSCode连接已关闭 + if (!connectOK) { + // 未触发 open + reject(new Error("connect closed before open")); + } if (reconnect) this.doReconnect(); } }, From bb17bb1ff12f5c703255aeb25379c1e6c88ab67e Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Sat, 27 Dec 2025 09:55:44 +0900 Subject: [PATCH 7/7] vsCodeConnect -> vscodeConnect --- src/app/service/offscreen/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/service/offscreen/index.ts b/src/app/service/offscreen/index.ts index 2fd63ae67..50c4d8c4d 100644 --- a/src/app/service/offscreen/index.ts +++ b/src/app/service/offscreen/index.ts @@ -59,8 +59,8 @@ export class OffscreenManager { const gmApi = new GMApi(this.windowServer.group("gmApi")); gmApi.init(); - const vsCodeConnect = new VSCodeConnect(this.windowServer.group("vscodeConnect"), this.extMsgSender); - vsCodeConnect.init(); + const vscodeConnect = new VSCodeConnect(this.windowServer.group("vscodeConnect"), this.extMsgSender); + vscodeConnect.init(); this.windowServer.on("createObjectURL", async (params: { blob: Blob; persistence: boolean }) => { return makeBlobURL(params) as string;