稳定测试版
This commit is contained in:
78
main/services/iosai.js
Normal file
78
main/services/iosai.js
Normal file
@@ -0,0 +1,78 @@
|
||||
// main/services/iosai.js
|
||||
const { app } = require('electron')
|
||||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
const { exec } = require('child_process')
|
||||
const axios = require('axios')
|
||||
|
||||
let iosAIProcess = null
|
||||
let userData = { tenantId: null, userId: null, tokenValue: null } // 如果需要共享,请提供 setter
|
||||
|
||||
function resolveIOSAIPath() {
|
||||
const candidates = [
|
||||
path.join(path.dirname(process.execPath), 'iOSAI', 'IOSAI.exe'),
|
||||
path.join(process.resourcesPath || '', 'iOSAI', 'IOSAI.exe'),
|
||||
path.join(__dirname, '..', 'iOSAI', 'IOSAI.exe'),
|
||||
path.join(process.cwd(), 'iOSAI', 'IOSAI.exe'),
|
||||
]
|
||||
for (const p of candidates) {
|
||||
try { if (fs.existsSync(p)) return p } catch { }
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function startIOSAIExecutable() {
|
||||
if (process.platform !== 'win32') {
|
||||
console.warn('[IOSAI] 非 Windows,跳过')
|
||||
return
|
||||
}
|
||||
const exePath = resolveIOSAIPath()
|
||||
if (!exePath) return console.error('[IOSAI] 未找到 IOSAI.exe')
|
||||
|
||||
const exeDir = path.dirname(exePath)
|
||||
const exeFile = path.basename(exePath)
|
||||
const cmd = `start "" /D "${exeDir}" "${exeFile}"`
|
||||
|
||||
try {
|
||||
exec(cmd, { cwd: exeDir, windowsHide: false }, (err) => {
|
||||
if (err) console.error('[IOSAI] 启动失败:', err)
|
||||
else console.log('[IOSAI] 启动命令已执行')
|
||||
})
|
||||
} catch (e) { console.error('[IOSAI] 启动异常:', e) }
|
||||
}
|
||||
|
||||
async function killIOSAI() {
|
||||
try {
|
||||
if (userData.userId && userData.tenantId) {
|
||||
await axios.post('https://crawlclient.api.yolozs.com/api/user/aiChat-logout',
|
||||
{ userId: userData.userId, tenantId: userData.tenantId },
|
||||
{ headers: { 'Content-Type': 'application/json', 'vvtoken': userData.tokenValue } }
|
||||
).catch(e => console.log('[IOSAI] 登出失败', e?.message))
|
||||
}
|
||||
if (iosAIProcess?.pid) {
|
||||
exec(`taskkill /PID ${iosAIProcess.pid} /T /F`, (err) => {
|
||||
if (err) {
|
||||
exec('taskkill /IM IOSAI.exe /F')
|
||||
}
|
||||
})
|
||||
} else {
|
||||
exec('taskkill /IM IOSAI.exe /F')
|
||||
exec('taskkill /IM iproxy.exe /F')
|
||||
exec('taskkill /IM tidevice.exe /F')
|
||||
}
|
||||
} catch { }
|
||||
iosAIProcess = null
|
||||
}
|
||||
|
||||
function isProcessRunningWin(exeName) {
|
||||
return new Promise((resolve) => {
|
||||
if (process.platform !== 'win32') return resolve(true)
|
||||
const cmd = `tasklist /FI "IMAGENAME eq ${exeName}" /FO CSV /NH`
|
||||
exec(cmd, { windowsHide: true }, (err, stdout) => {
|
||||
if (err || !stdout) return resolve(false)
|
||||
resolve(stdout.toLowerCase().includes(`"${exeName.toLowerCase()}"`))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = { startIOSAIExecutable, killIOSAI, isProcessRunningWin }
|
||||
20
main/services/sse.js
Normal file
20
main/services/sse.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// main/services/sse.js
|
||||
const { startSSE } = require('../../js/sse-server')
|
||||
const { createBurstBroadcaster } = require('../../js/burst-broadcast')
|
||||
|
||||
function start() {
|
||||
const sseServer = startSSE()
|
||||
const broadcast = createBurstBroadcaster(sseServer.broadcast, {
|
||||
event: 'message',
|
||||
idleMs: 10_000,
|
||||
startPayload: 'start',
|
||||
startOnFirst: true
|
||||
})
|
||||
// 返回一个统一接口
|
||||
return {
|
||||
broadcast: (event, payload) => sseServer.broadcast(event, payload),
|
||||
burst: broadcast,
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { startSSE: start }
|
||||
Reference in New Issue
Block a user