@@ -15,7 +15,7 @@ import {
1515import ChromeStorage from "@App/pkg/config/chrome_storage" ;
1616import { CloudSyncConfig , SystemConfig } from "@App/pkg/config/config" ;
1717import { prepareScriptByCode } from "@App/pkg/utils/script" ;
18- import { InfoNotification } from "@App/pkg/utils/utils" ;
18+ import { errorMsg , InfoNotification } from "@App/pkg/utils/utils" ;
1919import FileSystemFactory from "@Pkg/filesystem/factory" ;
2020import FileSystem , { File } from "@Pkg/filesystem/filesystem" ;
2121import Manager from "../manager" ;
@@ -36,6 +36,7 @@ export type SyncMeta = {
3636 origin ?: string ; // 脚本来源
3737 downloadUrl ?: string ;
3838 checkUpdateUrl ?: string ;
39+ isDeleted ?: boolean ;
3940} ;
4041
4142// 同步控件
@@ -76,7 +77,7 @@ export default class SynchronizeManager extends Manager {
7677 this . valueManager = valueManager ;
7778 this . resourceManager = resourceManager ;
7879 this . scriptManager = scriptManager ;
79- this . storage = new ChromeStorage ( "sync" , chrome . storage . local ) ;
80+ this . storage = new ChromeStorage ( "sync" , false ) ;
8081 this . logger = LoggerCore . getLogger ( { component : "SynchronizeManager" } ) ;
8182 }
8283
@@ -119,7 +120,7 @@ export default class SynchronizeManager extends Manager {
119120 logger . error ( "create filesystem error" , Logger . E ( e ) , {
120121 type : config . filesystem ,
121122 } ) ;
122- InfoNotification ( "同步系统连接失败" , e ) ;
123+ InfoNotification ( "同步系统连接失败" , errorMsg ( e ) ) ;
123124 if ( autoDisable ) {
124125 this . systemConfig . cloudSync = {
125126 ...this . systemConfig . cloudSync ,
@@ -154,7 +155,7 @@ export default class SynchronizeManager extends Manager {
154155 try {
155156 await this . syncOnce ( fs ) ;
156157 } catch ( e : any ) {
157- InfoNotification ( "同步失败,请检查同步配置" , e ) ;
158+ InfoNotification ( "同步失败,请检查同步配置" , errorMsg ( e ) ) ;
158159 }
159160 } , 60 * 60 * 1000 ) ;
160161 freeFn . push ( ( ) => {
@@ -164,7 +165,7 @@ export default class SynchronizeManager extends Manager {
164165 try {
165166 await this . syncOnce ( fs ) ;
166167 } catch ( e : any ) {
167- InfoNotification ( "同步失败,请检查同步配置" , e ) ;
168+ InfoNotification ( "同步失败,请检查同步配置" , errorMsg ( e ) ) ;
168169 }
169170 return Promise . resolve ( ( ) => {
170171 logger . info ( "stop cloud sync" ) ;
@@ -176,7 +177,7 @@ export default class SynchronizeManager extends Manager {
176177 // 同步一次
177178 async syncOnce ( fs : FileSystem ) : Promise < void > {
178179 this . logger . info ( "start sync once" ) ;
179- // 首次同步
180+ // 获取文件列表
180181 const list = await fs . list ( ) ;
181182 // 根据文件名生成一个map
182183 const uuidMap = new Map <
@@ -223,8 +224,35 @@ export default class SynchronizeManager extends Manager {
223224 const result : Promise < void > [ ] = [ ] ;
224225 uuidMap . forEach ( ( file , uuid ) => {
225226 const script = scriptMap . get ( uuid ) ;
226- // 获取脚本数据
227227 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+ }
228256 // 过滤掉无变动的文件
229257 if ( fileDigestMap [ file . script ! . name ] === file . script ! . digest ) {
230258 // 删除了之后,剩下的就是需要上传的脚本了
@@ -243,8 +271,10 @@ export default class SynchronizeManager extends Manager {
243271 scriptMap . delete ( uuid ) ;
244272 return ;
245273 }
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+ }
248278 } ) ;
249279 // 上传剩下的脚本
250280 scriptMap . forEach ( ( script ) => {
@@ -278,7 +308,17 @@ export default class SynchronizeManager extends Manager {
278308 } ) ;
279309 try {
280310 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+ ) ;
282322 logger . info ( "delete success" ) ;
283323 } catch ( e ) {
284324 logger . error ( "delete file error" , Logger . E ( e ) ) ;
0 commit comments