Skip to content

Commit b509be2

Browse files
authored
Merge pull request #2182 from floccusaddon/fix/clear-indexeddb-after-sync
Fix/clear indexeddb after sync
2 parents 0527e52 + 59e5bd7 commit b509be2

1 file changed

Lines changed: 50 additions & 6 deletions

File tree

src/lib/adapters/Git.ts

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import CachingAdapter from './Caching'
2-
import XbelSerializer from '../serializers/Xbel'
3-
import Logger from '../Logger'
4-
import { Capacitor } from '@capacitor/core'
51
import * as git from 'isomorphic-git'
62
import http from 'isomorphic-git/http/web'
73
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
84
// @ts-ignore
95
import FS from '@isomorphic-git/lightning-fs'
6+
import * as Parallel from 'async-parallel'
7+
import CachingAdapter from './Caching'
8+
import XbelSerializer from '../serializers/Xbel'
9+
import Logger from '../Logger'
1010
import Html from '../serializers/Html'
1111
import {
1212
FileUnreadableError, GitPushError,
@@ -191,7 +191,7 @@ export default class GitAdapter extends CachingAdapter {
191191
Logger.log('onSyncFail')
192192
clearInterval(this.lockingInterval)
193193
await this.freeLock()
194-
indexedDB.deleteDatabase(this.hash)
194+
await this.cleanupIndexedDB()
195195
}
196196

197197
async onSyncComplete() {
@@ -230,6 +230,7 @@ export default class GitAdapter extends CachingAdapter {
230230
} catch (e) {
231231
if (e.code && e.code === git.Errors.PushRejectedError.code) {
232232
await this.freeLock() // Only clears the locks set in the current adapter instance
233+
await this.cleanupIndexedDB()
233234
throw new ResourceLockedError
234235
}
235236
throw e
@@ -239,7 +240,50 @@ export default class GitAdapter extends CachingAdapter {
239240
}
240241

241242
await this.freeLock()
242-
indexedDB.deleteDatabase(this.hash)
243+
await this.cleanupIndexedDB()
244+
}
245+
246+
async cleanupIndexedDB() {
247+
try {
248+
// Give the FS instance time to close connections
249+
await new Promise(resolve => setTimeout(resolve, 100))
250+
251+
// Get all IndexedDB databases
252+
Logger.log('Cleaning up all Lightning FS IndexedDB databases')
253+
const databases = await indexedDB.databases()
254+
255+
// Delete all databases (Lightning FS uses hash-based names)
256+
await Parallel.map(databases, async(dbInfo) => {
257+
try {
258+
Logger.log('Deleting IndexedDB: ' + dbInfo.name)
259+
const deleteRequest = indexedDB.deleteDatabase(dbInfo.name)
260+
261+
await new Promise<void>((resolve) => {
262+
deleteRequest.onsuccess = () => {
263+
Logger.log('IndexedDB cleanup successful: ' + dbInfo.name)
264+
resolve()
265+
}
266+
deleteRequest.onerror = () => {
267+
Logger.log('IndexedDB cleanup error for ' + dbInfo.name + ': ' + deleteRequest.error)
268+
resolve() // Don't reject, just log and continue
269+
}
270+
deleteRequest.onblocked = () => {
271+
Logger.log('IndexedDB cleanup blocked: ' + dbInfo.name)
272+
// Still resolve after a timeout even if blocked
273+
setTimeout(() => resolve(), 1000)
274+
}
275+
})
276+
} catch (e) {
277+
Logger.log('Error deleting IndexedDB ' + dbInfo.name + ': ' + e)
278+
}
279+
}, 4)
280+
Logger.log('IndexedDB cleanup completed')
281+
} catch (e) {
282+
Logger.log('Error during IndexedDB cleanup: ' + e)
283+
}
284+
285+
// Clear the reference
286+
this.fs = null
243287
}
244288

245289
async obtainLock() {

0 commit comments

Comments
 (0)