processV3 method

Future<Optional<int>> processV3(
  1. SessionRecord sessionRecord,
  2. PreKeySignalMessage message
)

Implementation

Future<Optional<int>> processV3(
    SessionRecord sessionRecord, PreKeySignalMessage message) async {
  if (sessionRecord.hasSessionState(
      message.getMessageVersion(), message.getBaseKey().serialize())) {
    $log.log(
        "We've already setup a session for this V3 message, letting bundled message fall through...");
    return const Optional.empty();
  }

  final ourSignedPreKey = _signedPreKeyStore
      .loadSignedPreKey(message.getSignedPreKeyId())
      .then((value) => value.getKeyPair());

  late final Optional<ECKeyPair> ourOneTimePreKey;
  if (message.getPreKeyId().isPresent) {
    ourOneTimePreKey = Optional.of(await _preKeyStore
        .loadPreKey(message.getPreKeyId().value)
        .then((value) => value.getKeyPair()));
  } else {
    ourOneTimePreKey = const Optional<ECKeyPair>.empty();
  }

  if (!sessionRecord.isFresh()) sessionRecord.archiveCurrentState();

  final parameters = BobSignalProtocolParameters(
    theirBaseKey: message.getBaseKey(),
    theirIdentityKey: message.getIdentityKey(),
    ourIdentityKey: await _identityKeyStore.getIdentityKeyPair(),
    ourSignedPreKey: await ourSignedPreKey,
    ourRatchetKey: await ourSignedPreKey,
    ourOneTimePreKey: ourOneTimePreKey,
  );

  RatchetingSession.initializeSessionBob(
      sessionRecord.sessionState, parameters);

  sessionRecord.sessionState.localRegistrationId =
      await _identityKeyStore.getLocalRegistrationId();
  sessionRecord.sessionState.remoteRegistrationId =
      message.getRegistrationId();
  sessionRecord.sessionState.aliceBaseKey = message.getBaseKey().serialize();

  if (message.getPreKeyId().isPresent) {
    return message.getPreKeyId();
  } else {
    return const Optional.empty();
  }
}