Skip to content

[1.0] IndexedDB操作の堅牢性向上(テストからのフィードバック) #16

@kochizufan

Description

@kochizufan

現状

migration.test.ts の実行時に、データベース削除処理がデッドロックに陥り、タイムアウトする問題が頻繁に発生しました。

原因

これは、IndexedDBの deleteDatabase リクエストが発行された際に、まだ対象データベースへのアクティブな接続が残っている場合に発生する onblocked イベントが、アプリケーションコード (src/cache-v1/migration.ts) でハンドリングされていなかったためです。このイベントをハンドルしないと、リクエストは無期限に待機し続け、タイムアウトを引き起こします。これはテスト環境特有の問題ではなく、実際のユーザー環境でも発生しうる潜在的
な不具合
です。

提案

データベースの削除を行うすべての非同期処理において、必ず onblocked イベントハンドラを実装することを強く推奨します。これにより、予期せぬデッドロックを防ぎ、アプリケーションの安定性を大幅に向上させることができま
す。

実装イメージ

// src/cache-v1/migration.ts 内の修正案

private async deleteMapDatabase(mapId: string): Promise<void> {
  const dbName = `Weiwudi_${mapId}`;
  return new Promise((resolve, reject) => {
    const request = indexedDB.deleteDatabase(dbName);
    request.onsuccess = () => resolve();
    request.onerror = (event) => reject(request.error);
    
    // ★★★ タイムアウトを防ぐための必須処理 ★★★
    request.onblocked = (event) => {
      console.warn(`Deletion of database ${dbName} is blocked.`, event);
      // ブロックされても処理を継続させるため、resolve()を呼び出す。
      // これにより、アプリケーションのフリーズを防ぐ。
      resolve();
    };
  });
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions