Skip to content

Commit

Permalink
🐛 修复vscode连接问题与同步问题
Browse files Browse the repository at this point in the history
  • Loading branch information
CodFrm committed Jun 26, 2023
1 parent 7d2a5b2 commit 06c3ef7
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 50 deletions.
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "scriptcat",
"version": "0.14.0",
"version": "0.14.1",
"description": "脚本猫,一个可以执行用户脚本的浏览器扩展,万物皆可脚本化,让你的浏览器可以做更多的事情!",
"author": "CodFrm",
"license": "GPLv3",
Expand Down
8 changes: 5 additions & 3 deletions src/app/service/synchronize/manager.ts
Expand Up @@ -84,9 +84,11 @@ export default class SynchronizeManager extends Manager {
async start() {
// 监听同步事件决定是否开启同步
let freeSync: () => void | undefined;
if (this.systemConfig.cloudSync.enable) {
freeSync = await this.enableCloudSync(this.systemConfig.cloudSync);
}
this.systemConfig.awaitLoad().then(async () => {
if (this.systemConfig.cloudSync.enable) {
freeSync = await this.enableCloudSync(this.systemConfig.cloudSync);
}
});
SystemConfig.hook.addListener(
"update",
async (key, value: CloudSyncConfig) => {
Expand Down
121 changes: 79 additions & 42 deletions src/app/service/system/manager.ts
Expand Up @@ -60,9 +60,35 @@ export class SystemManager extends Manager {
if (details.reason === "install") {
chrome.tabs.create({ url: "https://docs.scriptcat.org/" });
} else if (details.reason === "update") {
chrome.tabs.create({
url: `https://docs.scriptcat.org/docs/change/#${ExtVersion}`,
});
let nid: string;
chrome.notifications.create(
{
type: "basic",
iconUrl: chrome.runtime.getURL("assets/logo.png"),
title: `ScriptCat 更新到 ${ExtVersion}`,
message: "ScriptCat已更新,点击查看更新日志",
},
(notificationId) => {
nid = notificationId;
}
);
// eslint-disable-next-line no-undef
let tm: NodeJS.Timeout;
const onClicked = (id: string) => {
if (nid !== id) {
return;
}
chrome.notifications.onClicked.removeListener(onClicked);
chrome.tabs.create({
url: `https://docs.scriptcat.org/docs/change/#${ExtVersion}`,
});
clearTimeout(tm);
};
tm = setTimeout(() => {
chrome.notifications.clear(nid);
chrome.notifications.onClicked.removeListener(onClicked);
}, 60 * 3000);
chrome.notifications.onClicked.addListener(onClicked);
}
});
}
Expand Down Expand Up @@ -99,7 +125,9 @@ export class SystemManager extends Manager {
);
this.listenEvent("connectVSCode", this.connectVSCode.bind(this));

this.reconnectVSCode();
this.systemConfig.awaitLoad().then(() => {
this.reconnectVSCode();
});

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

connectVSCode() {
// 与vsc扩展建立连接
if (this.wsVscode) {
this.wsVscode.close();
}
try {
this.wsVscode = new WebSocket(this.systemConfig.vscodeUrl);
} catch (e: any) {
this.logger.debug("vscode连接失败", Logger.E(e));
return;
}
this.wsVscode.addEventListener("open", () => {
this.wsVscode!.send('{"action":"hello"}');
});
this.wsVscode.addEventListener("message", async (ev) => {
const data = JSON.parse(ev.data);
switch (data.action) {
case "onchange": {
const code = data.data.script;
const prepareScript = await prepareScriptByCode(
code,
"",
uuidv5(data.data.uri, uuidv5.URL)
);
this.scriptManager.event.upsertHandler(
prepareScript.script,
"vscode"
);
break;
}
default:
return new Promise<void>((resolve, reject) => {
// 与vsc扩展建立连接
if (this.wsVscode) {
this.wsVscode.close();
}
});
try {
this.wsVscode = new WebSocket(this.systemConfig.vscodeUrl);
} catch (e: any) {
this.logger.debug("connect vscode faild", Logger.E(e));
reject(e);
return;
}
let ok = false;
this.wsVscode.addEventListener("open", () => {
this.wsVscode!.send('{"action":"hello"}');
ok = true;
resolve();
});
this.wsVscode.addEventListener("message", async (ev) => {
const data = JSON.parse(ev.data);
switch (data.action) {
case "onchange": {
const code = data.data.script;
const prepareScript = await prepareScriptByCode(
code,
"",
uuidv5(data.data.uri, uuidv5.URL)
);
this.scriptManager.event.upsertHandler(
prepareScript.script,
"vscode"
);
break;
}
default:
}
});

this.wsVscode.addEventListener("error", (e) => {
this.wsVscode = undefined;
this.logger.debug("vscode连接失败", Logger.E(e));
});
this.wsVscode.addEventListener("error", (e) => {
this.wsVscode = undefined;
this.logger.debug("connect vscode faild", Logger.E(e));
if (!ok) {
reject(new Error("connect fail"));
}
});

this.wsVscode.addEventListener("close", () => {
this.wsVscode = undefined;
this.logger.debug("vscode连接关闭");
this.wsVscode.addEventListener("close", () => {
this.wsVscode = undefined;
this.logger.debug("vscode connection closed");
});
});
}

Expand Down
6 changes: 3 additions & 3 deletions src/background.ts
Expand Up @@ -40,9 +40,9 @@ IoC.registerInstance(MessageCenter, center).alias([
// 监听logger messagewriter
ListenerMessage(new LoggerDAO(), center);

IoC.instance(SystemConfig).init();
(IoC.instance(SystemConfig) as SystemConfig).init();

IoC.instance(SystemManager).init();
(IoC.instance(SystemManager) as SystemManager).init();
// 资源管理器
const resourceManager = new ResourceManager(center);
// value管理器
Expand All @@ -58,7 +58,7 @@ resourceManager.start();
(IoC.instance(ScriptManager) as ScriptManager).start();
(IoC.instance(SubscribeManager) as SubscribeManager).start();
// 同步处理器
IoC.instance(SynchronizeManager).start();
(IoC.instance(SynchronizeManager) as SynchronizeManager).start();

// 监听沙盒加载
window.onload = () => {
Expand Down
2 changes: 1 addition & 1 deletion src/manifest.json
@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "ScriptCat",
"version": "0.14.0",
"version": "0.14.1",
"author": "CodFrm",
"description": "脚本猫,一个用户脚本管理器,支持后台脚本、定时脚本、页面脚本,可编写脚本每天帮你自动处理事务.",
"options_ui": {
Expand Down
19 changes: 19 additions & 0 deletions src/pkg/config/config.ts
Expand Up @@ -36,6 +36,8 @@ export class SystemConfig {

public internal?: MessageInternal;

private loadOk = false;

constructor(message: MessageHander) {
if (message instanceof MessageCenter) {
this.message = message;
Expand All @@ -53,6 +55,23 @@ export class SystemConfig {
this.cache.set(key, list[key]);
}
});
this.loadOk = true;
}

// 由于加载数据是异步,需要等待数据加载完成
public awaitLoad(): Promise<SystemConfig> {
return new Promise((resolve) => {
if (this.loadOk) {
resolve(this);
return;
}
const timer = setInterval(() => {
if (this.loadOk) {
clearInterval(timer);
resolve(this);
}
}, 100);
});
}

public async init() {
Expand Down

0 comments on commit 06c3ef7

Please sign in to comment.