const PAC_FILE = 'data/.cache/pac.txt'
window[Plugin.id] = window[Plugin.id] || {
pacScript: Vue.ref(''),
history: Vue.ref([]),
saving: Vue.ref(false)
}
/* 触发器 手动触发 */
const onRun = async () => {
const component = {
template: `
`,
setup() {
const { ref } = Vue
const running = ref(false)
const needRestart = ref(false)
const pacScript = window[Plugin.id].pacScript
const requestHistory = window[Plugin.id].history
const url = `http://127.0.0.1:${Plugin.Address.split(':').pop()}/pac`
isRunning().then((res) => (running.value = res))
readPacFile().then((res) => (pacScript.value = res))
return {
url,
running,
needRestart,
pacScript,
requestHistory,
requestHistoryColumns: [
{ key: 'count', title: '查询次数', align: 'center' },
{ key: 'ua', title: 'User-Agent' }
],
async copyURL() {
await Plugins.ClipboardSetText(url)
Plugins.message.success('common.success')
},
async handleToggleServer() {
if (running.value && needRestart.value) {
await stopPacServer()
await startPacServer()
needRestart.value = false
return
}
if (running.value) {
await stopPacServer()
} else {
await startPacServer()
}
running.value = !running.value
},
async handlePacChange() {
needRestart.value = true
await writePacFile(pacScript.value)
}
}
}
}
const modal = Plugins.modal(
{
title: Plugin.name,
submit: false,
cancelText: 'common.close',
maskClosable: true,
width: '80',
height: '80',
afterClose() {
modal.destroy()
}
},
{
default: () => Vue.h(component),
action: () => (window[Plugin.id].saving.value ? Vue.h(Vue.resolveComponent('Icon'), { icon: 'loading', class: 'rotation mr-auto' }) : null)
}
)
modal.open()
}
/* 触发器 核心启动后 */
const onCoreStarted = async () => {
await startPacServer().catch((error) => {
console.log(`[${Plugin.name}]`, '启动服务失败', error)
})
return 1
}
/* 触发器 核心停止后 */
const onCoreStopped = async () => {
await stopPacServer().catch((error) => {
console.log(`[${Plugin.name}]`, '停止服务失败', error)
})
return 2
}
const Start = onCoreStarted
const Stop = onCoreStopped
const readPacFile = async () => {
return await Plugins.ReadFile(PAC_FILE).catch(() => `function FindProxyForURL(url, host) {\n\treturn 'PROXY IP:PORT'\n}`)
}
const writePacFile = async (content) => {
window[Plugin.id].saving.value = true
await Plugins.WriteFile(PAC_FILE, content).catch((error) => {
console.log(`[${Plugin.name}]`, '保存pac内容失败', error)
})
await Plugins.sleep(200)
window[Plugin.id].saving.value = false
}
const isRunning = async () => {
const list = await Plugins.ListServer()
return list.includes(Plugin.id)
}
const stopPacServer = async () => {
await Plugins.StopServer(Plugin.id)
console.log(`[${Plugin.name}]`, '服务已停止')
}
const startPacServer = async () => {
const record = (req) => {
const key = req.headers['User-Agent']
const item = window[Plugin.id].history.value.find((v) => v.ua === key)
if (item) {
item.count += 1
} else {
window[Plugin.id].history.value.push({ ua: key, count: 1 })
}
}
if (!window[Plugin.id].pacScript.value) {
const script = await readPacFile()
window[Plugin.id].pacScript.value = script
}
await Plugins.StartServer(Plugin.Address, Plugin.id, async (req, res) => {
if (req.url === '/pac') {
record(req)
return res.end(200, { 'Content-Type': 'text/plain; charset=utf-8' }, window[Plugin.id].pacScript.value)
}
res.end(200, { 'Content-Type': 'text/plain; charset=utf-8' }, 'PAC service is running.')
})
console.log(`[${Plugin.name}]`, '服务已启动')
}