How to replicate IndexedDB "Database deleted by request of the user" error in ios14?
Asked Answered
A

0

10

I'm using the excellent https://www.npmjs.com/package/idb package to manage a simple indexedDB implementation on a web app.

I'm having this error "UnknownError: Database deleted by request of the user" reported to our error reporting system for a significant number of iOS users and I'm having trouble replicating.

It seems to have so far only affect users on:

  • Mobile Safari 14.6, 14.4.2, caught by try/catch
  • Instagram webview, iOS 14.7.1 - not caught be try/catch

I think the source of the error is this line in webkit https://github.com/WebKit/WebKit/blob/e98ff129bc8eba06ac17105f19c5f0e142aab853/Source/WebCore/Modules/indexeddb/shared/IDBError.h#L40

It seems to relate to the server connection closing.

A simplified version of the implementation:

// ./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
  }
}

Some of the things I have tried to replicate (on Instagram webveiw, iOS 14.7.1 or Mobile Safari 14.6):

  • saving a massive object to idb and closing or backgrounding Instagram or Safari mid transaction
  • saving a massive object to idb across multiple Safari tabs at the same time
  • manually deleting idb db from Safari while transaction is in progress - seems to generate either "UnknownError: Connection is closing." or "AbortError: The transaction was aborted, so the request cannot be fulfilled." - both caught by try/catch
  • Safari incognito
  • Setting Safari privacy to store no cookies (or any other form of browser storage)
  • this transaction lifetime bug https://github.com/jakearchibald/idb#transaction-lifetime
  • ... Google - nothing for this error other than the webkit source code.

Any suggestions appreciated into how this issue could be replicated so I can work out how to handle it!

Allodium answered 2/10, 2021 at 14:26 Comment(2)
Did you find out a way to get rid of that error?Roturier
Consider exploring whether Apple ITP is restricting access to local storage.Annitaanniversary

© 2022 - 2024 — McMap. All rights reserved.