如何在ios14中复制IndexedDB“根据用户请求删除数据库”错误?

Ed *_*ick 9 javascript webkit mobile-safari indexeddb

我正在使用优秀的 ht ​​tps ://www.npmjs.com/package/idb包来管理 Web 应用程序上的简单 indexedDB 实现。

对于大量 iOS 用户,我向我们的错误报告系统报告了此错误“UnknownError:数据库已根据用户的请求删除”,但我在复制时遇到了问题。

到目前为止,它似乎只影响用户:

  • Mobile Safari 14.6、14.4.2,通过 try/catch 捕获
  • Instagram webview,iOS 14.7.1 - 没有被 try/catch 捕获

我认为错误的根源是webkit中的这一行https://github.com/WebKit/WebKit/blob/e98ff129bc8eba06ac17105f19c5f0e142aab853/Source/WebCore/Modules/indexeddb/shared/IDBError.h#L40

这似乎与服务器连接关闭有关。

实现的简化版本:

// ./store.js
import { openDB } from 'idb'

export const upgrade = (db) => {
  if (!db?.createObjectStore) return null
  db.createObjectStore('example_store_name_1')
}

export const set = async (storeName, val, key) => {
  const dbPromise = openDB('example_db_name', 1, { upgrade })
  if (!window.indexedDB) return null
  return (await dbPromise).put(storeName, val, key)
}

export const count = async (storeName) => {
  const dbPromise = openDB('example_db_name', 1, { upgrade })
  if (!window.indexedDB) return null
  return (await dbPromise).count(storeName)
}



// ./index.js
import { set, count } from './store.js'

export const storeEvent = async (storeName, value, key) => {
  try {
    const rowCount = await count(storeName)
    // I process and clear the db in a separate part of the app, this count is just here here as a rough limit to 
    // ensure that I don't keep pushing data into storage if, for some reason, it is not getting cleared elsewhere
    if (rowCount < 500) {
      await set(storeName, value, key)
    }
  } catch (error) {
    // error reported to error monitoring tool
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试复制的一些内容(在 Instagram webveiw、iOS 14.7.1 或 Mobile Safari 14.6 上):

  • 将大量对象保存到 idb 并关闭或后台 Instagram 或 Safari 中间事务
  • 同时跨多个 Safari 选项卡将大量对象保存到 idb
  • 在事务处理过程中从 Safari 手动删除 idb db - 似乎会生成“未知错误:连接正在关闭”。或“AbortError:事务已中止,因此无法满足请求。” - 都被 try/catch 捕获
  • Safari 隐身模式
  • 设置 Safari 隐私以不存储 cookie(或任何其他形式的浏览器存储)
  • 此交易生命周期错误https://github.com/jakearchibald/idb#transaction-lifetime
  • ... Google - 除了 webkit 源代码之外,没有任何解决此错误的方法。

对于如何复制此问题的任何建议表示赞赏,以便我可以找出如何处理它!