Skip to content

Commit b8790fd

Browse files
committed
beta 0.9 添加手動重啟 RPC 伺服器的功能
1 parent 54f5e6c commit b8790fd

File tree

6 files changed

+73
-6
lines changed

6 files changed

+73
-6
lines changed

package-lock.json

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "llamacpp-distributed-inference",
3-
"version": "0.0.8",
3+
"version": "0.0.9",
44
"description": "分佈式 LLM 推理桌面應用程式",
55
"main": "src/main/index.js",
66
"type": "module",

src/main/index.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ function createWindow() {
5050

5151
// 啟動 RPC 伺服器
5252
function startRpcServer() {
53+
// 檢查是否已有 RPC server 在運行
54+
if (rpcServerProcess) {
55+
console.log('RPC server is already running');
56+
// 通知前端 RPC 伺服器狀態
57+
setTimeout(() => {
58+
mainWindow?.webContents.send('rpc-server-status', true);
59+
}, 100);
60+
return;
61+
}
62+
5363
const platform = process.platform;
5464
const osMap = {
5565
'win32': 'windows',
@@ -81,6 +91,7 @@ function startRpcServer() {
8191

8292
rpcServerProcess.on('close', (code) => {
8393
console.log(`rpc-server process exited with code ${code}`);
94+
rpcServerProcess = null; // 清除進程引用
8495
mainWindow?.webContents.send('rpc-server-status', false);
8596
});
8697

@@ -91,6 +102,7 @@ function startRpcServer() {
91102

92103
} catch (error) {
93104
console.error('Failed to start rpc-server:', error);
105+
rpcServerProcess = null; // 清除進程引用
94106
mainWindow?.webContents.send('rpc-server-error', error.message);
95107
}
96108
}
@@ -701,6 +713,26 @@ ipcMain.handle('remove-node', async (event, nodeIp) => {
701713
}
702714
});
703715

716+
// 重啟 RPC server
717+
ipcMain.handle('restart-rpc-server', async () => {
718+
try {
719+
// 停止現有的 RPC server
720+
if (rpcServerProcess) {
721+
rpcServerProcess.kill();
722+
rpcServerProcess = null;
723+
console.log('RPC server stopped for restart');
724+
}
725+
726+
// 重新啟動 RPC server
727+
startRpcServer();
728+
729+
return { success: true, message: 'RPC server 重啟中...' };
730+
} catch (error) {
731+
console.error('Failed to restart RPC server:', error);
732+
return { success: false, message: `重啟 RPC server 失敗: ${error.message}` };
733+
}
734+
});
735+
704736
// 應用程式事件
705737
app.whenReady().then(() => {
706738
createWindow();

src/preload/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ contextBridge.exposeInMainWorld('electronAPI', {
2020
browseModelsFolder: () => ipcRenderer.invoke('browse-models-folder'),
2121
openModelsFolder: () => ipcRenderer.invoke('open-models-folder'),
2222

23+
// RPC server 控制
24+
restartRpcServer: () => ipcRenderer.invoke('restart-rpc-server'),
25+
2326
// 節點發現
2427
getDiscoveredNodes: () => ipcRenderer.invoke('get-discovered-nodes'),
2528
getLocalIps: () => ipcRenderer.invoke('get-local-ips'),

src/renderer/app.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const elements = {
2929
modelsPathBtn: document.getElementById('models-path-btn'),
3030
settingsBtn: document.getElementById('settings-btn'),
3131
addNodeBtn: document.getElementById('add-node-btn'),
32+
restartRpcBtn: document.getElementById('restart-rpc-btn'),
3233
apiKeyModal: document.getElementById('api-key-modal'),
3334
apiKeyInput: document.getElementById('api-key-input'),
3435
saveApiKeyBtn: document.getElementById('save-api-key'),
@@ -753,6 +754,29 @@ async function saveApiKey() {
753754
}
754755
}
755756

757+
// 重啟 RPC server
758+
async function restartRpcServer() {
759+
try {
760+
// 顯示正在重啟狀態
761+
elements.restartRpcBtn.disabled = true;
762+
elements.restartRpcBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 重啟中...';
763+
764+
const result = await window.electronAPI.restartRpcServer();
765+
766+
if (result.success) {
767+
logMessage('系統', result.message, 'success');
768+
} else {
769+
logMessage('系統', result.message, 'error');
770+
}
771+
} catch (error) {
772+
logMessage('系統', `重啟 RPC server 失敗: ${error.message}`, 'error');
773+
} finally {
774+
// 恢復按鈕狀態
775+
elements.restartRpcBtn.disabled = false;
776+
elements.restartRpcBtn.innerHTML = '<i class="fas fa-redo"></i> 重啟 RPC 伺服器';
777+
}
778+
}
779+
756780
// 記錄訊息
757781
function logMessage(category, message, type = 'info') {
758782
const timestamp = new Date().toLocaleTimeString();
@@ -807,6 +831,9 @@ function setupEventListeners() {
807831
elements.apiKeyModal.style.display = 'block';
808832
});
809833

834+
// 重啟 RPC server 按鈕
835+
elements.restartRpcBtn.addEventListener('click', restartRpcServer);
836+
810837
// 手動添加節點按鈕 (移除重複的事件監聽器)
811838

812839
// GPU 控制同步

src/renderer/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ <h2><i class="fas fa-chart-line"></i> 全局狀態</h2>
5858
<span class="status-label">連接節點數</span>
5959
<span id="node-count" class="node-count">0/0</span>
6060
</div>
61+
<div class="status-item">
62+
<button id="restart-rpc-btn" class="btn btn-secondary" style="width: 100%; margin-top: 10px;">
63+
<i class="fas fa-redo"></i> 重啟 RPC 伺服器
64+
</button>
65+
</div>
6166
</div>
6267
</div>
6368

0 commit comments

Comments
 (0)