Skip to content

Commit b492597

Browse files
committed
修复同步状态同步问题
1 parent c741ce0 commit b492597

1 file changed

Lines changed: 56 additions & 31 deletions

File tree

src/app/service/service_worker/synchronize.ts

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import LoggerCore from "@App/app/logger/core";
22
import Logger from "@App/app/logger/logger";
33
import type { Resource } from "@App/app/repo/resource";
4-
import { type Script, SCRIPT_STATUS_ENABLE, type ScriptDAO } from "@App/app/repo/scripts";
4+
import { type Script, SCRIPT_STATUS_DISABLE, SCRIPT_STATUS_ENABLE, type ScriptDAO } from "@App/app/repo/scripts";
55
import BackupExport from "@App/pkg/backup/export";
66
import type { BackupData, ResourceBackup, ScriptBackupData, ScriptOptions, ValueStorage } from "@App/pkg/backup/struct";
77
import type { File } from "@Packages/filesystem/filesystem";
@@ -46,15 +46,17 @@ type ScriptcatSync = {
4646
version: string; // 脚本猫版本
4747
status: {
4848
scripts: {
49-
[key: string]: {
50-
enable: boolean;
51-
sort: number;
52-
updatetime: number; // 更新时间
53-
};
49+
[key: string]: ScriptcatSyncStatus | undefined;
5450
};
5551
};
5652
};
5753

54+
type ScriptcatSyncStatus = {
55+
enable: boolean;
56+
sort: number;
57+
updatetime: number; // 更新时间
58+
};
59+
5860
type PushScriptParam = TInstallScriptParams;
5961

