# 通知設計書 21-served/killServer

## 概要

本ドキュメントは、serve-d LSPサーバーにおけるカスタム通知「served/killServer」の設計仕様を定義する。本通知はクライアント(エディタ)からサーバーに送信され、全てのDCDサーバープロセスを強制終了する。

### 本通知の処理概要

本通知は、serve-dが管理する全DCDサーバーインスタンスを強制停止するためのものである。

**業務上の目的・背景**：DCDサーバーが応答不能状態に陥った場合や、リソース解放のために手動でDCDプロセスを終了させたい場合に使用される。served/restartServer（リクエスト）とは異なり、killServerは単に停止するのみで再起動は行わない。主にデバッグ目的やエディタ拡張のクリーンアップ処理で使用される。

**通知の送信タイミング**：ユーザーがエディタ上のコマンドパレットやカスタムコマンドから「Kill DCD Server」を実行したとき、クライアント拡張がこの通知をサーバーに送信する。

**通知の受信者**：serve-d LSPサーバープロセスが受信者である。サーバーは全てのワークスペースインスタンスに対してDCDComponentのkillServer()を呼び出す。

**通知内容の概要**：本通知にはパラメータが存在しない。通知メソッド名「served/killServer」のみで処理が起動する。

**期待されるアクション**：サーバーは全DCDインスタンスのサーバープロセスを強制終了する。これにより自動補完機能が一時的に利用不可となる。再度利用するにはDCDサーバーの再起動が必要である。

## 通知種別

LSPカスタム通知（JSON-RPC Notification）。クライアントからサーバーへの方向（C->S）。

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（JSON-RPC notification） |
| 優先度 | 高 |
| リトライ | なし（通知のため応答なし） |

### 送信先決定ロジック

クライアントがserve-d LSPサーバーに直接送信する。受信者は常にserve-dプロセスである。

## 通知テンプレート

### メール通知の場合

該当なし。本通知はLSPプロトコル上のJSON-RPCメッセージである。

### 本文テンプレート

```json
{
  "jsonrpc": "2.0",
  "method": "served/killServer"
}
```

### 添付ファイル

該当なし。

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| （なし） | 本通知にパラメータは存在しない | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | ユーザーがコマンドパレットから「Kill Server」を選択 | なし（常に送信可能） | DCDサーバーの強制停止を要求 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 特になし | 本通知に送信抑止条件は定義されていない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[クライアント: killServerコマンド実行] --> B[served/killServer通知送信]
    B --> C[サーバー: killServer関数呼び出し]
    C --> D[全backendインスタンスをループ]
    D --> E{DCDComponentあり?}
    E -->|Yes| F[DCDComponent.killServer呼び出し]
    E -->|No| G[スキップ]
    F --> H[次のインスタンスへ]
    G --> H
    H --> D
    D --> I[終了]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし。本通知はデータベースを使用しない。

### 更新テーブル一覧

該当なし。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| DCDComponent未初期化 | DCDComponentがインスタンスに登録されていない | スキップして次のインスタンスを処理 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし。

## セキュリティ考慮事項

本通知はローカルプロセス間通信（stdin/stdout）で送受信されるため、外部からの不正アクセスリスクは低い。サーバープロセスの強制終了を行うため、意図しない呼び出しにより自動補完機能が停止する可能性がある。

## 備考

- served/restartServer（リクエスト）はDCDサーバーを再起動するが、served/killServer（通知）は停止のみ行う
- killServerは応答を返さないJSON-RPC通知である（restartServerはリクエストでboolを返す）
- DCDサーバー停止後の再起動はユーザーが別途手動で行うか、ワークスペース再読み込み時に自動的に行われる

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本通知にはパラメータが存在しないため、特別なデータ構造は不要である。DCDComponentインターフェースの理解が重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | dcd.d | `workspace-d/source/workspaced/com/dcd.d` | DCDComponentのkillServer()メソッドの定義を確認 |

**読解のコツ**: workspace-dはserve-dが依存するバックエンドライブラリであり、各種D言語ツールとのインターフェースを提供する。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | complete.d | `source/served/commands/complete.d` | killServer関数の定義（L1388-1394）を確認 |

**主要処理フロー**:
1. **L1388**: `@protocolNotification("served/killServer")` アノテーションにより通知ハンドラとして登録
2. **L1389-1394**: killServer()関数の実装。全backendインスタンスをループし、DCDComponentを持つインスタンスに対してkillServer()を呼び出す

#### Step 3: 通知ディスパッチを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | memberModules（L1391-1412）でcomplete.dがインポートされ、通知ハンドラが登録される仕組みを確認 |

**主要処理フロー**:
- **L1395**: `served.commands.complete` がmemberModulesに含まれることで、killServer関数が自動ディスパッチ対象となる

### プログラム呼び出し階層図

```
[クライアント] served/killServer通知
    |
    +-- RPCProcessor (JSON-RPCメッセージ受信)
          |
          +-- killServer() [complete.d L1389]
                |
                +-- backend.instances (全インスタンスループ)
                      |
                      +-- instance.has!DCDComponent (確認)
                      |
                      +-- instance.get!DCDComponent.killServer() (DCD停止)
```

### データフロー図

```
[入力]                       [処理]                    [出力]

JSON-RPC通知          killServer()             DCDプロセス停止
(パラメータなし) -----> [complete.d] ---------> (副作用のみ)
                      全インスタンスループ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| complete.d | `source/served/commands/complete.d` | ソース | killServer通知ハンドラの定義（L1388-1394） |
| extension.d | `source/served/extension.d` | ソース | モジュール登録・ディスパッチ設定 |
| dcd.d | `workspace-d/source/workspaced/com/dcd.d` | ソース | DCDComponent.killServer()の実装 |
| jsonrpc.d | `lsp/source/served/lsp/jsonrpc.d` | ソース | JSON-RPC通知の受信・ディスパッチ基盤 |
