handleCustomRequest method
Future<JSAny?>
handleCustomRequest(
- ClientConnection connection,
- CustomClientDatabaseRequest request
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, CustomClientDatabaseRequest request) async {
final message = request.request as BaseCustomDatabaseMessage;
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.executeBatch:
final data = message as RunBatchRequest;
await request.useLock(() {
if (data.requireTransaction.toDart && database.autocommit) {
throw SqliteException(
extendedResultCode: 0,
message:
'Transaction rolled back by earlier statement. Cannot execute',
causingStatement: data.rawSql.toDart,
);
}
final stmt = database.prepare(data.rawSql.toDart);
try {
for (final parameter in data.parameters.toDart) {
stmt.execute(parameter.decodedParameters);
}
} finally {
stmt.close();
}
});
case CustomDatabaseMessageKind.updateSubscriptionManagement:
message as CustomDatabaseMessage;
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 BaseCustomDatabaseMessage.okResponse();
}