6062
export class SynchronizeService {
@@ -367,8 +369,25 @@ export class SynchronizeService {
367369
scriptList.forEach((script) => {
368370
scriptMap.set(script.uuid, script);
369371
});
372+
373+
// 判断文件系统是否有脚本猫同步文件
374+
const file = list.find((file) => file.name === "scriptcat-sync.json");
375+
const scriptcatSync = {
376+
version: ExtVersion,
377+
status: {
378+
scripts: {},
379+
},
380+
} as ScriptcatSync;
381+
let cloudStatus: ScriptcatSync["status"]["scripts"] = {};
382+
if (file) {
383+
// 如果有,则读取文件内容
384+
const cloudScriptCatSync = JSON.parse(await fs.open(file).then((f) => f.read("string"))) as ScriptcatSync;
385+
cloudStatus = cloudScriptCatSync.status.scripts;
386+
}
387+
370388
// 对比脚本列表和文件列表,进行同步
371389
const result: Promise<void>[] = [];
390+
const updateScript: Map<string, boolean> = new Map();
372391
uuidMap.forEach((file, uuid) => {
373392
const script = scriptMap.get(uuid);
374393
if (script) {
@@ -414,14 +433,16 @@ export class SynchronizeService {
414433
result.push(this.pushScript(fs, script));
415434
} else {
416435
// 如果脚本更新时间小于文件更新时间,则更新脚本
417-
result.push(this.pullScript(fs, file as SyncFiles, script));
436+
updateScript.set(uuid, true);
437+
result.push(this.pullScript(fs, file as SyncFiles, cloudStatus[uuid], script));
418438
}
419439
scriptMap.delete(uuid);
420440
return;
421441
}
422442
// 如果脚本不存在,且文件存在,则安装脚本
423443
if (file.script) {
424-
result.push(this.pullScript(fs, file as SyncFiles));
444+
updateScript.set(uuid, true);
445+
result.push(this.pullScript(fs, file as SyncFiles, cloudStatus[uuid]));
425446
}
426447
});
427448
// 上传剩下的脚本
@@ -432,35 +453,27 @@ export class SynchronizeService {
432453
await Promise.allSettled(result);
433454
// 同步状态
434455
if (syncConfig.syncStatus) {
435-
// 判断文件系统是否有脚本猫同步文件
436-
const file = list.find((file) => file.name === "scriptcat-sync.json");
437-
const scriptcatSync = {
438-
version: ExtVersion,
439-
status: {
440-
scripts: {},
441-
},
442-
} as ScriptcatSync;
443-
let cloudStatus: ScriptcatSync["status"]["scripts"] = {};
444-
if (file) {
445-
// 如果有,则读取文件内容
446-
const cloudScriptCatSync = JSON.parse(await fs.open(file).then((f) => f.read("string"))) as ScriptcatSync;
447-
cloudStatus = cloudScriptCatSync.status.scripts;
448-
}
449456
const scriptlist = await this.scriptDAO.all();
450457
await Promise.allSettled(
451458
scriptlist.map(async (script) => {
452459
// 判断云端状态是否与本地状态一致
453-
if (!cloudStatus[script.uuid]) {
460+
const status = cloudStatus[script.uuid];
461+
if (!status) {
454462
scriptcatSync.status.scripts[script.uuid] = {
455463
enable: script.status === SCRIPT_STATUS_ENABLE,
456464
sort: script.sort,
457465
updatetime: script.updatetime || script.createtime,
458466
};
459467
} else {
468+
if (updateScript.has(script.uuid)) {
469+
// 脚本已经更新过了,跳过状态同步
470+
scriptcatSync.status.scripts[script.uuid] = status;
471+
return;
472+
}
460473
// 判断时间
461474
if (script.updatetime) {
462475
// 如果云端状态的更新时间小于本地状态的更新时间,则更新云端状态
463-
if (cloudStatus[script.uuid].updatetime < script.updatetime) {
476+
if (status.updatetime < script.updatetime) {
464477
scriptcatSync.status.scripts[script.uuid] = {
465478
enable: script.status === SCRIPT_STATUS_ENABLE,
466479
sort: script.sort,
@@ -470,20 +483,20 @@ export class SynchronizeService {
470483
}
471484
}
472485
// 否则采用云端状态
473-
scriptcatSync.status.scripts[script.uuid] = cloudStatus[script.uuid];
486+
scriptcatSync.status.scripts[script.uuid] = status;
474487
// 脚本顺序
475-
if (cloudStatus[script.uuid].sort !== script.sort) {
488+
if (status.sort !== script.sort) {
476489
await this.scriptDAO.update(script.uuid, {
477-
sort: cloudStatus[script.uuid].sort,
490+
sort: status.sort,
478491
updatetime: Date.now(),
479492
});
480493
}
481494
// 脚本状态
482-
if (cloudStatus[script.uuid].enable !== (script.status === SCRIPT_STATUS_ENABLE)) {
495+
if (status.enable !== (script.status === SCRIPT_STATUS_ENABLE)) {
483496
// 开启脚本
484497
await this.script.enableScript({
485498
uuid: script.uuid,
486-
enable: cloudStatus[script.uuid].enable,
499+
enable: status.enable,
487500
});
488501
}
489502
}
@@ -573,7 +586,7 @@ export class SynchronizeService {
573586
return;
574587
}
575588

576-
async pullScript(fs: FileSystem, file: SyncFiles, existingScript?: Script) {
589+
async pullScript(fs: FileSystem, file: SyncFiles, status: ScriptcatSyncStatus | undefined, existingScript?: Script) {
577590
const logger = this.logger.with({
578591
uuid: existingScript?.uuid || "",
579592
name: existingScript?.name || "",
@@ -593,6 +606,19 @@ export class SynchronizeService {
593606
existingScript?.uuid || metaObj.uuid
594607
);
595608
script.origin = script.origin || metaObj.origin;
609+
if (status) {
610+
if (existingScript) {
611+
if (!existingScript.updatetime || status.updatetime > existingScript.updatetime) {
612+
// 如果云端状态的更新时间大于本地状态的更新时间,则采用云端状态
613+
script.sort = status.sort;
614+
script.status = status.enable ? SCRIPT_STATUS_ENABLE : SCRIPT_STATUS_DISABLE;
615+
}
616+
} else {
617+
// 新安装的脚本采用云端状态
618+
script.sort = status.sort;
619+
script.status = status.enable ? SCRIPT_STATUS_ENABLE : SCRIPT_STATUS_DISABLE;
620+
}
621+
}
596622
this.script.installScript({
597623
script,
598624
code,
@@ -602,7 +628,6 @@ export class SynchronizeService {
602628
} catch (e) {
603629
logger.error("pull script error", Logger.E(e));
604630
}
605-
return;
606631
}
607632

608633
cloudSyncConfigChange(value: CloudSyncConfig) {

0 commit comments

Comments
 (0)