@@ -3,7 +3,7 @@ const $ = new Env('BoxJs')
3
3
// 为 eval 准备的上下文环境
4
4
const $eval_env = { }
5
5
6
- $ . version = '0.7.87 '
6
+ $ . version = '0.7.88 '
7
7
$ . versionType = 'beta'
8
8
9
9
// 发出的请求需要需要 Surge、QuanX 的 rewrite
@@ -23,8 +23,10 @@ $.KEY_sessions = 'chavy_boxjs_sessions'
23
23
$ . KEY_web_cache = 'chavy_boxjs_web_cache'
24
24
// 存储`应用订阅缓存`
25
25
$ . KEY_app_subCaches = 'chavy_boxjs_app_subCaches'
26
- // 存储`全局备份`
26
+ // 存储`全局备份` (弃用, 改用 `chavy_boxjs_backups`)
27
27
$ . KEY_globalBaks = 'chavy_boxjs_globalBaks'
28
+ // 存储`备份索引`
29
+ $ . KEY_backups = 'chavy_boxjs_backups'
28
30
// 存储`当前会话` (配合切换会话, 记录当前切换到哪个会话)
29
31
$ . KEY_cursessions = 'chavy_boxjs_cur_sessions'
30
32
@@ -71,6 +73,8 @@ $.ver = `https://raw.githubusercontent.com/chavyleung/scripts/master/box/release
71
73
72
74
// 升级用户数据
73
75
upgradeUserData ( )
76
+ // 升级备份数据
77
+ upgradeGlobalBaks ( )
74
78
75
79
// 处理预检请求
76
80
if ( $ . isOptions ) {
@@ -200,8 +204,9 @@ async function handleQuery() {
200
204
if ( / ^ \/ b o x d a t a / . test ( query ) ) {
201
205
$ . json = getBoxData ( )
202
206
} else if ( / ^ \/ b a k s / . test ( query ) ) {
203
- const globalbaks = getGlobalBaks ( true )
204
- $ . json = { globalbaks }
207
+ const [ , backupId ] = query . split ( '/baks/' )
208
+ console . log ( backupId )
209
+ $ . json = $ . getjson ( backupId )
205
210
} else if ( / ^ \/ v e r s i o n s $ / . test ( query ) ) {
206
211
await getVersions ( true )
207
212
}
@@ -398,28 +403,20 @@ function getAppSubCaches() {
398
403
}
399
404
400
405
/**
401
- * 获取全局备份
402
- * 默认只获取备份的基础信息, 如: id, name……
403
- *
404
- * @param {boolean } isComplete 是否获取完整的备份数据
406
+ * 获取全局备份列表
405
407
*/
406
- function getGlobalBaks ( isComplete = false ) {
407
- let globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
408
+ function getGlobalBaks ( ) {
409
+ let backups = $ . getjson ( $ . KEY_backups , [ ] )
408
410
409
411
// 处理异常数据:删除所有为 null 的备份
410
- if ( globalbaks . includes ( null ) ) {
411
- globalbaks = globalbaks . filter ( ( bak ) => bak )
412
- $ . setjson ( globalbaks , $ . KEY_globalBaks )
412
+ if ( backups . includes ( null ) ) {
413
+ backups = backups . filter ( ( bak ) => bak )
414
+ $ . setjson ( backups , $ . KEY_backups )
413
415
}
414
416
415
- if ( isComplete ) {
416
- return globalbaks
417
- } else {
418
- // isComplete === false: 不返回备份体
419
- globalbaks . forEach ( ( bak ) => delete bak . bak )
420
- return globalbaks
421
- }
417
+ return backups
422
418
}
419
+
423
420
/**
424
421
* 获取版本清单
425
422
*/
@@ -515,32 +512,32 @@ async function apiReloadAppSub() {
515
512
}
516
513
517
514
async function apiDelGlobalBak ( ) {
518
- const bak = $ . toObj ( $request . body )
519
- const globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
520
- const bakIdx = globalbaks . findIndex ( ( b ) => b . id === bak . id )
515
+ const backup = $ . toObj ( $request . body )
516
+ const backups = $ . getjson ( $ . KEY_backups , [ ] )
517
+ const bakIdx = backups . findIndex ( ( b ) => b . id === backup . id )
521
518
if ( bakIdx > - 1 ) {
522
- globalbaks . splice ( bakIdx , 1 )
523
- $ . setjson ( globalbaks , $ . KEY_globalBaks )
519
+ backups . splice ( bakIdx , 1 )
520
+ $ . setdata ( '' , backup . id )
521
+ $ . setjson ( backups , $ . KEY_backups )
524
522
}
525
523
$ . json = getBoxData ( )
526
524
}
527
525
528
526
async function apiUpdateGlobalBak ( ) {
529
- const { id : bakId , name : bakName } = $ . toObj ( $request . body )
530
- const globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
531
- const bak = globalbaks . find ( ( b ) => b . id === bakId )
532
- if ( bak ) {
533
- bak . name = bakName
534
- $ . setjson ( globalbaks , $ . KEY_globalBaks )
527
+ const { id : backupId , name : backupName } = $ . toObj ( $request . body )
528
+ const backups = $ . getjson ( $ . KEY_backups , [ ] )
529
+ const backup = backups . find ( ( b ) => b . id === backupId )
530
+ if ( backup ) {
531
+ backup . name = backupName
532
+ $ . setjson ( backups , $ . KEY_backups )
535
533
}
536
- $ . json = { globalbaks }
534
+ $ . json = getBoxData ( )
537
535
}
538
536
539
537
async function apiRevertGlobalBak ( ) {
540
- const { id : bakId } = $ . toObj ( $request . body )
541
- const globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
542
- const bak = globalbaks . find ( ( b ) => b . id === bakId )
543
- if ( bak && bak . bak ) {
538
+ const { id : bakcupId } = $ . toObj ( $request . body )
539
+ const backup = $ . getjson ( bakcupId )
540
+ if ( backup ) {
544
541
const {
545
542
chavy_boxjs_sysCfgs,
546
543
chavy_boxjs_sysApps,
@@ -549,7 +546,7 @@ async function apiRevertGlobalBak() {
549
546
chavy_boxjs_cur_sessions,
550
547
chavy_boxjs_app_subCaches,
551
548
...datas
552
- } = bak . bak
549
+ } = backup
553
550
$ . setdata ( JSON . stringify ( chavy_boxjs_sessions ) , $ . KEY_sessions )
554
551
$ . setdata ( JSON . stringify ( chavy_boxjs_userCfgs ) , $ . KEY_usercfgs )
555
552
$ . setdata ( JSON . stringify ( chavy_boxjs_cur_sessions ) , $ . KEY_cursessions )
@@ -558,34 +555,34 @@ async function apiRevertGlobalBak() {
558
555
Object . keys ( datas ) . forEach ( ( datkey ) => $ . setdata ( isNull ( datas [ datkey ] ) ? '' : `${ datas [ datkey ] } ` , datkey ) )
559
556
}
560
557
const boxdata = getBoxData ( )
561
- boxdata . globalbaks = globalbaks
562
558
$ . json = boxdata
563
559
}
564
560
565
561
async function apiSaveGlobalBak ( ) {
566
- let globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
567
- const bak = $ . toObj ( $request . body )
568
- const box = getBoxData ( )
569
- const bakdata = { }
570
- bakdata [ 'chavy_boxjs_userCfgs' ] = box . usercfgs
571
- bakdata [ 'chavy_boxjs_sessions' ] = box . sessions
572
- bakdata [ 'chavy_boxjs_cur_sessions' ] = box . curSessions
573
- bakdata [ 'chavy_boxjs_app_subCaches' ] = box . appSubCaches
574
- Object . assign ( bakdata , box . datas )
575
- bak . bak = bakdata
576
- globalbaks . push ( bak )
577
- if ( ! $ . setjson ( globalbaks , $ . KEY_globalBaks ) ) {
578
- globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
579
- }
580
- $ . json = { globalbaks }
562
+ const backups = $ . getjson ( $ . KEY_backups , [ ] )
563
+ const boxdata = getBoxData ( )
564
+ const backup = $ . toObj ( $request . body )
565
+ const backupData = { }
566
+ backupData [ 'chavy_boxjs_userCfgs' ] = boxdata . usercfgs
567
+ backupData [ 'chavy_boxjs_sessions' ] = boxdata . sessions
568
+ backupData [ 'chavy_boxjs_cur_sessions' ] = boxdata . curSessions
569
+ backupData [ 'chavy_boxjs_app_subCaches' ] = boxdata . appSubCaches
570
+ Object . assign ( backupData , boxdata . datas )
571
+ backups . push ( backup )
572
+ $ . setjson ( backups , $ . KEY_backups )
573
+ $ . setjson ( backupData , backup . id )
574
+ $ . json = getBoxData ( )
581
575
}
582
576
583
577
async function apiImpGlobalBak ( ) {
584
- let globalbaks = $ . getjson ( $ . KEY_globalBaks , [ ] )
585
- const bak = $ . toObj ( $request . body )
586
- globalbaks . push ( bak )
587
- $ . setjson ( globalbaks , $ . KEY_globalBaks )
588
- $ . json = { globalbaks }
578
+ const backups = $ . getjson ( $ . KEY_backups , [ ] )
579
+ const backup = $ . toObj ( $request . body )
580
+ const backupData = backup . bak
581
+ delete backup . bak
582
+ backups . push ( backup )
583
+ $ . setjson ( backups , $ . KEY_backups )
584
+ $ . setjson ( backupData , backup . id )
585
+ $ . json = getBoxData ( )
589
586
}
590
587
591
588
async function apiRunScript ( ) {
@@ -697,6 +694,44 @@ function upgradeUserData() {
697
694
}
698
695
}
699
696
697
+ /**
698
+ * 升级备份数据
699
+ *
700
+ * 升级前: 把所有备份都存到一个持久化空间
701
+ * 升级后: 把每个备份都独立存到一个空间, `$.KEY_backups` 仅记录必要的数据索引
702
+ */
703
+ function upgradeGlobalBaks ( ) {
704
+ let oldbaks = $ . getdata ( $ . KEY_globalBaks )
705
+ let newbaks = $ . getjson ( $ . KEY_backups , [ ] )
706
+ const isEmpty = ( bak ) => [ undefined , null , '' ] . includes ( bak )
707
+ const isExistsInNew = ( backupId ) => newbaks . find ( ( bak ) => bak . id === backupId )
708
+
709
+ // 存在旧备份数据时, 升级备份数据格式
710
+ if ( ! isEmpty ( oldbaks ) ) {
711
+ oldbaks = JSON . parse ( oldbaks )
712
+ oldbaks . forEach ( ( bak ) => {
713
+ if ( isEmpty ( bak ) ) return
714
+ if ( isEmpty ( bak . bak ) ) return
715
+ if ( isExistsInNew ( bak . id ) ) return
716
+
717
+ console . log ( `正在迁移: ${ bak . name } ` )
718
+ const backupId = bak . id
719
+ const backupData = bak . bak
720
+
721
+ // 删除旧的备份数据, 仅保留索引信息
722
+ delete bak . bak
723
+ newbaks . push ( bak )
724
+
725
+ // 提取旧备份数据, 存入独立的持久化空间
726
+ $ . setjson ( backupData , backupId )
727
+ } )
728
+ $ . setjson ( newbaks , $ . KEY_backups )
729
+ }
730
+
731
+ // 清空所有旧备份的数据
732
+ $ . setdata ( '' , $ . KEY_globalBaks )
733
+ }
734
+
700
735
/**
701
736
* ===================================
702
737
* 结束类函数
0 commit comments