Skip to main content

antenna_client_web/storage/
mod.rs

1use antenna_client_shared::IdentityStorage;
2use antenna_protocol::Identity;
3use anyhow::{Context, Result, anyhow};
4
5/// Identity persistence backed by `window.localStorage`.
6pub struct Storage {
7    path: String,
8}
9
10impl Storage {
11    pub fn new(path: impl Into<String>) -> Self {
12        Self { path: path.into() }
13    }
14
15    pub fn path(&self) -> &str {
16        &self.path
17    }
18}
19
20impl IdentityStorage for Storage {
21    fn load_identity(&self) -> Option<Identity> {
22        let raw = web_sys::window()?
23            .local_storage()
24            .ok()??
25            .get_item(&self.path)
26            .ok()??;
27        serde_json::from_str(&raw).ok()
28    }
29
30    fn save_identity(&self, identity: &Identity) -> Result<()> {
31        let json = serde_json::to_string(identity)?;
32        web_sys::window()
33            .context("DOM window is unavailable")?
34            .local_storage()
35            .map_err(|e| anyhow!("{:?}", e))?
36            .context("LocalStorage is unavailable")?
37            .set_item(&self.path, &json)
38            .map_err(|e| anyhow!("{:?}", e))?;
39        Ok(())
40    }
41}