handleCustomRequest method

  1. @override
Future<JSAny?> handleCustomRequest(
  1. ClientConnection connection,
  2. JSAny? request
)
override

Handles a custom request (encoded as any JS value) from the connection.

The response is sent over the channel and completes a Database.customRequest call for clients.

Implementation

@override
Future<JSAny?> handleCustomRequest(
    ClientConnection connection, JSAny? request) async {
  final message = request as CustomDatabaseMessage;

  switch (message.kind) {
    case CustomDatabaseMessageKind.ok:
    case CustomDatabaseMessageKind.notifyUpdates:
      throw UnsupportedError('This is a response, not a request');
    case CustomDatabaseMessageKind.getAutoCommit:
      return database.autocommit.toJS;
    case CustomDatabaseMessageKind.executeBatchInTransaction:
      final sql = message.rawSql.toDart;
      final parameters = proto.deserializeParameters(
          message.rawParameters, message.typeInfo);
      if (database.autocommit) {
        throw SqliteException(0,
            "Transaction rolled back by earlier statement. Cannot execute: $sql");
      }
      database.execute(sql, parameters);
    case CustomDatabaseMessageKind.updateSubscriptionManagement:
      final shouldSubscribe =
          (message.rawParameters.toDart[0] as JSBoolean).toDart;
      final id = message.rawSql.toDart;
      final state = _findState(connection);

      if (shouldSubscribe) {
        state.unsubscribeUpdates();
        _registerCloseListener(state, connection);

        late StreamSubscription<void> subscription;
        subscription = state.updatesNotification = _updates.listen((tables) {
          subscription.pause(connection.customRequest(CustomDatabaseMessage(
            CustomDatabaseMessageKind.notifyUpdates,
            id,
            tables.toList(),
          )));
        });
      } else {
        state.unsubscribeUpdates();
      }
  }

  return CustomDatabaseMessage(CustomDatabaseMessageKind.ok);
}