Skip to content

Commit 06c3ef7

Browse files
committed
🐛 修复vscode连接问题与同步问题
1 parent 7d2a5b2 commit 06c3ef7

File tree

6 files changed

+108
-50
lines changed

6 files changed

+108
-50
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "scriptcat",
3-
"version": "0.14.0",
3+
"version": "0.14.1",
44
"description": "脚本猫,一个可以执行用户脚本的浏览器扩展,万物皆可脚本化,让你的浏览器可以做更多的事情!",
55
"author": "CodFrm",
66
"license": "GPLv3",

src/app/service/synchronize/manager.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ export default class SynchronizeManager extends Manager {
8484
async start() {
8585
// 监听同步事件决定是否开启同步
8686
let freeSync: () => void | undefined;
87-
if (this.systemConfig.cloudSync.enable) {
88-
freeSync = await this.enableCloudSync(this.systemConfig.cloudSync);
89-
}
87+
this.systemConfig.awaitLoad().then(async () => {
88+
if (this.systemConfig.cloudSync.enable) {
89+
freeSync = await this.enableCloudSync(this.systemConfig.cloudSync);
90+
}
91+
});
9092
SystemConfig.hook.addListener(
9193
"update",
9294
async (key, value: CloudSyncConfig) => {

src/app/service/system/manager.ts

Lines changed: 79 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,35 @@ export class SystemManager extends Manager {
6060
if (details.reason === "install") {
6161
chrome.tabs.create({ url: "https://docs.scriptcat.org/" });
6262
} else if (details.reason === "update") {
63-
chrome.tabs.create({
64-
url: `https://docs.scriptcat.org/docs/change/#${ExtVersion}`,
65-
});
63+
let nid: string;
64+
chrome.notifications.create(
65+
{
66+
type: "basic",
67+
iconUrl: chrome.runtime.getURL("assets/logo.png"),
68+
title: `ScriptCat 更新到 ${ExtVersion}`,
69+
message: "ScriptCat已更新,点击查看更新日志",
70+
},
71+
(notificationId) => {
72+
nid = notificationId;
73+
}
74+
);
75+
// eslint-disable-next-line no-undef
76+
let tm: NodeJS.Timeout;
77+
const onClicked = (id: string) => {
78+
if (nid !== id) {
79+
return;
80+
}
81+
chrome.notifications.onClicked.removeListener(onClicked);
82+
chrome.tabs.create({
83+
url: `https://docs.scriptcat.org/docs/change/#${ExtVersion}`,
84+
});
85+
clearTimeout(tm);
86+
};
87+
tm = setTimeout(() => {
88+
chrome.notifications.clear(nid);
89+
chrome.notifications.onClicked.removeListener(onClicked);
90+
}, 60 * 3000);
91+
chrome.notifications.onClicked.addListener(onClicked);
6692
}
6793
});
6894
}
@@ -99,7 +125,9 @@ export class SystemManager extends Manager {
99125
);
100126
this.listenEvent("connectVSCode", this.connectVSCode.bind(this));
101127

102-
this.reconnectVSCode();
128+
this.systemConfig.awaitLoad().then(() => {
129+
this.reconnectVSCode();
130+
});
103131

104132
// 定时清理日志
105133
this.clearLogger();
@@ -133,47 +161,56 @@ export class SystemManager extends Manager {
133161
}
134162

135163
connectVSCode() {
136-
// 与vsc扩展建立连接
137-
if (this.wsVscode) {
138-
this.wsVscode.close();
139-
}
140-
try {
141-
this.wsVscode = new WebSocket(this.systemConfig.vscodeUrl);
142-
} catch (e: any) {
143-
this.logger.debug("vscode连接失败", Logger.E(e));
144-
return;
145-
}
146-
this.wsVscode.addEventListener("open", () => {
147-
this.wsVscode!.send('{"action":"hello"}');
148-
});
149-
this.wsVscode.addEventListener("message", async (ev) => {
150-
const data = JSON.parse(ev.data);
151-
switch (data.action) {
152-
case "onchange": {
153-
const code = data.data.script;
154-
const prepareScript = await prepareScriptByCode(
155-
code,
156-
"",
157-
uuidv5(data.data.uri, uuidv5.URL)
158-
);
159-
this.scriptManager.event.upsertHandler(
160-
prepareScript.script,
161-
"vscode"
162-
);
163-
break;
164-
}
165-
default:
164+
return new Promise<void>((resolve, reject) => {
165+
// 与vsc扩展建立连接
166+
if (this.wsVscode) {
167+
this.wsVscode.close();
166168
}
167-
});
169+
try {
170+
this.wsVscode = new WebSocket(this.systemConfig.vscodeUrl);
171+
} catch (e: any) {
172+
this.logger.debug("connect vscode faild", Logger.E(e));
173+
reject(e);
174+
return;
175+
}
176+
let ok = false;
177+
this.wsVscode.addEventListener("open", () => {
178+
this.wsVscode!.send('{"action":"hello"}');
179+
ok = true;
180+
resolve();
181+
});
182+
this.wsVscode.addEventListener("message", async (ev) => {
183+
const data = JSON.parse(ev.data);
184+
switch (data.action) {
185+
case "onchange": {
186+
const code = data.data.script;
187+
const prepareScript = await prepareScriptByCode(
188+
code,
189+
"",
190+
uuidv5(data.data.uri, uuidv5.URL)
191+
);
192+
this.scriptManager.event.upsertHandler(
193+
prepareScript.script,
194+
"vscode"
195+
);
196+
break;
197+
}
198+
default:
199+
}
200+
});
168201

169-
this.wsVscode.addEventListener("error", (e) => {
170-
this.wsVscode = undefined;
171-
this.logger.debug("vscode连接失败", Logger.E(e));
172-
});
202+
this.wsVscode.addEventListener("error", (e) => {
203+
this.wsVscode = undefined;
204+
this.logger.debug("connect vscode faild", Logger.E(e));
205+
if (!ok) {
206+
reject(new Error("connect fail"));
207+
}
208+
});
173209

174-
this.wsVscode.addEventListener("close", () => {
175-
this.wsVscode = undefined;
176-
this.logger.debug("vscode连接关闭");
210+
this.wsVscode.addEventListener("close", () => {
211+
this.wsVscode = undefined;
212+
this.logger.debug("vscode connection closed");
213+
});
177214
});
178215
}
179216

src/background.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ IoC.registerInstance(MessageCenter, center).alias([
4040
// 监听logger messagewriter
4141
ListenerMessage(new LoggerDAO(), center);
4242

43-
IoC.instance(SystemConfig).init();
43+
(IoC.instance(SystemConfig) as SystemConfig).init();
4444

45-
IoC.instance(SystemManager).init();
45+
(IoC.instance(SystemManager) as SystemManager).init();
4646
// 资源管理器
4747
const resourceManager = new ResourceManager(center);
4848
// value管理器
@@ -58,7 +58,7 @@ resourceManager.start();
5858
(IoC.instance(ScriptManager) as ScriptManager).start();
5959
(IoC.instance(SubscribeManager) as SubscribeManager).start();
6060
// 同步处理器
61-
IoC.instance(SynchronizeManager).start();
61+
(IoC.instance(SynchronizeManager) as SynchronizeManager).start();
6262

6363
// 监听沙盒加载
6464
window.onload = () => {

src/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"manifest_version": 2,
33
"name": "ScriptCat",
4-
"version": "0.14.0",
4+
"version": "0.14.1",
55
"author": "CodFrm",
66
"description": "脚本猫,一个用户脚本管理器,支持后台脚本、定时脚本、页面脚本,可编写脚本每天帮你自动处理事务.",
77
"options_ui": {

src/pkg/config/config.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ export class SystemConfig {
3636

3737
public internal?: MessageInternal;
3838

39+
private loadOk = false;
40+
3941
constructor(message: MessageHander) {
4042
if (message instanceof MessageCenter) {
4143
this.message = message;
@@ -53,6 +55,23 @@ export class SystemConfig {
5355
this.cache.set(key, list[key]);
5456
}
5557
});
58+
this.loadOk = true;
59+
}
60+
61+
// 由于加载数据是异步,需要等待数据加载完成
62+
public awaitLoad(): Promise<SystemConfig> {
63+
return new Promise((resolve) => {
64+
if (this.loadOk) {
65+
resolve(this);
66+
return;
67+
}
68+
const timer = setInterval(() => {
69+
if (this.loadOk) {
70+
clearInterval(timer);
71+
resolve(this);
72+
}
73+
}, 100);
74+
});
5675
}
5776

5877
public async init() {

0 commit comments

Comments
 (0)