mihomo-party/src/main/config/override.ts
2024-10-28 21:44:37 +08:00

105 lines
3.3 KiB
TypeScript

import { overrideConfigPath, overridePath } from '../utils/dirs'
import { getControledMihomoConfig } from './controledMihomo'
import { readFile, writeFile, rm } from 'fs/promises'
import { existsSync } from 'fs'
import axios from 'axios'
import yaml from 'yaml'
let overrideConfig: IOverrideConfig // override.yaml
export async function getOverrideConfig(force = false): Promise<IOverrideConfig> {
if (force || !overrideConfig) {
const data = await readFile(overrideConfigPath(), 'utf-8')
overrideConfig = yaml.parse(data, { merge: true }) || { items: [] }
}
if (typeof overrideConfig !== 'object') overrideConfig = { items: [] }
return overrideConfig
}
export async function setOverrideConfig(config: IOverrideConfig): Promise<void> {
overrideConfig = config
await writeFile(overrideConfigPath(), yaml.stringify(overrideConfig), 'utf-8')
}
export async function getOverrideItem(id: string | undefined): Promise<IOverrideItem | undefined> {
const { items } = await getOverrideConfig()
return items.find((item) => item.id === id)
}
export async function updateOverrideItem(item: IOverrideItem): Promise<void> {
const config = await getOverrideConfig()
const index = config.items.findIndex((i) => i.id === item.id)
if (index === -1) {
throw new Error('Override not found')
}
config.items[index] = item
await setOverrideConfig(config)
}
export async function addOverrideItem(item: Partial<IOverrideItem>): Promise<void> {
const config = await getOverrideConfig()
const newItem = await createOverride(item)
if (await getOverrideItem(item.id)) {
updateOverrideItem(newItem)
} else {
config.items.push(newItem)
}
await setOverrideConfig(config)
}
export async function removeOverrideItem(id: string): Promise<void> {
const config = await getOverrideConfig()
const item = await getOverrideItem(id)
config.items = config.items?.filter((item) => item.id !== id)
await setOverrideConfig(config)
await rm(overridePath(id, item?.ext || 'js'))
}
export async function createOverride(item: Partial<IOverrideItem>): Promise<IOverrideItem> {
const id = item.id || new Date().getTime().toString(16)
const newItem = {
id,
name: item.name || (item.type === 'remote' ? 'Remote File' : 'Local File'),
type: item.type,
ext: item.ext || 'js',
url: item.url,
global: item.global || false,
updated: new Date().getTime()
} as IOverrideItem
switch (newItem.type) {
case 'remote': {
const { 'mixed-port': mixedPort = 7890 } = await getControledMihomoConfig()
if (!item.url) throw new Error('Empty URL')
const res = await axios.get(item.url, {
proxy: {
protocol: 'http',
host: '127.0.0.1',
port: mixedPort
},
responseType: 'text'
})
const data = res.data
await setOverride(id, newItem.ext, data)
break
}
case 'local': {
const data = item.file || ''
setOverride(id, newItem.ext, data)
break
}
}
return newItem
}
export async function getOverride(id: string, ext: 'js' | 'yaml' | 'log'): Promise<string> {
if (!existsSync(overridePath(id, ext))) {
return ''
}
return await readFile(overridePath(id, ext), 'utf-8')
}
export async function setOverride(id: string, ext: 'js' | 'yaml', content: string): Promise<void> {
await writeFile(overridePath(id, ext), content, 'utf-8')
}