decryptRoomEvent method

Future<Event> decryptRoomEvent(
  1. Event event, {
  2. bool store = false,
  3. EventUpdateType updateType = EventUpdateType.timeline,
  4. bool waitForKeyBackupAndRetry = false,
})

Decrypts event if it is encrypted.

If the session is unknown, this by default fires off a key request in the background and returns the undecryptable event right away. Pass waitForKeyBackupAndRetry as true to instead await the online key backup lookup and retry decryption once before returning.

Implementation

Future<Event> decryptRoomEvent(
  Event event, {
  bool store = false,
  EventUpdateType updateType = EventUpdateType.timeline,
  bool waitForKeyBackupAndRetry = false,
}) async {
  try {
    if (client.encryption == null ||
        event.type != EventTypes.Encrypted ||
        event.redacted) {
      return event;
    }
    final content = event.parsedRoomEncryptedContent;
    final sessionId = content.sessionId;
    if (sessionId != null &&
        !(keyManager
                .getInboundGroupSession(event.room.id, sessionId)
                ?.isValid ??
            false)) {
      await keyManager.loadInboundGroupSession(event.room.id, sessionId);
    }
    final encryptedEvent = event;
    event = decryptRoomEventSync(encryptedEvent);
    if (event.canRequestSessionKey) {
      await keyManager.maybeAutoRequest(
        event.room,
        sessionId!,
        content.senderKey,
        awaitRequest: waitForKeyBackupAndRetry,
      );
      if (waitForKeyBackupAndRetry) {
        event = decryptRoomEventSync(encryptedEvent);
      }
    }
    if (event.type != EventTypes.Encrypted && store) {
      await client.database.storeEventUpdate(
        event.room.id,
        event,
        updateType,
        client,
      );
    }
    return event;
  } catch (e, s) {
    Logs().e('[Decrypt] Could not decrpyt event', e, s);
    return event;
  }
}