Skip to content

Commit 2c5aa1a

Browse files
author
pompurin404
committed
use async and optimize error handling
1 parent 2b62a2f commit 2c5aa1a

23 files changed

+812
-733
lines changed

src/main/config/app.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1+
import { readFile, writeFile } from 'fs/promises'
12
import { appConfigPath } from '../utils/dirs'
23
import yaml from 'yaml'
3-
import fs from 'fs'
44

5-
export let appConfig: IAppConfig // config.yaml
5+
let appConfig: IAppConfig // config.yaml
66

7-
export function getAppConfig(force = false): IAppConfig {
7+
export async function getAppConfig(force = false): Promise<IAppConfig> {
88
if (force || !appConfig) {
9-
appConfig = yaml.parse(fs.readFileSync(appConfigPath(), 'utf-8'))
9+
const data = await readFile(appConfigPath(), 'utf-8')
10+
appConfig = yaml.parse(data)
1011
}
1112
return appConfig
1213
}
1314

14-
export function setAppConfig(patch: Partial<IAppConfig>): void {
15+
export async function patchAppConfig(patch: Partial<IAppConfig>): Promise<void> {
1516
if (patch.sysProxy) {
1617
const oldSysProxy = appConfig.sysProxy || {}
1718
const newSysProxy = Object.assign(oldSysProxy, patch.sysProxy)
1819
patch.sysProxy = newSysProxy
1920
}
2021
appConfig = Object.assign(appConfig, patch)
21-
fs.writeFileSync(appConfigPath(), yaml.stringify(appConfig))
22+
await writeFile(appConfigPath(), yaml.stringify(appConfig))
2223
}

src/main/config/controledMihomo.ts

+13-11
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
import { controledMihomoConfigPath } from '../utils/dirs'
2+
import { readFile, writeFile } from 'fs/promises'
23
import yaml from 'yaml'
3-
import fs from 'fs'
44
import { getAxios, startMihomoMemory, startMihomoTraffic } from '../core/mihomoApi'
55
import { generateProfile } from '../resolve/factory'
66
import { getAppConfig } from './app'
77

8-
export let controledMihomoConfig: Partial<IMihomoConfig> // mihomo.yaml
8+
let controledMihomoConfig: Partial<IMihomoConfig> // mihomo.yaml
99

10-
export function getControledMihomoConfig(force = false): Partial<IMihomoConfig> {
10+
export async function getControledMihomoConfig(force = false): Promise<Partial<IMihomoConfig>> {
1111
if (force || !controledMihomoConfig) {
12-
controledMihomoConfig = yaml.parse(fs.readFileSync(controledMihomoConfigPath(), 'utf-8'))
12+
const data = await readFile(controledMihomoConfigPath(), 'utf-8')
13+
controledMihomoConfig = yaml.parse(data)
1314
}
1415
return controledMihomoConfig
1516
}
1617

17-
export function setControledMihomoConfig(patch: Partial<IMihomoConfig>): void {
18-
const { useNameserverPolicy } = getAppConfig()
18+
export async function patchControledMihomoConfig(patch: Partial<IMihomoConfig>): Promise<void> {
19+
const { useNameserverPolicy } = await getAppConfig()
1920
if (patch.tun) {
2021
const oldTun = controledMihomoConfig.tun || {}
2122
const newTun = Object.assign(oldTun, patch.tun)
@@ -35,11 +36,12 @@ export function setControledMihomoConfig(patch: Partial<IMihomoConfig>): void {
3536
patch.sniffer = newSniffer
3637
}
3738
controledMihomoConfig = Object.assign(controledMihomoConfig, patch)
39+
3840
if (patch['external-controller'] || patch.secret) {
39-
getAxios(true)
40-
startMihomoMemory()
41-
startMihomoTraffic()
41+
await getAxios(true)
42+
await startMihomoMemory()
43+
await startMihomoTraffic()
4244
}
43-
generateProfile()
44-
fs.writeFileSync(controledMihomoConfigPath(), yaml.stringify(controledMihomoConfig))
45+
await generateProfile()
46+
await writeFile(controledMihomoConfigPath(), yaml.stringify(controledMihomoConfig), 'utf-8')
4547
}

src/main/config/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
export { getAppConfig, setAppConfig } from './app'
2-
export { getControledMihomoConfig, setControledMihomoConfig } from './controledMihomo'
1+
export { getAppConfig, patchAppConfig } from './app'
2+
export { getControledMihomoConfig, patchControledMihomoConfig } from './controledMihomo'
33
export {
44
getProfile,
55
getCurrentProfileItem,

src/main/config/override.ts

+47-48
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,56 @@
11
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'
62
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'
77

88
let overrideConfig: IOverrideConfig // override.yaml
99

10-
export function getOverrideConfig(force = false): IOverrideConfig {
10+
export async function getOverrideConfig(force = false): Promise<IOverrideConfig> {
1111
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)
1314
}
1415
return overrideConfig
1516
}
1617

17-
export function setOverrideConfig(config: IOverrideConfig): void {
18+
export async function setOverrideConfig(config: IOverrideConfig): Promise<void> {
1819
overrideConfig = config
19-
fs.writeFileSync(overrideConfigPath(), yaml.stringify(overrideConfig))
20+
await writeFile(overrideConfigPath(), yaml.stringify(overrideConfig), 'utf-8')
2021
}
2122

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)
2426
}
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)
2936
}
3037

3138
export async function addOverrideItem(item: Partial<IOverrideItem>): Promise<void> {
39+
const config = await getOverrideConfig()
3240
const newItem = await createOverride(item)
33-
if (overrideConfig.items.find((i) => i.id === newItem.id)) {
41+
if (await getOverrideItem(item.id)) {
3442
updateOverrideItem(newItem)
3543
} else {
36-
overrideConfig.items.push(newItem)
44+
config.items.push(newItem)
3745
}
38-
fs.writeFileSync(overrideConfigPath(), yaml.stringify(overrideConfig))
46+
await setOverrideConfig(config)
3947
}
4048

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))
4554
}
4655

4756
export async function createOverride(item: Partial<IOverrideItem>): Promise<IOverrideItem> {
@@ -55,31 +64,21 @@ export async function createOverride(item: Partial<IOverrideItem>): Promise<IOve
5564
} as IOverrideItem
5665
switch (newItem.type) {
5766
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)
7678
break
7779
}
7880
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 || ''
8382
setOverride(id, data)
8483
break
8584
}
@@ -88,13 +87,13 @@ export async function createOverride(item: Partial<IOverrideItem>): Promise<IOve
8887
return newItem
8988
}
9089

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))) {
9392
return `function main(config){ return config }`
9493
}
95-
return fs.readFileSync(overridePath(id), 'utf-8')
94+
return await readFile(overridePath(id), 'utf-8')
9695
}
9796

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')
10099
}

0 commit comments

Comments
 (0)