1- import CachingAdapter from './Caching'
2- import XbelSerializer from '../serializers/Xbel'
3- import Logger from '../Logger'
4- import { Capacitor } from '@capacitor/core'
51import * as git from 'isomorphic-git'
62import http from 'isomorphic-git/http/web'
73// eslint-disable-next-line @typescript-eslint/ban-ts-comment
84// @ts -ignore
95import 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'
1010import Html from '../serializers/Html'
1111import {
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