Skip to content

feat: auto-generate certificates and show error details#5

Merged
rymizuki merged 2 commits intomainfrom
feature/show-error-reason
Jan 19, 2026
Merged

feat: auto-generate certificates and show error details#5
rymizuki merged 2 commits intomainfrom
feature/show-error-reason

Conversation

@rymizuki
Copy link
Copy Markdown
Contributor

@rymizuki rymizuki commented Jan 19, 2026

Summary

  • エラー発生時に UI にエラーメッセージを表示
  • mkcert バイナリを同梱し、Base Domain 保存時に証明書を自動生成
  • プロキシ再起動時の接続クローズ処理を修正

Changes

  • CertManager クラスを追加(証明書の確認・生成)
  • mkcert バイナリ(macOS arm64/x64)をバンドル
  • Settings 保存時に証明書がなければ自動生成
  • エラーメッセージをヘッダー下に表示
  • stop()closeAllConnections() を使用して確実に接続を閉じる

Test plan

  • 新規インストール後、Settings で Base Domain を設定 → 証明書が自動生成される
  • 証明書なしで起動 → エラーメッセージが表示される
  • Settings を連続で Save → エラーなく再起動される

🤖 Generated with Claude Code

Greptile Summary

このPRは、証明書の自動生成機能とエラーメッセージUI表示機能を追加する重要な改善。Settings で Base Domain を保存すると mkcert を使って自動的にワイルドカード証明書が生成され、ユーザーが手動で証明書を用意する手間を省く。また、プロキシ起動時のエラーをUIに表示するようになり、ユーザーエクスペリエンスが大幅に向上。

主な変更点:

  • CertManager クラスを新規作成し、mkcert バイナリの実行、CA確認、証明書生成をカプセル化
  • mkcert バイナリ(macOS arm64/x64)をアプリにバンドル
  • Settings 保存時に証明書がなければ自動生成(ipc-handlers.ts:47-54
  • エラーメッセージを ProxyStatusPayload で伝達し、UIに表示(renderer/main.ts:412-423
  • プロキシ再起動時に closeAllConnections() を使用して接続を確実にクローズ(proxy-server.ts:214-224

懸念点:

  • ipc-handlers.ts:47-54ensureCert() のエラーハンドリングが不足。証明書生成失敗時(特にユーザーが sudo パスワード入力をキャンセルした場合)にユーザーに分かりやすいエラーが表示されない
  • closeAllConnections() の Node.js バージョン互換性確認が必要

Confidence Score: 4/5

  • このPRは重要な機能改善を含むが、エラーハンドリングに改善の余地がある
  • 証明書の自動生成とエラー表示は適切に実装されているが、ipc-handlers.ts での ensureCert() のエラーハンドリング不足により、証明書生成失敗時のユーザーエクスペリエンスが低下する可能性がある。特に sudo パスワード入力のキャンセル時の動作が不明瞭。また、closeAllConnections() の Node.js バージョン互換性が未確認。これらの問題を修正すれば安全にマージ可能
  • src/main/ipc-handlers.ts のエラーハンドリングに注意が必要

Important Files Changed

Filename Overview
src/main/cert-manager.ts 新規作成された証明書管理クラス。mkcertバイナリの実行、CA確認、証明書生成を行う。エラーハンドリングに軽微な改善余地あり
src/main/ipc-handlers.ts base_domain設定保存時に証明書を自動生成する処理を追加。型安全性も向上
src/main/proxy-server.ts 証明書パス解決をCertManagerに移譲、closeAllConnections()による確実な接続クローズ、エラーメッセージの保持を追加。stop()のロジックが複雑化
src/renderer/main.ts ProxyStatusPayload対応、エラーメッセージをUIに表示する処理を追加
src/shared/types.ts ProxyStatusPayloadインターフェースを追加し、エラーメッセージを含められるよう拡張

Sequence Diagram

sequenceDiagram
    participant User
    participant Renderer
    participant IPC
    participant CertManager
    participant ProxyServer
    participant mkcert

    Note over User,mkcert: Settings保存時の証明書自動生成フロー
    
    User->>Renderer: Base Domainを入力して保存
    Renderer->>IPC: config:set (base_domain)
    IPC->>CertManager: checkCertExists(baseDomain)
    CertManager-->>IPC: { exists: false }
    
    alt 証明書が存在しない
        IPC->>CertManager: ensureCert(baseDomain)
        CertManager->>CertManager: isCAInstalled()
        CertManager->>mkcert: -CAROOT
        mkcert-->>CertManager: CA root path
        
        alt CAが未インストール
            CertManager->>mkcert: -install (sudo required)
            mkcert-->>User: sudoパスワード要求
            User-->>mkcert: パスワード入力
            mkcert-->>CertManager: CA installed
        end
        
        CertManager->>mkcert: *.{baseDomain}
        mkcert-->>CertManager: 証明書生成完了
        CertManager-->>IPC: CertPaths
    end
    
    IPC->>Renderer: 保存完了
    Renderer->>IPC: restartProxy()
    IPC->>ProxyServer: restart()
    
    Note over ProxyServer: プロキシ再起動フロー
    
    ProxyServer->>ProxyServer: stop()
    
    alt サーバーが稼働中
        ProxyServer->>ProxyServer: closeAllConnections()
        ProxyServer->>ProxyServer: httpServer.close()
        ProxyServer->>ProxyServer: httpsServer.close()
        ProxyServer->>ProxyServer: cleanup()
    end
    
    ProxyServer->>ProxyServer: start()
    ProxyServer->>CertManager: checkCertExists(baseDomain)
    CertManager-->>ProxyServer: { exists: true, paths }
    
    alt 証明書が存在しない
        ProxyServer->>ProxyServer: setStatus('error', message)
        ProxyServer->>Renderer: proxy:status (error + message)
        Renderer->>User: エラーメッセージを表示
    else 証明書が存在する
        ProxyServer->>ProxyServer: 証明書を読み込み
        ProxyServer->>ProxyServer: HTTPサーバー起動
        ProxyServer->>ProxyServer: HTTPSサーバー起動
        ProxyServer->>ProxyServer: setStatus('running')
        ProxyServer->>Renderer: proxy:status (running)
        Renderer->>User: Status: Running
    end
Loading

- Add CertManager to auto-generate TLS certificates using bundled mkcert
- Bundle mkcert binaries for macOS (arm64/x64)
- Generate certificates when Base Domain is saved in Settings
- Show error message in UI when proxy fails to start
- Fix proxy restart to properly close connections before restarting
- Store certificates in ~/Library/Application Support/dev-proxy/certs/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Copy Markdown

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

12 files reviewed, 4 comments

Edit Code Review Agent Settings | Greptile

Comment thread src/main/cert-manager.ts Outdated
Comment thread src/main/ipc-handlers.ts
Comment thread src/main/cert-manager.ts
Comment thread src/main/proxy-server.ts
- Add try-catch to installCA() with descriptive error message
- Add try-catch to generateCert() with descriptive error message
- Add try-catch to ensureCert() call in ipc-handlers.ts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@rymizuki rymizuki merged commit b8fb5b4 into main Jan 19, 2026
4 checks passed
@rymizuki rymizuki deleted the feature/show-error-reason branch January 19, 2026 11:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant