core_crypto_ffi/core_crypto/e2ei/
identities.rs1use std::collections::HashMap;
2
3use core_crypto::{RecursiveError, mls::conversation::Conversation as _};
4#[cfg(target_family = "wasm")]
5use wasm_bindgen::prelude::*;
6
7use crate::{ClientId, ConversationId, CoreCrypto, CoreCryptoResult, WireIdentity, conversation_id_vec};
8
9#[cfg(not(target_family = "wasm"))]
10type DeviceIdentities = Vec<WireIdentity>;
11
12#[cfg(target_family = "wasm")]
13type DeviceIdentities = JsValue;
14
15#[cfg(not(target_family = "wasm"))]
16pub(crate) type UserIdentities = HashMap<String, Vec<WireIdentity>>;
17
18#[cfg(target_family = "wasm")]
19pub(crate) type UserIdentities = JsValue;
20
21#[cfg_attr(not(target_family = "wasm"), uniffi::export)]
22#[cfg_attr(target_family = "wasm", wasm_bindgen)]
23impl CoreCrypto {
24 #[cfg_attr(target_family = "wasm", wasm_bindgen(unchecked_return_type = "WireIdentity[]"))]
26 pub async fn get_device_identities(
27 &self,
28 conversation_id: &ConversationId,
29 device_ids: Vec<ClientId>,
30 ) -> CoreCryptoResult<DeviceIdentities> {
31 let conversation_id = conversation_id_vec!(conversation_id);
32 let conversation = self
33 .inner
34 .get_raw_conversation(&conversation_id)
35 .await
36 .map_err(RecursiveError::mls_client("getting raw conversation"))?;
37 let device_ids = device_ids.into_iter().map(|ClientId(id)| id).collect::<Vec<_>>();
38 let device_identities = conversation.get_device_identities(&device_ids).await?;
39 let device_identities = device_identities
40 .into_iter()
41 .map(WireIdentity::from)
42 .collect::<Vec<_>>();
43 #[cfg(target_family = "wasm")]
44 let device_identities =
45 serde_wasm_bindgen::to_value(&device_identities).expect("device identities can always be serialized");
46 Ok(device_identities)
47 }
48
49 #[cfg_attr(
51 target_family = "wasm",
52 wasm_bindgen(unchecked_return_type = "Map<string, WireIdentity[]>")
53 )]
54 pub async fn get_user_identities(
55 &self,
56 conversation_id: &ConversationId,
57 user_ids: Vec<String>,
58 ) -> CoreCryptoResult<UserIdentities> {
59 let conversation_id = conversation_id_vec!(conversation_id);
60 let conversation = self
61 .inner
62 .get_raw_conversation(&conversation_id)
63 .await
64 .map_err(RecursiveError::mls_client("getting raw conversation"))?;
65 let identities = conversation.get_user_identities(user_ids.as_slice()).await?;
66 let identities = identities
67 .into_iter()
68 .map(|(k, v)| (k, v.into_iter().map(WireIdentity::from).collect()))
69 .collect::<HashMap<_, Vec<_>>>();
70 #[cfg(target_family = "wasm")]
71 let identities = serde_wasm_bindgen::to_value(&identities).expect("user identities can always be serialized");
72 Ok(identities)
73 }
74}