diff --git a/.gitignore b/.gitignore index 8a2719e..2fa750f 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ !tmp/.gitkeep tools/ +!tools/serve-frontend.mjs # Local helper/status files .git_status_output.txt \ No newline at end of file diff --git "a/journals/20260304-0002-\343\203\235\343\203\274\343\203\210\351\231\244\345\244\226\345\225\217\351\241\214\343\201\256\350\247\243\346\261\272\343\201\250\350\250\255\345\256\232\344\277\235\345\255\230\344\277\256\346\255\243.md" "b/journals/20260304-0002-\343\203\235\343\203\274\343\203\210\351\231\244\345\244\226\345\225\217\351\241\214\343\201\256\350\247\243\346\261\272\343\201\250\350\250\255\345\256\232\344\277\235\345\255\230\344\277\256\346\255\243.md" new file mode 100644 index 0000000..d05a72c --- /dev/null +++ "b/journals/20260304-0002-\343\203\235\343\203\274\343\203\210\351\231\244\345\244\226\345\225\217\351\241\214\343\201\256\350\247\243\346\261\272\343\201\250\350\250\255\345\256\232\344\277\235\345\255\230\344\277\256\346\255\243.md" @@ -0,0 +1,26 @@ +# 20260304-0002 ポート除外問題の解決と設定保存修正 + +## 概要 +開発起動時の黒画面・ERR_CONNECTION_RESET を根本解決し、設定保存の limit フィールド欠落を修正。 + +## 変更内容 + +### 1. dev サーバーポート問題の解決 +- **根本原因**: Windows の Hyper-V/WSL2 が TCP ポート 1374-1473 を除外。Tauri 内蔵 dev サーバーが選択するポート 1474 付近でも TCP ハンドシェイクが完了しなかった。 +- **診断方法**: 複数ポートでの接続テスト、`netstat` の SYN_RECEIVED/SYN_SENT 状態確認、`netsh interface ipv4 show excludedportrange` で除外範囲を特定。 +- **修正**: `tools/serve-frontend.mjs` を作成しポート 8474 で `src/frontend/` を配信。`tauri.conf.json` に `devUrl` と `beforeDevCommand` を設定。 + +### 2. 設定保存条件の limit フィールド追加 +- `lib.rs` と `handlers.rs` の `to_write` 判定条件に `limit` フィールドを追加。 +- limit のみ更新した場合にフォールバック処理に流れて保存されない問題を修正。 + +### 3. package.json 整理 +- 不要になった `dev:frontend` スクリプトを削除。 + +## 影響ファイル +- `tools/serve-frontend.mjs` (新規) +- `src/backend/tauri.conf.json` +- `src/backend/src/lib.rs` +- `src/backend/src/mcp/handlers.rs` +- `package.json` +- `.gitignore` diff --git a/package.json b/package.json index a477b1f..2f4d5e2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "type": "module", "scripts": { "tauri": "tauri", - "dev:frontend": "npx --yes serve src/frontend -l 1474", "copy-editor": "node tools/copy-toast-ui-editor.js", "build-editor": "vite build --config tools/vite.config.editor.mjs" }, diff --git a/src/backend/src/lib.rs b/src/backend/src/lib.rs index be63e98..476fe3c 100644 --- a/src/backend/src/lib.rs +++ b/src/backend/src/lib.rs @@ -56,7 +56,7 @@ let dir = app.path().app_data_dir().map_err(|e| e.to_string())?; std::fs::create_dir_all(&dir).map_err(|e| e.to_string())?; let path = dir.join("settings.json"); - let to_write = if settings.get("min_score").is_some() || settings.get("run_on_login").is_some() || settings.get("monitor_paths").is_some() { + let to_write = if settings.get("min_score").is_some() || settings.get("limit").is_some() || settings.get("run_on_login").is_some() || settings.get("monitor_paths").is_some() { settings.clone() } else if let Some(inner) = settings.get("settings").and_then(|v| v.as_object()) { serde_json::to_value(inner).unwrap_or(settings) diff --git a/src/backend/src/mcp/handlers.rs b/src/backend/src/mcp/handlers.rs index f327b5a..6d9bfe0 100644 --- a/src/backend/src/mcp/handlers.rs +++ b/src/backend/src/mcp/handlers.rs @@ -98,7 +98,7 @@ log::error!("settings_post: create_dir_all {:?}", e); return (axum::http::StatusCode::INTERNAL_SERVER_ERROR, Json(serde_json::json!({"error": "failed to create dir"}))); } - let to_write = if payload.get("min_score").is_some() || payload.get("run_on_login").is_some() || payload.get("monitor_paths").is_some() { + let to_write = if payload.get("min_score").is_some() || payload.get("limit").is_some() || payload.get("run_on_login").is_some() || payload.get("monitor_paths").is_some() { payload.clone() } else if let Some(inner) = payload.get("settings").and_then(|v| v.as_object()) { serde_json::to_value(inner).unwrap_or(payload) diff --git a/src/backend/tauri.conf.json b/src/backend/tauri.conf.json index 1dec81e..8c80699 100644 --- a/src/backend/tauri.conf.json +++ b/src/backend/tauri.conf.json @@ -5,8 +5,8 @@ "identifier": "com.telosdb.app", "build": { "frontendDist": "../frontend", - "devUrl": "http://127.0.0.1:1474", - "beforeDevCommand": "npm run dev:frontend" + "devUrl": "http://127.0.0.1:8474", + "beforeDevCommand": "node tools/serve-frontend.mjs" }, "app": { "windows": [{ "title": "TelosDB", "width": 800, "height": 600, "resizable": true, "fullscreen": false }], diff --git a/tools/serve-frontend.mjs b/tools/serve-frontend.mjs new file mode 100644 index 0000000..f8b40ce --- /dev/null +++ b/tools/serve-frontend.mjs @@ -0,0 +1,28 @@ +import { createServer } from 'http'; +import { readFile } from 'fs/promises'; +import { join, extname } from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = fileURLToPath(new URL('.', import.meta.url)); +const root = join(__dirname, '..', 'src', 'frontend'); +const PORT = 8474; + +const MIME = { + '.html': 'text/html', '.js': 'application/javascript', '.mjs': 'application/javascript', + '.css': 'text/css', '.json': 'application/json', '.svg': 'image/svg+xml', + '.png': 'image/png', '.ico': 'image/x-icon', '.woff2': 'font/woff2', +}; + +createServer(async (req, res) => { + let filePath = join(root, req.url === '/' ? 'index.html' : req.url); + try { + const data = await readFile(filePath); + res.writeHead(200, { 'Content-Type': MIME[extname(filePath)] || 'application/octet-stream' }); + res.end(data); + } catch { + res.writeHead(404); + res.end('Not Found'); + } +}).listen(PORT, '127.0.0.1', () => { + console.log(`Frontend dev server ready on http://127.0.0.1:${PORT}`); +});