# 通知設計書 14-ModuleStoreError

## 概要

本ドキュメントは、Webpackにおけるキャッシュへのモジュール保存エラー通知（ModuleStoreError）の設計を定義する。ModuleStoreErrorは、ビルド済みモジュールをキャッシュに保存（シリアライズ）する際にエラーが発生した場合に発行されるエラー通知である。

### 本通知の処理概要

ModuleStoreErrorは、Webpackのキャッシュシステムにおいてビルド完了後のモジュールデータの保存に失敗した場合に開発者に通知する仕組みである。ModuleRestoreErrorと対をなすエラーで、永続キャッシュへの書き込み側の問題を検出する。

**業務上の目的・背景**：永続キャッシュ機能では、ビルド済みモジュールをキャッシュに保存することで次回ビルドの高速化を実現する。保存処理が失敗するとキャッシュが更新されず、次回ビルド時にモジュールの再ビルドが必要になる。ModuleStoreErrorは、保存失敗を開発者に通知し、ディスク容量やファイルシステム権限の問題、シリアライズ不能なデータの存在などの根本原因の調査を促す。

**通知の送信タイミング**：Compilation.jsの_modulesCache.store呼び出し時にコールバックがエラーを返した場合。具体的にはCompilation.js 1604-1609行目付近でキャッシュ保存のコールバックエラーが発生した時点で生成される。

**通知の受信者**：Webpackのビルドを実行した開発者。コンソール出力またはWebpack Stats APIを通じてエラー情報が伝達される。

**通知内容の概要**：「Module storing failed:」に続いて元のエラーのスタックトレースまたはメッセージが含まれる。エラーオブジェクトの型に応じた適切なメッセージ変換が行われる。

**期待されるアクション**：開発者は、ディスク容量の確認、ファイルシステム権限の確認、キャッシュディレクトリのクリア、またはシリアライズ不能なカスタムデータの修正を行うことが期待される。

## 通知種別

コンソールエラー出力 / Webpack Stats APIエラーレポート / ビルドエラー（callbackを通じた伝搬）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（キャッシュ保存コールバック内で生成） |
| 優先度 | 高（ビルドプロセスに影響するエラー） |
| リトライ | 無（コールバック経由で即座にエラー返却） |

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

Compilation.jsの_modulesCache.store呼び出しのコールバックでerrが返された場合、new ModuleStoreError(module, err)でインスタンスが生成される。hooks.failedModuleが呼ばれた後、callback経由で呼び出し元に返却される。

## 通知テンプレート

### メール通知の場合

本通知はメール送信ではなく、Webpackビルドコンソール出力として表示される。

| 項目 | 内容 |
|-----|------|
| 送信元アドレス | N/A（コンソール出力） |
| 送信元名称 | webpack |
| 件名 | N/A |
| 形式 | テキスト |

### 本文テンプレート

```
Module storing failed: {元のエラースタックトレースまたはメッセージ}
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| N/A | - | - | 添付ファイルなし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| err | 元のエラー（Error or string） | _modulesCache.storeコールバック | Yes |
| err.stack | エラーのスタックトレース | Errorオブジェクト | No |
| err.message | エラーメッセージ | Errorオブジェクト | No |
| module | 保存対象モジュール | Compilation処理対象 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| キャッシュ処理 | _modulesCache.store()コールバック | コールバックのerrパラメータがtruthyの場合 | Compilation.js 1604-1609行目付近 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| キャッシュ保存が正常に完了した場合 | エラーは発行されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[Compilation - モジュールビルド完了] --> B[_modulesCache.store呼び出し]
    B --> C{キャッシュ保存結果}
    C -->|エラーあり| D[hooks.failedModule呼び出し]
    C -->|正常| E[hooks.succeedModule呼び出し]
    D --> F[ModuleStoreError生成]
    F --> G[callback経由でエラー返却]
    E --> H[callback正常返却]
    G --> I[終了]
    H --> I
```

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

### 参照テーブル一覧

本通知はデータベースを使用しない。Webpackのキャッシュシステム（メモリまたはファイルシステム）を参照する。

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| _modulesCache | モジュールキャッシュの保存 | CacheFacadeインスタンス |

### テーブル別参照項目詳細

#### ModuleStoreErrorインスタンス

