bitwarden_wasm_internal/platform/
token_provider.rs

1use bitwarden_core::client::internal::ClientManagedTokens;
2use bitwarden_threading::ThreadBoundRunner;
3use wasm_bindgen::{prelude::wasm_bindgen, JsValue};
4
5#[wasm_bindgen(typescript_custom_section)]
6const TOKEN_CUSTOM_TS_TYPE: &'static str = r#"
7export interface TokenProvider {
8    get_access_token(): Promise<string | undefined>;
9}
10"#;
11
12#[wasm_bindgen]
13extern "C" {
14    #[wasm_bindgen(js_name = TokenProvider)]
15    pub type JsTokenProvider;
16
17    #[wasm_bindgen(method)]
18    pub async fn get_access_token(this: &JsTokenProvider) -> JsValue;
19}
20
21/// Thread-bound runner for JavaScript token provider
22pub(crate) struct WasmClientManagedTokens(ThreadBoundRunner<JsTokenProvider>);
23
24impl WasmClientManagedTokens {
25    pub fn new(js_provider: JsTokenProvider) -> Self {
26        Self(ThreadBoundRunner::new(js_provider))
27    }
28}
29
30impl std::fmt::Debug for WasmClientManagedTokens {
31    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32        f.debug_struct("WasmClientManagedTokens").finish()
33    }
34}
35
36#[async_trait::async_trait]
37impl ClientManagedTokens for WasmClientManagedTokens {
38    async fn get_access_token(&self) -> Option<String> {
39        self.0
40            .run_in_thread(|c| async move { c.get_access_token().await.as_string() })
41            .await
42            .unwrap_or_default()
43    }
44}