(function (root, factory) {
  if (typeof module === 'object' && module.exports) module.exports = factory;
  else root.inspectStackchainPrivateDatabases = factory(root.indexedDB);
})(typeof globalThis !== 'undefined' ? globalThis : this, function createPrivateDataInspector(indexedDB) {
  function requestResult(request) {
    return new Promise((resolve, reject) => {
      request.onsuccess = () => resolve(request.result);
      request.onerror = () => reject(request.error || new Error('Private storage inventory failed.'));
      request.onblocked = () => reject(new Error('Private storage inventory was blocked.'));
    });
  }

  async function countDatabase(name) {
    const database = await requestResult(indexedDB.open(name));
    try {
      const storeNames = Array.from(database.objectStoreNames);
      if (!storeNames.length) return 0;
      const transaction = database.transaction(storeNames, 'readonly');
      const counts = await Promise.all(storeNames.map(storeName =>
        requestResult(transaction.objectStore(storeName).count())
      ));
      return counts.reduce((total, count) => total + Number(count || 0), 0);
    } finally {
      database.close();
    }
  }

  return async function inspectPrivateDatabases(registeredNames) {
    if (!indexedDB?.databases) return { recordCount: 0, unavailable: true };
    try {
      const existing = new Set((await indexedDB.databases()).map(database => database.name));
      const counts = await Promise.all(
        registeredNames.filter(name => existing.has(name)).map(countDatabase)
      );
      return {
        recordCount: counts.reduce((total, count) => total + count, 0),
        unavailable: false,
      };
    } catch (_error) {
      return { recordCount: 0, unavailable: true };
    }
  };
});
