Skip to main content

bitwarden_shared_unlock/wasm/
leader.rs

1use bitwarden_threading::cancellation_token::wasm::{AbortController, AbortControllerExt};
2use wasm_bindgen::prelude::wasm_bindgen;
3
4use super::drivers::{JsSharedUnlockDriver, RawJsSharedUnlockDriver};
5use crate::{DeviceEvent, Leader, LeaderStartError};
6
7/// Shared-unlock leader for WASM clients.
8#[wasm_bindgen]
9pub struct SharedUnlockLeader {
10    leader: Leader<JsSharedUnlockDriver>,
11}
12
13#[wasm_bindgen]
14impl SharedUnlockLeader {
15    /// Creates a new shared-unlock leader
16    #[wasm_bindgen]
17    pub fn try_new(
18        ipc_client: &bitwarden_ipc::wasm::JsIpcClient,
19        driver: RawJsSharedUnlockDriver,
20    ) -> Result<Self, bitwarden_ipc::SubscribeError> {
21        let driver = JsSharedUnlockDriver::new(driver);
22        let leader = Leader::create(driver, ipc_client.client.clone());
23
24        Ok(Self { leader })
25    }
26
27    /// Starts background processing for incoming follower-to-leader IPC messages.
28    #[wasm_bindgen]
29    pub async fn start(
30        &self,
31        abort_controller: Option<AbortController>,
32    ) -> Result<(), LeaderStartError> {
33        self.leader
34            .start(abort_controller.map(|abort| abort.to_cancellation_token()))
35            .await
36    }
37
38    /// Forwards a device event to the shared-unlock leader implementation
39    #[wasm_bindgen]
40    pub async fn handle_device_event(&self, event: DeviceEvent) {
41        if let Err(error) = self.leader.handle_device_event(event).await {
42            tracing::error!(?error, "Failed to handle shared unlock leader device event");
43        }
44    }
45}