maybeAutoRequest method

FutureOr<void> maybeAutoRequest(
  1. Room room,
  2. String sessionId,
  3. String? senderKey, {
  4. bool tryOnlineBackup = true,
  5. bool onlineKeyBackupOnly = true,
  6. bool awaitRequest = false,
})

Attempt auto-request for a key

Implementation

FutureOr<void> maybeAutoRequest(
  Room room,
  String sessionId,
  String? senderKey, {
  bool tryOnlineBackup = true,
  bool onlineKeyBackupOnly = true,
  bool awaitRequest = false,
}) async {
  if (!onlineKeyBackupOnly && client.isUnknownSession) return;

  final requestIdent = '${room.id}|$sessionId';
  final existingReqCompleter = _requestedSessionIdCompleters[requestIdent];
  if (existingReqCompleter != null) {
    if (awaitRequest) {
      await existingReqCompleter.future;
    }
    // return if already exists (after awaiting completion if required)
    return;
  }

  Future<void> requestFn() async {
    final completer = Completer<void>();
    _requestedSessionIdCompleters[requestIdent] = completer;
    try {
      await request(
        room,
        sessionId,
        senderKey,
        tryOnlineBackup: tryOnlineBackup,
        onlineKeyBackupOnly: onlineKeyBackupOnly,
      );
    } catch (_) {
      // A failed attempt must not block a later retry for this session.
      _requestedSessionIdCompleters.remove(requestIdent);
      rethrow;
    } finally {
      completer.complete();
    }
  }

  if (awaitRequest) {
    await requestFn();
  } else {
    runInRoot(requestFn);
  }
}