{"record":{"id":"135b9de6ad27d270","repo":"benweet/stackedit","slug":"can-t-connect-to-indexeddb","errorCode":null,"errorMessage":"Can't connect to IndexedDB.","messagePattern":"Can't connect to IndexedDB\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/services/localDbSvc.js","lineNumber":27,"sourceCode":"const dbStoreName = 'objects';\nconst { silent } = utils.queryParams;\nconst resetApp = localStorage.getItem('resetStackEdit');\nif (resetApp) {\n  localStorage.removeItem('resetStackEdit');\n}\n\nclass Connection {\n  constructor(workspaceId = store.getters['workspace/currentWorkspace'].id) {\n    this.getTxCbs = [];\n\n    // Make the DB name\n    this.dbName = utils.getDbName(workspaceId);\n\n    // Init connection\n    const request = indexedDB.open(this.dbName, dbVersion);\n\n    request.onerror = () => {\n      throw new Error(\"Can't connect to IndexedDB.\");\n    };\n\n    request.onsuccess = (event) => {\n      this.db = event.target.result;\n      this.db.onversionchange = () => window.location.reload();\n\n      this.getTxCbs.forEach(({ onTx, onError }) => this.createTx(onTx, onError));\n      this.getTxCbs = null;\n    };\n\n    request.onupgradeneeded = (event) => {\n      const eventDb = event.target.result;\n      const oldVersion = event.oldVersion || 0;\n\n      // We don't use 'break' in this switch statement,\n      // the fall-through behavior is what we want.\n      /* eslint-disable no-fallthrough */\n      switch (oldVersion) {","sourceCodeStart":9,"sourceCodeEnd":45,"githubUrl":"https://github.com/benweet/stackedit/blob/6dce2a5e36b755a0c244522b48a06c91a2df0f59/src/services/localDbSvc.js#L9-L45","documentation":"The IndexedDB open request failed inside the localDbSvc constructor for a workspace database (src/services/localDbSvc.js:27). The error handler on `indexedDB.open(this.dbName, dbVersion)` rethrows as this error, meaning the database connection could not be established. Common causes are storage access being blocked by the browser, a corrupt database, or a version-change conflict where another tab holds an older version open and blocks the upgrade.","triggerScenarios":"`indexedDB.open(dbName, dbVersion)` fires its onerror handler: storage quota/blocked cookies settings, a corrupted or deleted database file, blocked version upgrade (an open connection in another context at a lower version without onversionchange handling), or storage disabled entirely.","commonSituations":"Browser set to 'block all cookies'/site data; corrupted profile storage after a browser crash; having the app open in an old tab while a new deploy bumped dbVersion; iOS Safari low-storage eviction.","solutions":["Allow site data/cookies for the app's origin in browser settings.","Close other tabs of the app and reload so a pending version upgrade can complete.","Clear the site's storage for this origin to remove a corrupt database, then reload.","Retry the connection after a transient failure; log request.error for the concrete DOMException."],"exampleFix":"// before\nrequest.onerror = () => {\n  throw new Error(\"Can't connect to IndexedDB.\");\n};\n// after\nrequest.onerror = () => {\n  console.error('IndexedDB open failed:', request.error);\n  throw new Error(`Can't connect to IndexedDB. (${request.error && request.error.name})`);\n};","handlingStrategy":"retry","validationCode":"function canUseIndexedDB() {\n  try {\n    return !!window.indexedDB && typeof indexedDB.open === 'function';\n  } catch (e) {\n    return false; // storage access denied (e.g. blocked cookies)\n  }\n}","typeGuard":"function isOpenError(err) {\n  return err && ['UnknownError', 'SecurityError', 'InvalidStateError', 'VersionError'].includes(err.name);\n}","tryCatchPattern":"try {\n  await connectDb();\n} catch (err) {\n  if (isOpenError(err) && retries < 3) {\n    await delay(500 * (retries + 1));\n    return connectDbWithRetry(retries + 1);\n  }\n  showStorageErrorDialog(err);\n}","preventionTips":["Retry DB open with backoff on transient errors; surface request.error details.","Handle onversionchange by closing the connection so upgrades are not blocked.","Advise users not to block all site data/cookies for the app origin.","Wrap indexedDB.open in a promise and log the DOMException name for diagnosis."],"tags":["indexeddb","storage","browser"],"backgroundTag":"indexeddb-open-failed","analyzedSha":"6dce2a5e36b755a0c244522b48a06c91a2df0f59","analyzedAt":"2026-09-01T00:49:23.866Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}