| 参照項目（プロパティ名） | 用途 | 取得条件 |
|-------------------|------|---------|
| name | エラー名表示 | 固定値 "ModuleStoreError" |
| message | エラーメッセージ表示 | コンストラクタで生成 |
| details | 詳細情報 | undefined（コード上は未使用） |
| module | エラー発生モジュール | コンストラクタ引数 |
| error | 元のエラーオブジェクト | コンストラクタ引数 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| N/A | - | callback経由で返却 |

#### 送信ログテーブル

| 操作 | 項目（プロパティ名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| CALLBACK | err | ModuleStoreErrorインスタンス | callback(new ModuleStoreError(module, err)) |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| シリアライズ失敗 | モジュールデータのシリアライズ不可 | シリアライズ不能なカスタムデータの修正 |
| ディスク書き込み失敗 | ディスク容量不足、権限不足 | ディスク容量確認、権限設定 |
| キャッシュ破損 | キャッシュファイルの破損 | キャッシュディレクトリのクリア |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

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

### 配信時間帯

制限なし。Webpackビルド実行時に即座に通知される。

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

- スタックトレースにファイルパスが含まれる可能性がある
- キャッシュファイルのパス情報が表示される可能性がある

## 備考

- ModuleRestoreError（No.13）とほぼ同一の構造を持つ対称的なエラークラス
- メッセージプレフィックスが"Module storing failed: "である点がRestoreとの差異
- hooks.failedModuleが呼ばれた後にcallbackでエラーが返却される点が特徴的
- makeSerializableによる登録がないため、このエラー自体はシリアライズ対象外

---

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

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

### 推奨読解順序

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

ModuleStoreErrorクラスのメッセージ生成ロジックを理解する。ModuleRestoreErrorとほぼ同一の構造。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WebpackError.js | `lib/WebpackError.js` | 基底クラスのプロパティ定義（17-38行目） |
| 1-2 | ModuleStoreError.js | `lib/ModuleStoreError.js` | メッセージ生成の条件分岐（21-32行目）。ModuleRestoreErrorと同一パターン |

**読解のコツ**: ModuleRestoreError（No.13）と比較しながら読むと、メッセージプレフィックス("Module storing failed: " vs "Module restore failed: ")以外が同一であることが分かる。

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

ModuleStoreErrorが生成されるCompilation.jsのキャッシュ保存処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Compilation.js | `lib/Compilation.js` | _modulesCache.storeコールバック内のエラー処理（1604-1613行目付近） |

**主要処理フロー**:
1. **1604行目**: if (err)でエラー判定
2. **1605-1608行目**: hooks.failedModuleフック呼び出し
3. **1609行目**: callback(new ModuleStoreError(module, err))でエラー返却
4. **1611行目**: 正常時はhooks.succeedModule呼び出し

#### Step 3: hooks.failedModuleとの連携を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Compilation.js | `lib/Compilation.js` | hooks.failedModuleフックの定義と用途 |

**主要処理フロー**:
- **1605行目**: this.hooks.failedModule.call(module, err) - モジュール失敗を通知するフック
- **1609行目**: ModuleStoreError生成後にcallbackで返却

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

```
Compilation._handleModuleBuildAndDependencies()
    |
    +-- _modulesCache.store(identifier, null, module, callback)
            |
            +-- [コールバック]
                    |
                    +-- [エラー時]
                    |       |
                    |       +-- hooks.failedModule.call(module, err)
                    |       |
                    |       +-- new ModuleStoreError(module, err)
                    |       |       |
                    |       |       +-- WebpackError.constructor(message)
                    |       |
                    |       +-- callback(error) でエラー伝搬
                    |
                    +-- [正常時]
                            |
                            +-- hooks.succeedModule.call(module)
                            |
                            +-- callback()
```

### データフロー図

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

Module                 --> ModuleStoreError               --> エラーメッセージ文字列
err (string|Error)      |  コンストラクタ                  --> callback経由で返却
                        |  - "Module storing failed: "
                        |  + err.stack || err.message
                        |    || err || String(err)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラークラス |
| ModuleStoreError.js | `lib/ModuleStoreError.js` | ソース | 保存エラークラス定義 |
| ModuleRestoreError.js | `lib/ModuleRestoreError.js` | ソース | 対となる復元エラークラス（比較参照用） |
| Compilation.js | `lib/Compilation.js` | ソース | エラー発行元（_modulesCache.store） |
