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!