atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: crates/matrix-sdk-indexeddb/src/lib.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
#![cfg_attr(not(target_family = "wasm"), allow(unused))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
#[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
use matrix_sdk_base::store::StoreError;
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
use thiserror::Error;
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
#[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
mod crypto_store;
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
mod error;
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
#[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
mod event_cache_store;
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
#[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
mod media_store;
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
mod serializer;
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
#[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
mod state_store;
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
#[cfg(any(feature = "event-cache-store", feature = "media-store"))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
mod transaction;
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
#[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
pub use crypto_store::{IndexeddbCryptoStore, IndexeddbCryptoStoreError};
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
#[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
pub use state_store::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
    IndexeddbStateStore, IndexeddbStateStoreBuilder, IndexeddbStateStoreError,
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
    MigrationConflictStrategy,
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
#[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
pub use crate::event_cache_store::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
    IndexeddbEventCacheStore, IndexeddbEventCacheStoreBuilder, IndexeddbEventCacheStoreError,
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
#[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
pub use crate::media_store::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    IndexeddbMediaStore, IndexeddbMediaStoreBuilder, IndexeddbMediaStoreError,
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
/// Structure containing implementations of every type
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
/// of store using IndexedDB for persistent storage.
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
/// Note that each of the stores is behind a feature flag and will
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
/// only be available when its corresponding flag is set.
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
pub struct IndexeddbStores {
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
    /// An IndexedDB-backed implementation of [`CryptoStore`][1]
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
    /// [1]: matrix_sdk_crypto::store::CryptoStore
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
    #[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    pub crypto: IndexeddbCryptoStore,
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
    /// An IndexedDB-backed implementation of [`StateStore`][1]
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
    /// [1]: matrix_sdk_base::store::StateStore
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    #[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    pub state: IndexeddbStateStore,
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
    /// An IndexedDB-backed implementation of [`EventCacheStore`][1]
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    /// [1]: matrix_sdk_base::event_cache::store::EventCacheStore
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
    #[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    pub event_cache: IndexeddbEventCacheStore,
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    /// An IndexedDB-backed implementation of [`MediaStore`][1]
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
    /// [1]: matrix_sdk_base::media::store::MediaStore
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
    #[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
    pub media: IndexeddbMediaStore,
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
impl IndexeddbStores {
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
    /// Opens and returns all stores using the given database name and,
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
    /// optionally, a passphrase.
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    /// If `e2e-encryption` and `state-store` features are not enabled,
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
    /// `passphrase` is ignored. Otherwise `passphrase` is used to import or
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
    /// create a [`StoreCipher`][1] which encrypts contents of all stores.
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
    /// Note that each of the stores is behind a feature flag and will only be
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
    /// opened when the corresponding flag is set.
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
    /// [1]: matrix_sdk_store_encryption::StoreCipher
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
    pub async fn open(
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
        name: &str,
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
        #[allow(unused_variables)] passphrase: Option<&str>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
    ) -> Result<Self, OpenStoreError> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
        #[cfg(all(feature = "e2e-encryption", feature = "state-store"))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
        if let Some(passphrase) = passphrase {
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
            return Self::open_with_passphrase(name, passphrase).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
        Self::open_without_passphrase(name).await
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
    /// Opens and returns all stores using the given database name. Contents of
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
    /// the stores are NOT encrypted.
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
    /// Note that each of the stores is behind a feature flag and will only be
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
    /// opened when the corresponding flag is set.
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
    #[allow(clippy::unused_async)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
    pub async fn open_without_passphrase(name: &str) -> Result<Self, OpenStoreError> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
        #[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
        let state = IndexeddbStateStore::builder()
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
            .name(name.to_owned())
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
            .build()
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
            .await
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
            .map_err(StoreError::from)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
        #[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
        let crypto = IndexeddbCryptoStore::open_with_name(name).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
        #[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
        let event_cache = IndexeddbEventCacheStoreBuilder::with_prefix(name).build().await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
        #[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
        let media = IndexeddbMediaStoreBuilder::with_prefix(name).build().await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
        Ok(Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
            #[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
            state,
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
            #[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
            crypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
            #[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
            event_cache,
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
            #[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
            media,
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
    /// Opens and returns all stores using the given database name and
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
    /// passphrase. Passphrase is used to import or create a [`StoreCipher`][1]
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
    /// which encrypts contents of all stores.
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
    /// Note that [`IndexeddbEventCacheStore`] and [`IndexeddbMediaStore`] are
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
    /// behind feature flags and will only be opened when their
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
    /// corresponding flags are set.
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC132
    /// [1]: matrix_sdk_store_encryption::StoreCipher
7ff8adafe9e4atagen2026-10-22 12:30 UTC133
    #[cfg(all(feature = "e2e-encryption", feature = "state-store"))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC134
    pub async fn open_with_passphrase(
7ff8adafe9e4atagen2026-10-22 12:30 UTC135
        name: &str,
7ff8adafe9e4atagen2026-10-22 12:30 UTC136
        passphrase: &str,
7ff8adafe9e4atagen2026-10-22 12:30 UTC137
    ) -> Result<Self, OpenStoreError> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC138
        let state = IndexeddbStateStore::builder()
7ff8adafe9e4atagen2026-10-22 12:30 UTC139
            .name(name.to_owned())
7ff8adafe9e4atagen2026-10-22 12:30 UTC140
            .passphrase(passphrase.to_owned())
7ff8adafe9e4atagen2026-10-22 12:30 UTC141
            .build()
7ff8adafe9e4atagen2026-10-22 12:30 UTC142
            .await
7ff8adafe9e4atagen2026-10-22 12:30 UTC143
            .map_err(StoreError::from)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC144
        let store_cipher =
7ff8adafe9e4atagen2026-10-22 12:30 UTC145
            state.store_cipher.clone().ok_or(OpenStoreError::FailedToLoadStoreCipher)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC146
7ff8adafe9e4atagen2026-10-22 12:30 UTC147
        let crypto =
7ff8adafe9e4atagen2026-10-22 12:30 UTC148
            IndexeddbCryptoStore::open_with_store_cipher(name, Some(store_cipher.clone())).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC149
7ff8adafe9e4atagen2026-10-22 12:30 UTC150
        #[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC151
        let event_cache = IndexeddbEventCacheStoreBuilder::with_prefix(name)
7ff8adafe9e4atagen2026-10-22 12:30 UTC152
            .store_cipher(store_cipher.clone())
7ff8adafe9e4atagen2026-10-22 12:30 UTC153
            .build()
7ff8adafe9e4atagen2026-10-22 12:30 UTC154
            .await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC155
7ff8adafe9e4atagen2026-10-22 12:30 UTC156
        #[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC157
        let media = IndexeddbMediaStoreBuilder::with_prefix(name)
7ff8adafe9e4atagen2026-10-22 12:30 UTC158
            .store_cipher(store_cipher.clone())
7ff8adafe9e4atagen2026-10-22 12:30 UTC159
            .build()
7ff8adafe9e4atagen2026-10-22 12:30 UTC160
            .await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC161
7ff8adafe9e4atagen2026-10-22 12:30 UTC162
        Ok(Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC163
            state,
7ff8adafe9e4atagen2026-10-22 12:30 UTC164
            crypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC165
            #[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC166
            event_cache,
7ff8adafe9e4atagen2026-10-22 12:30 UTC167
            #[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC168
            media,
7ff8adafe9e4atagen2026-10-22 12:30 UTC169
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC170
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC171
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC172
7ff8adafe9e4atagen2026-10-22 12:30 UTC173
/// Create a [`IndexeddbStateStore`] and a [`IndexeddbCryptoStore`] that use the
7ff8adafe9e4atagen2026-10-22 12:30 UTC174
/// same name and passphrase.
7ff8adafe9e4atagen2026-10-22 12:30 UTC175
#[deprecated(
7ff8adafe9e4atagen2026-10-22 12:30 UTC176
    note = "this function only opens state and crypto stores, use `IndexeddbStores::open()` instead."
7ff8adafe9e4atagen2026-10-22 12:30 UTC177
)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC178
#[cfg(all(feature = "e2e-encryption", feature = "state-store"))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC179
pub async fn open_stores_with_name(
7ff8adafe9e4atagen2026-10-22 12:30 UTC180
    name: &str,
7ff8adafe9e4atagen2026-10-22 12:30 UTC181
    passphrase: Option<&str>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC182
) -> Result<(IndexeddbStateStore, IndexeddbCryptoStore), OpenStoreError> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC183
    let mut builder = IndexeddbStateStore::builder().name(name.to_owned());
7ff8adafe9e4atagen2026-10-22 12:30 UTC184
    if let Some(passphrase) = passphrase {
7ff8adafe9e4atagen2026-10-22 12:30 UTC185
        builder = builder.passphrase(passphrase.to_owned());
7ff8adafe9e4atagen2026-10-22 12:30 UTC186
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC187
7ff8adafe9e4atagen2026-10-22 12:30 UTC188
    let state_store = builder.build().await.map_err(StoreError::from)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC189
    let crypto_store =
7ff8adafe9e4atagen2026-10-22 12:30 UTC190
        IndexeddbCryptoStore::open_with_store_cipher(name, state_store.store_cipher.clone())
7ff8adafe9e4atagen2026-10-22 12:30 UTC191
            .await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC192
7ff8adafe9e4atagen2026-10-22 12:30 UTC193
    Ok((state_store, crypto_store))
7ff8adafe9e4atagen2026-10-22 12:30 UTC194
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC195
7ff8adafe9e4atagen2026-10-22 12:30 UTC196
/// Create an [`IndexeddbStateStore`].
7ff8adafe9e4atagen2026-10-22 12:30 UTC197
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC198
/// If a `passphrase` is given, the store will be encrypted using a key derived
7ff8adafe9e4atagen2026-10-22 12:30 UTC199
/// from that passphrase.
7ff8adafe9e4atagen2026-10-22 12:30 UTC200
#[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC201
pub async fn open_state_store(
7ff8adafe9e4atagen2026-10-22 12:30 UTC202
    name: &str,
7ff8adafe9e4atagen2026-10-22 12:30 UTC203
    passphrase: Option<&str>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC204
) -> Result<IndexeddbStateStore, OpenStoreError> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC205
    let mut builder = IndexeddbStateStore::builder().name(name.to_owned());
7ff8adafe9e4atagen2026-10-22 12:30 UTC206
    if let Some(passphrase) = passphrase {
7ff8adafe9e4atagen2026-10-22 12:30 UTC207
        builder = builder.passphrase(passphrase.to_owned());
7ff8adafe9e4atagen2026-10-22 12:30 UTC208
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC209
    let state_store = builder.build().await.map_err(StoreError::from)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC210
7ff8adafe9e4atagen2026-10-22 12:30 UTC211
    Ok(state_store)
7ff8adafe9e4atagen2026-10-22 12:30 UTC212
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC213
7ff8adafe9e4atagen2026-10-22 12:30 UTC214
/// All the errors that can occur when opening an IndexedDB store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC215
#[derive(Error, Debug)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC216
pub enum OpenStoreError {
7ff8adafe9e4atagen2026-10-22 12:30 UTC217
    /// An error occurred with the state store implementation.
7ff8adafe9e4atagen2026-10-22 12:30 UTC218
    #[cfg(feature = "state-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC219
    #[error(transparent)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC220
    State(#[from] StoreError),
7ff8adafe9e4atagen2026-10-22 12:30 UTC221
7ff8adafe9e4atagen2026-10-22 12:30 UTC222
    /// An error occurred with the crypto store implementation.
7ff8adafe9e4atagen2026-10-22 12:30 UTC223
    #[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC224
    #[error(transparent)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC225
    Crypto(#[from] IndexeddbCryptoStoreError),
7ff8adafe9e4atagen2026-10-22 12:30 UTC226
7ff8adafe9e4atagen2026-10-22 12:30 UTC227
    /// An error occurred while trying to load a [`StoreCipher`][1] from a
7ff8adafe9e4atagen2026-10-22 12:30 UTC228
    /// passphrase
7ff8adafe9e4atagen2026-10-22 12:30 UTC229
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC230
    /// [1]: matrix_sdk_store_encryption::StoreCipher
7ff8adafe9e4atagen2026-10-22 12:30 UTC231
    #[cfg(feature = "e2e-encryption")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC232
    #[error("failed to load store cipher")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC233
    FailedToLoadStoreCipher,
7ff8adafe9e4atagen2026-10-22 12:30 UTC234
7ff8adafe9e4atagen2026-10-22 12:30 UTC235
    /// An error occurred with the event cache store implementation.
7ff8adafe9e4atagen2026-10-22 12:30 UTC236
    #[cfg(feature = "event-cache-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC237
    #[error(transparent)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC238
    Event(#[from] IndexeddbEventCacheStoreError),
7ff8adafe9e4atagen2026-10-22 12:30 UTC239
7ff8adafe9e4atagen2026-10-22 12:30 UTC240
    /// An error occurred with the media store implementation.
7ff8adafe9e4atagen2026-10-22 12:30 UTC241
    #[cfg(feature = "media-store")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC242
    #[error(transparent)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC243
    Media(#[from] IndexeddbMediaStoreError),
7ff8adafe9e4atagen2026-10-22 12:30 UTC244
}