perf: 优化桌面端服务

This commit is contained in:
kuaifan 2025-07-08 16:34:40 +08:00
parent eaa8ae66db
commit b5e6eff65d

61
electron/electron.js vendored
View File

@ -19,6 +19,7 @@ const {
const {autoUpdater} = require("electron-updater")
const Store = require("electron-store");
const loger = require("electron-log");
const axios = require('axios');
const electronConf = require('electron-config')
const userConf = new electronConf()
const fsProm = require('fs/promises');
@ -50,7 +51,8 @@ let mainWindow = null,
isDevelopMode = false,
serverPort = 22223,
serverPublicDir = path.join(__dirname, 'public'),
serverUrl = "";
serverUrl = "",
serverTimer = null;
let screenshotObj = null,
screenshotKey = null;
@ -91,8 +93,8 @@ if (!fs.existsSync(cacheDir)) {
/**
* 启动web服务
*/
async function startWebServer() {
if (serverUrl) {
async function startWebServer(force = false) {
if (serverUrl && !force) {
return Promise.resolve();
}
@ -138,26 +140,57 @@ async function startWebServer() {
// 错误处理中间件
app.use((err, req, res, next) => {
console.error('Server error:', err);
loger.error('Server error:', err);
res.status(500).send('Internal Server Error');
});
// 启动服务器
const server = app.listen(serverPort, 'localhost', () => {
console.log(`Express static file server running at http://localhost:${serverPort}/`);
console.log(`Serving files from: ${serverPublicDir}`);
loger.info(`Express static file server running at http://localhost:${serverPort}/`);
loger.info(`Serving files from: ${serverPublicDir}`);
serverUrl = `http://localhost:${serverPort}/`;
resolve(server);
// 启动健康检查定时器
serverTimeout();
});
// 错误处理
server.on('error', (err) => {
console.error('Server error:', err);
loger.error('Server error:', err);
reject(err);
});
});
}
/**
* 健康检查定时器
*/
function serverTimeout() {
clearTimeout(serverTimer)
serverTimer = setTimeout(async () => {
if (!serverUrl) {
return; // 没有服务器URL直接返回
}
try {
const res = await axios.head(serverUrl + 'health')
if (res.status === 200) {
serverTimeout() // 健康检查通过,重新设置定时器
return;
}
loger.error('Server health check failed with status: ' + res.status);
} catch (err) {
loger.error('Server health check error:', err);
}
// 如果健康检查失败,尝试重新启动服务器
try {
await startWebServer(true)
loger.info('Server restarted successfully');
} catch (error) {
loger.error('Failed to restart server:', error);
}
}, 10000)
}
/**
* 创建主窗口
*/
@ -255,7 +288,7 @@ function createUpdaterWindow(updateTitle) {
// 检查updater应用是否存在
if (!fs.existsSync(updaterPath)) {
console.log('Updater not found:', updaterPath);
loger.error('Updater not found:', updaterPath);
return;
}
@ -267,13 +300,13 @@ function createUpdaterWindow(updateTitle) {
try {
spawn('icacls', [updaterPath, '/grant', 'everyone:F'], { stdio: 'inherit', shell: true });
} catch (e) {
console.log('Failed to set executable permission:', e);
loger.error('Failed to set executable permission:', e);
}
} else if (process.platform === 'darwin') {
try {
spawn('chmod', ['+x', updaterPath], {stdio: 'inherit'});
} catch (e) {
console.log('Failed to set executable permission:', e);
loger.error('Failed to set executable permission:', e);
}
}
}
@ -296,11 +329,11 @@ function createUpdaterWindow(updateTitle) {
child.unref();
child.on('error', (err) => {
console.log('Updater process error:', err);
loger.error('Updater process error:', err);
});
} catch (e) {
console.log('Failed to create updater process:', e);
loger.error('Failed to create updater process:', e);
}
}
@ -408,7 +441,7 @@ function createChildWindow(args) {
} else {
// 创建新窗口
browser = new BrowserWindow(options)
console.log("create new window")
loger.info("create new window")
}
browser.on('page-title-updated', (event, title) => {
@ -1411,7 +1444,7 @@ ipcMain.on('copyImageAt', (event, args) => {
try {
event.sender.copyImageAt(args.x, args.y);
} catch (e) {
// loger.error(e)
loger.error('copyImageAt error:', e)
}
event.returnValue = "ok"
})