1
1
import { overrideConfigPath , overridePath } from '../utils/dirs'
2
- import yaml from 'yaml'
3
- import fs from 'fs'
4
- import { dialog } from 'electron'
5
- import axios from 'axios'
6
2
import { getControledMihomoConfig } from './controledMihomo'
3
+ import { readFile , writeFile , rm } from 'fs/promises'
4
+ import { existsSync } from 'fs'
5
+ import axios from 'axios'
6
+ import yaml from 'yaml'
7
7
8
8
let overrideConfig : IOverrideConfig // override.yaml
9
9
10
- export function getOverrideConfig ( force = false ) : IOverrideConfig {
10
+ export async function getOverrideConfig ( force = false ) : Promise < IOverrideConfig > {
11
11
if ( force || ! overrideConfig ) {
12
- overrideConfig = yaml . parse ( fs . readFileSync ( overrideConfigPath ( ) , 'utf-8' ) )
12
+ const data = await readFile ( overrideConfigPath ( ) , 'utf-8' )
13
+ overrideConfig = yaml . parse ( data )
13
14
}
14
15
return overrideConfig
15
16
}
16
17
17
- export function setOverrideConfig ( config : IOverrideConfig ) : void {
18
+ export async function setOverrideConfig ( config : IOverrideConfig ) : Promise < void > {
18
19
overrideConfig = config
19
- fs . writeFileSync ( overrideConfigPath ( ) , yaml . stringify ( overrideConfig ) )
20
+ await writeFile ( overrideConfigPath ( ) , yaml . stringify ( overrideConfig ) , 'utf-8' )
20
21
}
21
22
22
- export function getOverrideItem ( id : string ) : IOverrideItem | undefined {
23
- return overrideConfig . items . find ( ( item ) => item . id === id )
23
+ export async function getOverrideItem ( id : string | undefined ) : Promise < IOverrideItem | undefined > {
24
+ const { items } = await getOverrideConfig ( )
25
+ return items . find ( ( item ) => item . id === id )
24
26
}
25
- export function updateOverrideItem ( item : IOverrideItem ) : void {
26
- const index = overrideConfig . items . findIndex ( ( i ) => i . id === item . id )
27
- overrideConfig . items [ index ] = item
28
- fs . writeFileSync ( overrideConfigPath ( ) , yaml . stringify ( overrideConfig ) )
27
+
28
+ export async function updateOverrideItem ( item : IOverrideItem ) : Promise < void > {
29
+ const config = await getOverrideConfig ( )
30
+ const index = config . items . findIndex ( ( i ) => i . id === item . id )
31
+ if ( index === - 1 ) {
32
+ throw new Error ( 'Override not found' )
33
+ }
34
+ config . items [ index ] = item
35
+ await setOverrideConfig ( config )
29
36
}
30
37
31
38
export async function addOverrideItem ( item : Partial < IOverrideItem > ) : Promise < void > {
39
+ const config = await getOverrideConfig ( )
32
40
const newItem = await createOverride ( item )
33
- if ( overrideConfig . items . find ( ( i ) => i . id === newItem . id ) ) {
41
+ if ( await getOverrideItem ( item . id ) ) {
34
42
updateOverrideItem ( newItem )
35
43
} else {
36
- overrideConfig . items . push ( newItem )
44
+ config . items . push ( newItem )
37
45
}
38
- fs . writeFileSync ( overrideConfigPath ( ) , yaml . stringify ( overrideConfig ) )
46
+ await setOverrideConfig ( config )
39
47
}
40
48
41
- export function removeOverrideItem ( id : string ) : void {
42
- overrideConfig . items = overrideConfig . items ?. filter ( ( item ) => item . id !== id )
43
- fs . writeFileSync ( overrideConfigPath ( ) , yaml . stringify ( overrideConfig ) )
44
- fs . rmSync ( overridePath ( id ) )
49
+ export async function removeOverrideItem ( id : string ) : Promise < void > {
50
+ const config = await getOverrideConfig ( )
51
+ config . items = config . items ?. filter ( ( item ) => item . id !== id )
52
+ await setOverrideConfig ( config )
53
+ await rm ( overridePath ( id ) )
45
54
}
46
55
47
56
export async function createOverride ( item : Partial < IOverrideItem > ) : Promise < IOverrideItem > {
@@ -55,31 +64,21 @@ export async function createOverride(item: Partial<IOverrideItem>): Promise<IOve
55
64
} as IOverrideItem
56
65
switch ( newItem . type ) {
57
66
case 'remote' : {
58
- if ( ! item . url ) {
59
- throw new Error ( 'URL is required for remote script' )
60
- }
61
- try {
62
- const res = await axios . get ( item . url , {
63
- proxy : {
64
- protocol : 'http' ,
65
- host : '127.0.0.1' ,
66
- port : getControledMihomoConfig ( ) [ 'mixed-port' ] || 7890
67
- } ,
68
- responseType : 'text'
69
- } )
70
- const data = res . data
71
- setOverride ( id , data )
72
- } catch ( e ) {
73
- dialog . showErrorBox ( 'Failed to fetch remote script' , `${ e } \nurl: ${ item . url } ` )
74
- throw new Error ( `Failed to fetch remote script ${ e } ` )
75
- }
67
+ const { 'mixed-port' : mixedPort = 7890 } = await getControledMihomoConfig ( )
68
+ if ( ! item . url ) throw new Error ( 'Empty URL' )
69
+ const res = await axios . get ( item . url , {
70
+ proxy : {
71
+ protocol : 'http' ,
72
+ host : '127.0.0.1' ,
73
+ port : mixedPort
74
+ }
75
+ } )
76
+ const data = res . data
77
+ await setOverride ( id , data )
76
78
break
77
79
}
78
80
case 'local' : {
79
- if ( ! item . file ) {
80
- throw new Error ( 'File is required for local script' )
81
- }
82
- const data = item . file
81
+ const data = item . file || ''
83
82
setOverride ( id , data )
84
83
break
85
84
}
@@ -88,13 +87,13 @@ export async function createOverride(item: Partial<IOverrideItem>): Promise<IOve
88
87
return newItem
89
88
}
90
89
91
- export function getOverride ( id : string ) : string {
92
- if ( ! fs . existsSync ( overridePath ( id ) ) ) {
90
+ export async function getOverride ( id : string ) : Promise < string > {
91
+ if ( ! existsSync ( overridePath ( id ) ) ) {
93
92
return `function main(config){ return config }`
94
93
}
95
- return fs . readFileSync ( overridePath ( id ) , 'utf-8' )
94
+ return await readFile ( overridePath ( id ) , 'utf-8' )
96
95
}
97
96
98
- export function setOverride ( id : string , content : string ) : void {
99
- fs . writeFileSync ( overridePath ( id ) , content , 'utf-8' )
97
+ export async function setOverride ( id : string , content : string ) : Promise < void > {
98
+ await writeFile ( overridePath ( id ) , content , 'utf-8' )
100
99
}
0 commit comments