bitwarden_wasm_internal/platform/
token_provider.rs1use 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
21pub(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}