diff --git a/keystore/src/entities/mod.rs b/keystore/src/entities/mod.rs index c9ff391aa..a5e4e4e9b 100644 --- a/keystore/src/entities/mod.rs +++ b/keystore/src/entities/mod.rs @@ -280,6 +280,12 @@ cfg_if::cfg_if! { pub trait Entity: EntityBase { fn id_raw(&self) -> &[u8]; + + /// The query results that are obtained during a transaction + /// from the transaction cache and the database are merged by this key. + fn merge_key(&self) -> Vec { + self.id_raw().into() + } } pub trait EntityIdStringExt: Entity { diff --git a/keystore/src/entities/platform/generic/mls/credential.rs b/keystore/src/entities/platform/generic/mls/credential.rs index d6b7bf398..d30b3affc 100644 --- a/keystore/src/entities/platform/generic/mls/credential.rs +++ b/keystore/src/entities/platform/generic/mls/credential.rs @@ -33,6 +33,12 @@ impl Entity for MlsCredential { fn id_raw(&self) -> &[u8] { self.id.as_slice() } + + fn merge_key(&self) -> Vec { + let mut merge_key = self.id_raw().to_vec(); + merge_key.extend(self.created_at.to_be_bytes().to_vec()); + merge_key + } } #[cfg_attr(target_family = "wasm", async_trait::async_trait(?Send))] diff --git a/keystore/src/transaction.rs b/keystore/src/transaction.rs index c4769e91d..6f6b8c6b1 100644 --- a/keystore/src/transaction.rs +++ b/keystore/src/transaction.rs @@ -330,7 +330,7 @@ impl KeystoreTransaction { let merged = records_a .into_iter() .chain(records_b) - .unique_by(|e| e.id_raw().to_vec()); + .unique_by(|e| e.merge_key()); // The alternative to giving up laziness here would be to use a dynamically // typed iterator Box> assigned to `merged`. The below approach