Skip to content

Commit 9b70673

Browse files
committed
🐛 修复uuid导致的同步问题 #141 #133
1 parent 38921da commit 9b70673

File tree

4 files changed

+43
-16
lines changed

4 files changed

+43
-16
lines changed

docs/架构设计.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,13 @@ LoggerCore.getInstance().logger({ env: "background" }).info("background start");
9696
为了兼容油猴脚本,必须引入测试,主要针对油猴运行时的沙盒进行测试,以保证每次修改不会破坏兼容性。使用[`jest`](https://jestjs.io/zh-Hans/)作为测试框架,编写时也需要考虑代码的一个可测试性。单元测试文件与代码放在同级目录下(\*.ts/\*.test.ts),不另外开`tests`文件夹。
9797

9898

99+
## uuid生成逻辑与脚本安装
100+
101+
### uuid生成逻辑
102+
随机生成uuid
103+
104+
### 脚本安装
105+
首先通过name+namespace搜索是否有同名脚本, 没有则生成随机uuid安装, 有则使用同名脚本的uuid进行安装
106+
107+
### 脚本更新
108+
传递脚本uuid, 使用uuid进行更新

src/app/service/script/manager.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { v4 as uuidv4 } from "uuid";
12
import { fetchScriptInfo, prepareScriptByCode } from "@App/pkg/utils/script";
23
import Cache from "@App/app/cache";
34
import CacheKey from "@App/pkg/utils/cache_key";
@@ -97,8 +98,11 @@ export class ScriptManager extends Manager {
9798
},
9899
{
99100
urls: [
101+
"*://*/*.user.js",
100102
"*://*/*.user.js?*",
103+
"https://*/*.user.sub.js",
101104
"https://*/*.user.sub.js?*",
105+
"https://*/*.user.bg.js",
102106
"https://*/*.user.bg.js?*",
103107
],
104108
types: ["main_frame"],
@@ -116,7 +120,7 @@ export class ScriptManager extends Manager {
116120
}
117121

118122
public openInstallPageByUrl(url: string) {
119-
return fetchScriptInfo(url, "user", false).then((info) => {
123+
return fetchScriptInfo(url, "user", false, uuidv4()).then((info) => {
120124
Cache.getInstance().set(CacheKey.scriptInfo(info.uuid), info);
121125
setTimeout(() => {
122126
// 清理缓存
@@ -141,7 +145,12 @@ export class ScriptManager extends Manager {
141145
name: script.name,
142146
});
143147
try {
144-
const info = await fetchScriptInfo(script.checkUpdateUrl, source, false);
148+
const info = await fetchScriptInfo(
149+
script.checkUpdateUrl,
150+
source,
151+
false,
152+
script.uuid
153+
);
145154
const { metadata } = info;
146155
if (!metadata) {
147156
logger.error("parse metadata failed");
@@ -177,7 +186,12 @@ export class ScriptManager extends Manager {
177186
downloadUrl: script.downloadUrl,
178187
checkUpdateUrl: script.checkUpdateUrl,
179188
});
180-
fetchScriptInfo(script.downloadUrl || script.checkUpdateUrl!, source, true)
189+
fetchScriptInfo(
190+
script.downloadUrl || script.checkUpdateUrl!,
191+
source,
192+
true,
193+
script.uuid
194+
)
181195
.then(async (info) => {
182196
// 是否静默更新
183197
if (this.systemConfig.silenceUpdateScript) {
@@ -217,7 +231,7 @@ export class ScriptManager extends Manager {
217231
source: InstallSource,
218232
subscribeUrl?: string
219233
) {
220-
const info = await fetchScriptInfo(url, "system", false);
234+
const info = await fetchScriptInfo(url, "system", false, uuidv4());
221235
const script = await prepareScriptByCode(info.code, url, info.uuid);
222236
script.subscribeUrl = subscribeUrl;
223237
await this.event.upsertHandler(script, "system");

src/pages/install/description.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,11 @@ export default function Description() {
128128
setOldScript(script.oldSubscribe);
129129
delete script.oldSubscribe;
130130
} else {
131-
script = await prepareScriptByCode(resp.code, resp.url);
131+
if (resp.isUpdate) {
132+
script = await prepareScriptByCode(resp.code, resp.url, resp.uuid);
133+
} else {
134+
script = await prepareScriptByCode(resp.code, resp.url);
135+
}
132136
setOldScript(script.oldScript);
133137
delete script.oldScript;
134138
}

src/pkg/utils/script.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { v4 as uuidv4, v5 as uuidv5 } from "uuid";
1+
import { v4 as uuidv4 } from "uuid";
22
import {
33
Metadata,
44
Script,
@@ -95,7 +95,8 @@ export type ScriptInfo = {
9595
export async function fetchScriptInfo(
9696
url: string,
9797
source: InstallSource,
98-
isUpdate: boolean
98+
isUpdate: boolean,
99+
uuid: string
99100
): Promise<ScriptInfo> {
100101
const resp = await fetch(url, {
101102
headers: {
@@ -110,7 +111,6 @@ export async function fetchScriptInfo(
110111
if (!ok) {
111112
throw new Error("parse script info failed");
112113
}
113-
const uuid = uuidv5(url, uuidv5.URL);
114114
const ret: ScriptInfo = {
115115
url,
116116
code: body,
@@ -129,7 +129,7 @@ export async function fetchScriptInfo(
129129
export function copyScript(script: Script, old: Script): Script {
130130
const ret = script;
131131
ret.id = old.id;
132-
// ret.uuid = old.uuid;
132+
ret.uuid = old.uuid;
133133
ret.createtime = old.createtime;
134134
ret.lastruntime = old.lastruntime;
135135
// ret.delayruntime = old.delayruntime;
@@ -247,16 +247,15 @@ export function prepareScriptByCode(
247247
[, domain] = urlSplit;
248248
}
249249
}
250-
if (!uuid) {
251-
if (url) {
252-
uuid = uuidv5(url, uuidv5.URL);
253-
} else {
254-
uuid = uuidv4();
255-
}
250+
let newUUID = "";
251+
if (uuid) {
252+
newUUID = uuid;
253+
} else {
254+
newUUID = uuidv4();
256255
}
257256
let script: Script & { oldScript?: Script } = {
258257
id: 0,
259-
uuid,
258+
uuid: newUUID,
260259
name: metadata.name[0],
261260
code,
262261
author: metadata.author && metadata.author[0],

0 commit comments

Comments
 (0)