handleToDeviceEvent method
Implementation
Future<void> handleToDeviceEvent(ToDeviceEvent event) async {
if (event.type == EventTypes.Dummy) {
// We received an encrypted m.dummy. This means that the other end was not able to
// decrypt our last message. So, we re-send it.
final encryptedContent = event.encryptedContent;
if (encryptedContent == null || encryption.olmDatabase == null) {
return;
}
final device = client.getUserDeviceKeysByCurve25519Key(
encryptedContent.tryGet<String>('sender_key') ?? '',
);
if (device == null) {
return; // device not found
}
Logs().v(
'[OlmManager] Device ${device.userId}:${device.deviceId} generated a new olm session, replaying last sent message...',
);
final lastSentMessageRes = await encryption.olmDatabase
?.getLastSentMessageUserDeviceKey(device.userId, device.deviceId!);
if (lastSentMessageRes == null ||
lastSentMessageRes.isEmpty ||
lastSentMessageRes.first.isEmpty) {
return;
}
final lastSentMessage = json.decode(lastSentMessageRes.first);
// We do *not* want to re-play m.dummy events, as they hold no value except of saying
// what olm session is the most recent one. In fact, if we *do* replay them, then
// we can easily land in an infinite ping-pong trap!
if (lastSentMessage['type'] != EventTypes.Dummy) {
// okay, time to send the message!
await client.sendToDeviceEncrypted(
[device],
lastSentMessage['type'],
lastSentMessage['content'],
);
}
}
}