diff --git a/changelog.d/+to-device-count-race.bugfix.md b/changelog.d/+to-device-count-race.bugfix.md new file mode 100644 index 000000000..57b847f00 --- /dev/null +++ b/changelog.d/+to-device-count-race.bugfix.md @@ -0,0 +1 @@ +Fix to-device messages, including room keys, sometimes being lost before delivery. Contributed by @eleboucher. diff --git a/src/service/users/device.rs b/src/service/users/device.rs index 6933ea715..be666d7ca 100644 --- a/src/service/users/device.rs +++ b/src/service/users/device.rs @@ -216,17 +216,19 @@ impl super::Service { event_type: &str, content: serde_json::Value, ) { - let count = self.services.globals.next_count().unwrap(); - - let key = (target_user_id, target_device_id, count); - self.db.todeviceid_events.put( - key, - Json(json!({ - "type": event_type, - "sender": sender, - "content": content, - })), - ); + let event = Json(json!({ + "type": event_type, + "sender": sender, + "content": content, + })); + self.services + .globals + .next_count_with(|count| { + self.db + .todeviceid_events + .put((target_user_id, target_device_id, count), event); + }) + .unwrap(); self.services.sync.wake(target_user_id).await; }