core_crypto_ffi/core_crypto/e2ei/
identities.rs

1use 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    /// See [core_crypto::mls::conversation::Conversation::get_device_identities]
25    #[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    /// See [core_crypto::mls::conversation::Conversation::get_user_identities]
50    #[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}