famedly / matrix-dart-sdk

Matrix SDK written in pure Dart.
GNU Affero General Public License v3.0
62 stars 31 forks source link

Database error #1533

Closed abigotado closed 9 months ago

abigotado commented 1 year ago

When performing client.logout(), I always get a database error:

[Matrix] Unable to clear database - InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
dart-sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart 346:3          [_transaction]
dart-sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart 320:12         transaction]
packages/hive/src/box_collection/box_collection_indexed_db.dart 83:21  transaction
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50     <fn>
dart-sdk/lib/async/zone.dart 1661:54                                   runUnary
dart-sdk/lib/async/future_impl.dart 147:18                             handleValue
dart-sdk/lib/async/future_impl.dart 784:44                             handleValueCallback
dart-sdk/lib/async/future_impl.dart 813:13                             _propagateToListeners
dart-sdk/lib/async/future_impl.dart 584:5                              [_completeWithValue]
dart-sdk/lib/async/future_impl.dart 657:7                              callback
dart-sdk/lib/async/schedule_microtask.dart 40:11                       _microtaskLoop
dart-sdk/lib/async/schedule_microtask.dart 49:5                        _startMicrotaskLoop
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 177:15    <fn>

[Matrix] Current sync request ID has changed. Dropping this sync loop!

Client:

final Client client = Client(
      'Name',
      // ignore: prefer_final_parameters
      databaseBuilder: (_) async {
        const String path = './messenger_db';
        final HiveCollectionsDatabase db =
            HiveCollectionsDatabase('matrix_box_collection', path);
        await db.open();
        unawaited(
          Future<void>.delayed(const Duration(minutes: 10), () async {
            await db.open();
          }),
        );
        return db;
      },
      logLevel: kDebugMode ? Level.verbose : Level.error,
    );

https://github.com/isar/hive/issues/850

abigotado commented 1 year ago

Is package maintained?

krille-chan commented 9 months ago

Haven't seen this in a while. Is this fixed now?

abigotado commented 9 months ago

@krille-chan Hi! Thanks for your answer! No, unfortunately it is still not fixed. And it occurs only on the web

krille-chan commented 9 months ago

Can you test again with MatrixSdkDatabase?

abigotado commented 9 months ago

@krille-chan Sorry for long answering. I've tried to use MatrixSdkDatabase, but I need some help with setting it up, I can't make it work. So I think, I'm doing something wrong. Could you help me please?

I'm always getting this error:

[Matrix] Initialize client SquadderChat
!!!CRITICAL!!! [Matrix] Client initialization failed - LateInitializationError: Field '_clientBox' has not been initialized.
../dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 294:3  throw_
../packages/matrix/src/database/matrix_sdk_database.dart 43:20                  get [_clientBox]
../packages/matrix/src/database/matrix_sdk_database.dart 374:39                 <fn>
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54           runBody
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5           _async
../packages/matrix/src/database/matrix_sdk_database.dart 372:47                 <fn>
../packages/matrix/src/utils/run_benchmarked.dart 33:28                         runBenchmarked
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54           runBody
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5           _async
../packages/matrix/src/utils/run_benchmarked.dart 24:28                         runBenchmarked
../packages/matrix/src/database/matrix_sdk_database.dart 372:7                  getClient
../packages/matrix/src/client.dart 1501:44                                      init
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50           <fn>
../dart-sdk/lib/async/zone.dart 1661:54                                         runUnary
../dart-sdk/lib/async/future_impl.dart 162:18                                   handleValue
../dart-sdk/lib/async/future_impl.dart 846:44                                   handleValueCallback
../dart-sdk/lib/async/future_impl.dart 875:13                                   _propagateToListeners
../dart-sdk/lib/async/future_impl.dart 647:5                                    [_completeWithValue]
../dart-sdk/lib/async/future_impl.dart 721:7                                    <fn>
../dart-sdk/lib/async/zone.dart 1399:13                                         _rootRun
../dart-sdk/lib/async/zone.dart 1301:19                                         run
../dart-sdk/lib/async/zone.dart 1233:23                                         callback
../dart-sdk/lib/async/schedule_microtask.dart 40:11                             _microtaskLoop
../dart-sdk/lib/async/schedule_microtask.dart 49:5                              _startMicrotaskLoop
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 181:7           <fn>

[Matrix] Unable to clear database - LateInitializationError: Field '_collection' has not been initialized.
../dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 294:3  throw_
../packages/matrix/src/database/matrix_sdk_database.dart 42:22                  get [_collection]
../packages/matrix/src/database/matrix_sdk_database.dart 269:39                 clear
../packages/matrix/src/client.dart 1642:23                                      clear
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50           <fn>
../dart-sdk/lib/async/zone.dart 1661:54                                         runUnary
../dart-sdk/lib/async/future_impl.dart 162:18                                   handleValue
../dart-sdk/lib/async/future_impl.dart 846:44                                   handleValueCallback
../dart-sdk/lib/async/future_impl.dart 875:13                                   _propagateToListeners
../dart-sdk/lib/async/future_impl.dart 464:9                                    callback
../dart-sdk/lib/async/schedule_microtask.dart 40:11                             _microtaskLoop
../dart-sdk/lib/async/schedule_microtask.dart 49:5                              _startMicrotaskLoop
../dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 181:7           <fn>

Here is my my matrix client and db:

@module
abstract class ApiModule {
  @preResolve
  Future<Database> createDatabase() async {
    final DatabaseFactory factory = databaseFactoryFfiWeb;
    final Database db = await factory.openDatabase('matrix_db.db');
    return db;
  }

 @preResolve
  Future<Client> createMatrixClient(final Database database) async {
    final Client client = Client(
      'SquadderChat',
      // ignore: prefer_final_parameters
      databaseBuilder: kIsWeb
          ? (final Client client) async => MatrixSdkDatabase(
                'Matrix Database',
                database: database,
              )
          : FlutterHiveCollectionsDatabase.databaseBuilder,
      logLevel: kDebugMode ? Level.verbose : Level.error,
      nativeImplementations: kIsWeb
          ? NativeImplementationsWebWorker(Uri.parse('/'))
          : NativeImplementationsIsolate(compute),
    );
    return client;
  }
}
krille-chan commented 9 months ago

Ah, maybe that's a missunderstanding. Matrix SDK Database uses indexeddb on web and sqflite on io at the moment. I think I found, what is missing. You need to call database.open() inside your databaseBuilder. A minimal working example for web would be:

Future<DatabaseApi> webDatabaseBuilder(Client client) async {
  final database = MatrixSdkDatabase(client.clientName);
  await database.open();
  return database;
}
abigotado commented 9 months ago

@krille-chan Thank you very much! It works now!

taherfattahi commented 8 months ago

I got this error when I was trying to release a version of Fluffychat into my server, If i log out from my current account and log in with another account then I see the previous rooms of my past account, This is my solution, add these lines of source code before logout function:

  void deleteDatabase(String dbName) {
    html.window.indexedDB!.deleteDatabase(dbName);
  }
  -----------------------------------------------------
    try {
      matrix.client.database!.close();
      matrix.client.database!.delete();
    } catch (e) {
      print(e);
    }
    deleteDatabase(matrix.client.clientName);