@@ -15,7 +15,7 @@ import {
15
15
import ChromeStorage from "@App/pkg/config/chrome_storage" ;
16
16
import { CloudSyncConfig , SystemConfig } from "@App/pkg/config/config" ;
17
17
import { prepareScriptByCode } from "@App/pkg/utils/script" ;
18
- import { InfoNotification } from "@App/pkg/utils/utils" ;
18
+ import { errorMsg , InfoNotification } from "@App/pkg/utils/utils" ;
19
19
import FileSystemFactory from "@Pkg/filesystem/factory" ;
20
20
import FileSystem , { File } from "@Pkg/filesystem/filesystem" ;
21
21
import Manager from "../manager" ;
@@ -36,6 +36,7 @@ export type SyncMeta = {
36
36
origin ?: string ; // 脚本来源
37
37
downloadUrl ?: string ;
38
38
checkUpdateUrl ?: string ;
39
+ isDeleted ?: boolean ;
39
40
} ;
40
41
41
42
// 同步控件
@@ -76,7 +77,7 @@ export default class SynchronizeManager extends Manager {
76
77
this . valueManager = valueManager ;
77
78
this . resourceManager = resourceManager ;
78
79
this . scriptManager = scriptManager ;
79
- this . storage = new ChromeStorage ( "sync" , chrome . storage . local ) ;
80
+ this . storage = new ChromeStorage ( "sync" , false ) ;
80
81
this . logger = LoggerCore . getLogger ( { component : "SynchronizeManager" } ) ;
81
82
}
82
83
@@ -119,7 +120,7 @@ export default class SynchronizeManager extends Manager {
119
120
logger . error ( "create filesystem error" , Logger . E ( e ) , {
120
121
type : config . filesystem ,
121
122
} ) ;
122
- InfoNotification ( "同步系统连接失败" , e ) ;
123
+ InfoNotification ( "同步系统连接失败" , errorMsg ( e ) ) ;
123
124
if ( autoDisable ) {
124
125
this . systemConfig . cloudSync = {
125
126
...this . systemConfig . cloudSync ,
@@ -154,7 +155,7 @@ export default class SynchronizeManager extends Manager {
154
155
try {
155
156
await this . syncOnce ( fs ) ;
156
157
} catch ( e : any ) {
157
- InfoNotification ( "同步失败,请检查同步配置" , e ) ;
158
+ InfoNotification ( "同步失败,请检查同步配置" , errorMsg ( e ) ) ;
158
159
}
159
160
} , 60 * 60 * 1000 ) ;
160
161
freeFn . push ( ( ) => {
@@ -164,7 +165,7 @@ export default class SynchronizeManager extends Manager {
164
165
try {
165
166
await this . syncOnce ( fs ) ;
166
167
} catch ( e : any ) {
167
- InfoNotification ( "同步失败,请检查同步配置" , e ) ;
168
+ InfoNotification ( "同步失败,请检查同步配置" , errorMsg ( e ) ) ;
168
169
}
169
170
return Promise . resolve ( ( ) => {
170
171
logger . info ( "stop cloud sync" ) ;
@@ -176,7 +177,7 @@ export default class SynchronizeManager extends Manager {
176
177
// 同步一次
177
178
async syncOnce ( fs : FileSystem ) : Promise < void > {
178
179
this . logger . info ( "start sync once" ) ;
179
- // 首次同步
180
+ // 获取文件列表
180
181
const list = await fs . list ( ) ;
181
182
// 根据文件名生成一个map
182
183
const uuidMap = new Map <
@@ -223,8 +224,35 @@ export default class SynchronizeManager extends Manager {
223
224
const result : Promise < void > [ ] = [ ] ;
224
225
uuidMap . forEach ( ( file , uuid ) => {
225
226
const script = scriptMap . get ( uuid ) ;
226
- // 获取脚本数据
227
227
if ( script ) {
228
+ // 脚本存在但是文件不存在,则读取.meta.json内容判断是否需要删除脚本
229
+ if ( ! file . script ) {
230
+ result . push (
231
+ new Promise ( ( resolve ) => {
232
+ const handler = async ( ) => {
233
+ // 读取meta文件
234
+ const meta = await fs . open ( file . meta ! ) ;
235
+ const metaJson = ( await meta . read ( "string" ) ) as string ;
236
+ const metaObj = JSON . parse ( metaJson ) as SyncMeta ;
237
+ if ( metaObj . isDeleted ) {
238
+ if ( script ) {
239
+ this . scriptManager . event . deleteHandler ( script . id ) ;
240
+ InfoNotification (
241
+ "脚本删除同步" ,
242
+ `脚本${ script . name } 已被删除`
243
+ ) ;
244
+ }
245
+ } else {
246
+ // 否则认为是一个无效的.meta文件,进行删除
247
+ await fs . delete ( file . meta ! . path ) ;
248
+ }
249
+ resolve ( ) ;
250
+ } ;
251
+ handler ( ) ;
252
+ } )
253
+ ) ;
254
+ return ;
255
+ }
228
256
// 过滤掉无变动的文件
229
257
if ( fileDigestMap [ file . script ! . name ] === file . script ! . digest ) {
230
258
// 删除了之后,剩下的就是需要上传的脚本了
@@ -243,8 +271,10 @@ export default class SynchronizeManager extends Manager {
243
271
scriptMap . delete ( uuid ) ;
244
272
return ;
245
273
}
246
- // 如果脚本不存在,则安装脚本
247
- result . push ( this . pullScript ( fs , file as SyncFiles ) ) ;
274
+ // 如果脚本不存在,且文件存在,则安装脚本
275
+ if ( file . script ) {
276
+ result . push ( this . pullScript ( fs , file as SyncFiles ) ) ;
277
+ }
248
278
} ) ;
249
279
// 上传剩下的脚本
250
280
scriptMap . forEach ( ( script ) => {
@@ -278,7 +308,17 @@ export default class SynchronizeManager extends Manager {
278
308
} ) ;
279
309
try {
280
310
await fs . delete ( filename ) ;
281
- await fs . delete ( `${ script . uuid } .meta.json` ) ;
311
+ // 留下一个.meta.json删除标记
312
+ const meta = await fs . create ( `${ script . uuid } .meta.json` ) ;
313
+ await meta . write (
314
+ JSON . stringify ( < SyncMeta > {
315
+ uuid : script . uuid ,
316
+ origin : script . origin ,
317
+ downloadUrl : script . downloadUrl ,
318
+ checkUpdateUrl : script . checkUpdateUrl ,
319
+ isDeleted : true ,
320
+ } )
321
+ ) ;
282
322
logger . info ( "delete success" ) ;
283
323
} catch ( e ) {
284
324
logger . error ( "delete file error" , Logger . E ( e ) ) ;
0 commit comments