chore: update indexed_db_futures (#5347)
* chore: update indexed_db_futures * clippy
This commit is contained in:
committed by
GitHub
parent
5c89d36140
commit
61a4433cd9
Generated
+82
-20
@@ -4,9 +4,9 @@ version = 3
|
||||
|
||||
[[package]]
|
||||
name = "accessory"
|
||||
version = "1.3.1"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87537f9ae7cfa78d5b8ebd1a1db25959f5e737126be4d8eb44a5452fc4b63cde"
|
||||
checksum = "bb3791c4beae5b827e93558ac83a88e63a841aad61759a05d9b577ef16030470"
|
||||
dependencies = [
|
||||
"macroific",
|
||||
"proc-macro2",
|
||||
@@ -1955,10 +1955,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "delegate-display"
|
||||
version = "2.1.1"
|
||||
version = "3.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "98a85201f233142ac819bbf6226e36d0b5e129a47bd325084674261c82d4cd66"
|
||||
checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74"
|
||||
dependencies = [
|
||||
"impartial-ord",
|
||||
"itoa",
|
||||
"macroific",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -2008,6 +2010,27 @@ dependencies = [
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_more"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
|
||||
dependencies = [
|
||||
"derive_more-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_more-impl"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.90",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "devise"
|
||||
version = "0.4.1"
|
||||
@@ -2449,9 +2472,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
|
||||
|
||||
[[package]]
|
||||
name = "fancy_constructor"
|
||||
version = "1.3.0"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07b19d0e43eae2bfbafe4931b5e79c73fb1a849ca15cd41a761a7b8587f9a1a2"
|
||||
checksum = "fac0fd7f4636276b4bd7b3148d0ba2c1c3fbede2b5214e47e7fedb70b02cde44"
|
||||
dependencies = [
|
||||
"macroific",
|
||||
"proc-macro2",
|
||||
@@ -3531,6 +3554,17 @@ dependencies = [
|
||||
"icu_properties",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "impartial-ord"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "importer-cli"
|
||||
version = "0.1.0"
|
||||
@@ -3569,21 +3603,38 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
|
||||
|
||||
[[package]]
|
||||
name = "indexed_db_futures"
|
||||
version = "0.4.2"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0704b71f13f81b5933d791abf2de26b33c40935143985220299a357721166706"
|
||||
checksum = "d56078e9bfed55e1d3c0cebad5be921d32f062be8f1e4bf3750b487bc6e7d13e"
|
||||
dependencies = [
|
||||
"accessory",
|
||||
"cfg-if",
|
||||
"delegate-display",
|
||||
"derive_more",
|
||||
"fancy_constructor",
|
||||
"indexed_db_futures_macros_internal",
|
||||
"js-sys",
|
||||
"uuid",
|
||||
"sealed",
|
||||
"smallvec",
|
||||
"thiserror 1.0.69",
|
||||
"tokio",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexed_db_futures_macros_internal"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "caeba94923b68f254abef921cea7e7698bf4675fdd89d7c58bf1ed885b49a27d"
|
||||
dependencies = [
|
||||
"macroific",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.3"
|
||||
@@ -4030,9 +4081,9 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
|
||||
|
||||
[[package]]
|
||||
name = "macroific"
|
||||
version = "1.3.1"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f05c00ac596022625d01047c421a0d97d7f09a18e429187b341c201cb631b9dd"
|
||||
checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285"
|
||||
dependencies = [
|
||||
"macroific_attr_parse",
|
||||
"macroific_core",
|
||||
@@ -4041,32 +4092,33 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "macroific_attr_parse"
|
||||
version = "1.3.0"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd94d5da95b30ae6e10621ad02340909346ad91661f3f8c0f2b62345e46a2f67"
|
||||
checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"sealed",
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "macroific_core"
|
||||
version = "1.0.2"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "13198c120864097a565ccb3ff947672d969932b7975ebd4085732c9f09435e55"
|
||||
checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"sealed",
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "macroific_macro"
|
||||
version = "1.1.0"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0c9853143cbed7f1e41dc39fee95f9b361bec65c8dc2a01bf609be01b61f5ae"
|
||||
checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b"
|
||||
dependencies = [
|
||||
"macroific_attr_parse",
|
||||
"macroific_core",
|
||||
@@ -8631,6 +8683,17 @@ dependencies = [
|
||||
"untrusted",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sealed"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sec1"
|
||||
version = "0.7.3"
|
||||
@@ -10941,7 +11004,6 @@ checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"serde",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -11144,7 +11206,7 @@ name = "wasm-storage"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"futures",
|
||||
"getrandom",
|
||||
"indexed_db_futures",
|
||||
"js-sys",
|
||||
"nym-store-cipher",
|
||||
|
||||
+1
-2
@@ -398,8 +398,7 @@ prost = { version = "0.12", default-features = false }
|
||||
gloo-utils = "0.2.0"
|
||||
gloo-net = "0.6.0"
|
||||
|
||||
# TODO: migrate to 0.6+
|
||||
indexed_db_futures = "0.4.2"
|
||||
indexed_db_futures = "0.6.0"
|
||||
js-sys = "0.3.76"
|
||||
serde-wasm-bindgen = "0.6.5"
|
||||
tsify = "0.4.5"
|
||||
|
||||
@@ -4,13 +4,15 @@
|
||||
use crate::error::WasmCoreError;
|
||||
use crate::storage::wasm_client_traits::{v1, v2, WasmClientStorage};
|
||||
use async_trait::async_trait;
|
||||
use js_sys::{Array, Promise};
|
||||
use js_sys::Promise;
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde::Serialize;
|
||||
use wasm_bindgen::prelude::*;
|
||||
use wasm_bindgen_futures::future_to_promise;
|
||||
use wasm_storage::traits::BaseWasmStorage;
|
||||
use wasm_storage::{IdbVersionChangeEvent, WasmStorage};
|
||||
use wasm_storage::{
|
||||
Build, Database, RawDbResult, TryFromJs, TryToJs, VersionChangeEvent, WasmStorage,
|
||||
};
|
||||
use wasm_utils::error::{simple_js_error, PromisableResult};
|
||||
use zeroize::Zeroizing;
|
||||
|
||||
@@ -44,28 +46,29 @@ impl ClientStorage {
|
||||
// special care must be taken on JS side to ensure it's correctly used there.
|
||||
let passphrase = Zeroizing::new(passphrase);
|
||||
|
||||
let migrate_fn = Some(|evt: &IdbVersionChangeEvent| -> Result<(), JsValue> {
|
||||
let migrate_fn = Some(|evt: VersionChangeEvent, db: Database| -> RawDbResult<()> {
|
||||
// Even if the web-sys bindings expose the version as a f64, the IndexedDB API
|
||||
// works with an unsigned integer.
|
||||
// See <https://github.com/rustwasm/wasm-bindgen/issues/1149>
|
||||
let old_version = evt.old_version() as u32;
|
||||
let db = evt.db();
|
||||
|
||||
if old_version < 1 {
|
||||
// migrating to version 2
|
||||
|
||||
db.create_object_store(v1::KEYS_STORE)?;
|
||||
db.create_object_store(v1::CORE_STORE)?;
|
||||
db.create_object_store(v1::KEYS_STORE).build()?;
|
||||
db.create_object_store(v1::CORE_STORE).build()?;
|
||||
|
||||
db.create_object_store(v2::GATEWAY_REGISTRATIONS_ACTIVE_GATEWAY_STORE)?;
|
||||
db.create_object_store(v2::GATEWAY_REGISTRATIONS_REGISTERED_GATEWAYS_STORE)?;
|
||||
db.create_object_store(v2::GATEWAY_REGISTRATIONS_ACTIVE_GATEWAY_STORE)
|
||||
.build()?;
|
||||
db.create_object_store(v2::GATEWAY_REGISTRATIONS_REGISTERED_GATEWAYS_STORE)
|
||||
.build()?;
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// version 1 -> unimplemented migration
|
||||
if old_version < 2 {
|
||||
return Err(simple_js_error("this client is incompatible with existing storage. please initialise it again."));
|
||||
return Err(simple_js_error("this client is incompatible with existing storage. please initialise it again.").into());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -112,7 +115,7 @@ impl BaseWasmStorage for ClientStorage {
|
||||
async fn read_value<T, K>(&self, store: &str, key: K) -> Result<Option<T>, Self::StorageError>
|
||||
where
|
||||
T: DeserializeOwned,
|
||||
K: JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
Ok(self.inner.read_value(store, key).await?)
|
||||
}
|
||||
@@ -125,33 +128,33 @@ impl BaseWasmStorage for ClientStorage {
|
||||
) -> Result<(), Self::StorageError>
|
||||
where
|
||||
T: Serialize,
|
||||
K: JsCast,
|
||||
K: TryToJs + TryFromJs,
|
||||
{
|
||||
Ok(self.inner.store_value(store, key, value).await?)
|
||||
}
|
||||
|
||||
async fn remove_value<K>(&self, store: &str, key: K) -> Result<(), Self::StorageError>
|
||||
where
|
||||
K: JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
Ok(self.inner.remove_value(store, key).await?)
|
||||
}
|
||||
|
||||
async fn has_value<K>(&self, store: &str, key: K) -> Result<bool, Self::StorageError>
|
||||
where
|
||||
K: JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
Ok(self.inner.has_value(store, key).await?)
|
||||
}
|
||||
|
||||
async fn key_count<K>(&self, store: &str, key: K) -> Result<u32, Self::StorageError>
|
||||
where
|
||||
K: JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
Ok(self.inner.key_count(store, key).await?)
|
||||
}
|
||||
|
||||
async fn get_all_keys(&self, store: &str) -> Result<Array, Self::StorageError> {
|
||||
async fn get_all_keys(&self, store: &str) -> Result<Vec<JsValue>, Self::StorageError> {
|
||||
Ok(self.inner.get_all_keys(store).await?)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,8 +286,8 @@ pub trait WasmClientStorage: BaseWasmStorage {
|
||||
.await
|
||||
.map_err(Into::into)
|
||||
.map(|arr| {
|
||||
arr.to_vec()
|
||||
.into_iter()
|
||||
arr.iter()
|
||||
.cloned()
|
||||
.filter_map(|key| key.as_string())
|
||||
.collect()
|
||||
})
|
||||
|
||||
@@ -9,7 +9,7 @@ license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
async-trait = { workspace = true }
|
||||
futures = { workspace = true }
|
||||
getrandom = { workspace = true, features = ["js"] }
|
||||
js-sys = { workspace = true }
|
||||
wasm-bindgen = { workspace = true }
|
||||
serde = { workspace = true, features = ["derive"] }
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
use indexed_db_futures::web_sys::DomException;
|
||||
use serde_wasm_bindgen::Error;
|
||||
use thiserror::Error;
|
||||
use wasm_bindgen::JsValue;
|
||||
@@ -12,15 +11,11 @@ pub enum StorageError {
|
||||
#[error("{0}")]
|
||||
Json(String),
|
||||
|
||||
#[error("DomException {name} ({code}): {message}")]
|
||||
DomException {
|
||||
/// DomException code
|
||||
code: u16,
|
||||
/// Specific name of the DomException
|
||||
name: String,
|
||||
/// Message given to the DomException
|
||||
message: String,
|
||||
},
|
||||
#[error("storage failure: {message}")]
|
||||
InternalStorageFailure { message: String },
|
||||
|
||||
#[error("failed to open the db file: {message}")]
|
||||
DbOpenFailure { message: String },
|
||||
|
||||
#[error("FATAL ERROR: storage key is somehow present {count} times in the table!")]
|
||||
DuplicateKey { count: u32 },
|
||||
@@ -46,12 +41,18 @@ impl From<StorageError> for JsValue {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<DomException> for StorageError {
|
||||
fn from(value: DomException) -> StorageError {
|
||||
StorageError::DomException {
|
||||
name: value.name(),
|
||||
message: value.message(),
|
||||
code: value.code(),
|
||||
impl From<indexed_db_futures::error::Error> for StorageError {
|
||||
fn from(value: indexed_db_futures::error::Error) -> Self {
|
||||
StorageError::InternalStorageFailure {
|
||||
message: value.to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<indexed_db_futures::error::OpenDbError> for StorageError {
|
||||
fn from(value: indexed_db_futures::error::OpenDbError) -> Self {
|
||||
StorageError::DbOpenFailure {
|
||||
message: value.to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// Copyright 2023-2025 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
use crate::cipher_export::StoredExportedStoreCipher;
|
||||
use crate::error::StorageError;
|
||||
use indexed_db_futures::transaction::TransactionMode;
|
||||
use nym_store_cipher::{
|
||||
Aes256Gcm, Algorithm, EncryptedData, KdfInfo, KeySizeUser, Params, StoreCipher, Unsigned,
|
||||
Version,
|
||||
@@ -13,7 +14,10 @@ use std::future::IntoFuture;
|
||||
use wasm_bindgen::JsValue;
|
||||
use wasm_utils::console_log;
|
||||
|
||||
pub use indexed_db_futures::database::{Database, VersionChangeEvent};
|
||||
pub use indexed_db_futures::prelude::*;
|
||||
pub use indexed_db_futures::primitive::{TryFromJs, TryToJs};
|
||||
pub use indexed_db_futures::Result as RawDbResult;
|
||||
|
||||
mod cipher_export;
|
||||
pub mod error;
|
||||
@@ -54,31 +58,29 @@ impl WasmStorage {
|
||||
passphrase: Option<&[u8]>,
|
||||
) -> Result<Self, StorageError>
|
||||
where
|
||||
F: Fn(&IdbVersionChangeEvent) -> Result<(), JsValue> + 'static,
|
||||
F: Fn(VersionChangeEvent, Database) -> RawDbResult<()> + 'static,
|
||||
{
|
||||
let mut db_req: OpenDbRequest = IdbDatabase::open_u32(db_name, version)?;
|
||||
|
||||
// we must always ensure the cipher table is present
|
||||
db_req.set_on_upgrade_needed(Some(
|
||||
move |evt: &IdbVersionChangeEvent| -> Result<(), JsValue> {
|
||||
let db = Database::open(db_name)
|
||||
.with_version(version)
|
||||
.with_on_upgrade_needed(move |event, db| {
|
||||
// Even if the web-sys bindings expose the version as a f64, the IndexedDB API
|
||||
// works with an unsigned integer.
|
||||
// See <https://github.com/rustwasm/wasm-bindgen/issues/1149>
|
||||
let old_version = evt.old_version() as u32;
|
||||
let old_version = event.old_version() as u32;
|
||||
|
||||
if old_version < 1 {
|
||||
evt.db().create_object_store(CIPHER_INFO_STORE)?;
|
||||
db.create_object_store(CIPHER_INFO_STORE).build()?;
|
||||
}
|
||||
|
||||
if let Some(migrate) = migrate_fn.as_ref() {
|
||||
migrate(evt)
|
||||
migrate(event, db)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
},
|
||||
));
|
||||
})
|
||||
.await?;
|
||||
|
||||
let db: IdbDatabase = db_req.into_future().await?;
|
||||
let inner = IdbWrapper(db);
|
||||
let store_cipher = inner.setup_store_cipher(passphrase).await?;
|
||||
|
||||
@@ -94,13 +96,12 @@ impl WasmStorage {
|
||||
}
|
||||
|
||||
pub async fn remove(db_name: &str) -> Result<(), StorageError> {
|
||||
IdbDatabase::delete_by_name(db_name)?.into_future().await?;
|
||||
Database::delete_by_name(db_name)?.into_future().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn exists(db_name: &str) -> Result<bool, StorageError> {
|
||||
let db_req: OpenDbRequest = IdbDatabase::open(db_name)?;
|
||||
let db: IdbDatabase = db_req.into_future().await?;
|
||||
let db = Database::open(db_name).await?;
|
||||
|
||||
// if the db was already created before, at the very least cipher info store should exist,
|
||||
// thus the iterator should return at least one value
|
||||
@@ -139,7 +140,7 @@ impl WasmStorage {
|
||||
pub async fn read_value<T, K>(&self, store: &str, key: K) -> Result<Option<T>, StorageError>
|
||||
where
|
||||
T: DeserializeOwned,
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.inner
|
||||
.read_value_raw(store, key)
|
||||
@@ -156,7 +157,7 @@ impl WasmStorage {
|
||||
) -> Result<(), StorageError>
|
||||
where
|
||||
T: Serialize,
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs + TryFromJs,
|
||||
{
|
||||
self.inner
|
||||
.store_value_raw(store, key, &self.serialize_value(&value)?)
|
||||
@@ -165,14 +166,14 @@ impl WasmStorage {
|
||||
|
||||
pub async fn remove_value<K>(&self, store: &str, key: K) -> Result<(), StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.inner.remove_value_raw(store, key).await
|
||||
}
|
||||
|
||||
pub async fn has_value<K>(&self, store: &str, key: K) -> Result<bool, StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
match self.key_count(store, key).await? {
|
||||
0 => Ok(false),
|
||||
@@ -183,82 +184,98 @@ impl WasmStorage {
|
||||
|
||||
pub async fn key_count<K>(&self, store: &str, key: K) -> Result<u32, StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.inner.get_key_count(store, key).await
|
||||
}
|
||||
|
||||
pub async fn get_all_keys(&self, store: &str) -> Result<js_sys::Array, StorageError> {
|
||||
pub async fn get_all_keys(&self, store: &str) -> Result<Vec<JsValue>, StorageError> {
|
||||
self.inner.get_all_keys(store).await
|
||||
}
|
||||
}
|
||||
|
||||
struct IdbWrapper(IdbDatabase);
|
||||
struct IdbWrapper(Database);
|
||||
|
||||
impl IdbWrapper {
|
||||
async fn read_value_raw<K>(&self, store: &str, key: K) -> Result<Option<JsValue>, StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.0
|
||||
.transaction_on_one_with_mode(store, IdbTransactionMode::Readonly)?
|
||||
.transaction(store)
|
||||
.with_mode(TransactionMode::Readonly)
|
||||
.build()?
|
||||
.object_store(store)?
|
||||
.get(&key)?
|
||||
.get(&key)
|
||||
.primitive()?
|
||||
.await
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
async fn store_value_raw<K>(
|
||||
async fn store_value_raw<K, T>(
|
||||
&self,
|
||||
store: &str,
|
||||
key: K,
|
||||
value: &JsValue,
|
||||
value: &T,
|
||||
) -> Result<(), StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs + TryFromJs,
|
||||
T: TryToJs,
|
||||
{
|
||||
self.0
|
||||
.transaction_on_one_with_mode(store, IdbTransactionMode::Readwrite)?
|
||||
.object_store(store)?
|
||||
.put_key_val_owned(key, value)?
|
||||
.into_future()
|
||||
.await
|
||||
.map_err(Into::into)
|
||||
let tx = self
|
||||
.0
|
||||
.transaction(store)
|
||||
.with_mode(TransactionMode::Readwrite)
|
||||
.build()?;
|
||||
|
||||
let store = tx.object_store(store)?;
|
||||
store.put(value).with_key(key).primitive()?.await?;
|
||||
|
||||
tx.commit().await.map_err(Into::into)
|
||||
}
|
||||
|
||||
async fn remove_value_raw<K>(&self, store: &str, key: K) -> Result<(), StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.0
|
||||
.transaction_on_one_with_mode(store, IdbTransactionMode::Readwrite)?
|
||||
.object_store(store)?
|
||||
.delete_owned(key)?
|
||||
.into_future()
|
||||
.await
|
||||
.map_err(Into::into)
|
||||
let tx = self
|
||||
.0
|
||||
.transaction(store)
|
||||
.with_mode(TransactionMode::Readwrite)
|
||||
.build()?;
|
||||
|
||||
let store = tx.object_store(store)?;
|
||||
store.delete(key).primitive()?.await?;
|
||||
|
||||
tx.commit().await.map_err(Into::into)
|
||||
}
|
||||
|
||||
async fn get_key_count<K>(&self, store: &str, key: K) -> Result<u32, StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.0
|
||||
.transaction_on_one_with_mode(store, IdbTransactionMode::Readwrite)?
|
||||
.transaction(store)
|
||||
.with_mode(TransactionMode::Readonly)
|
||||
.build()?
|
||||
.object_store(store)?
|
||||
.count_with_key_owned(key)?
|
||||
.into_future()
|
||||
.count()
|
||||
.with_query(key)
|
||||
.primitive()?
|
||||
.await
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
async fn get_all_keys(&self, store: &str) -> Result<js_sys::Array, StorageError> {
|
||||
async fn get_all_keys(&self, store: &str) -> Result<Vec<JsValue>, StorageError> {
|
||||
self.0
|
||||
.transaction_on_one_with_mode(store, IdbTransactionMode::Readonly)?
|
||||
.transaction(store)
|
||||
.with_mode(TransactionMode::Readonly)
|
||||
.build()?
|
||||
.object_store(store)?
|
||||
.get_all_keys()?
|
||||
.into_future()
|
||||
.await
|
||||
.get_all_keys()
|
||||
.primitive()?
|
||||
.await?
|
||||
.collect::<Result<Vec<_>, _>>()
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
|
||||
use crate::WasmStorage;
|
||||
use async_trait::async_trait;
|
||||
use js_sys::Array;
|
||||
use indexed_db_futures::primitive::{TryFromJs, TryToJs};
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde::Serialize;
|
||||
use std::error::Error;
|
||||
use wasm_bindgen::JsValue;
|
||||
|
||||
#[async_trait(?Send)]
|
||||
pub trait BaseWasmStorage {
|
||||
@@ -17,7 +18,7 @@ pub trait BaseWasmStorage {
|
||||
async fn read_value<T, K>(&self, store: &str, key: K) -> Result<Option<T>, Self::StorageError>
|
||||
where
|
||||
T: DeserializeOwned,
|
||||
K: wasm_bindgen::JsCast;
|
||||
K: TryToJs;
|
||||
|
||||
async fn store_value<T, K>(
|
||||
&self,
|
||||
@@ -27,21 +28,21 @@ pub trait BaseWasmStorage {
|
||||
) -> Result<(), Self::StorageError>
|
||||
where
|
||||
T: Serialize,
|
||||
K: wasm_bindgen::JsCast;
|
||||
K: TryToJs + TryFromJs;
|
||||
|
||||
async fn remove_value<K>(&self, store: &str, key: K) -> Result<(), Self::StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast;
|
||||
K: TryToJs;
|
||||
|
||||
async fn has_value<K>(&self, store: &str, key: K) -> Result<bool, Self::StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast;
|
||||
K: TryToJs;
|
||||
|
||||
async fn key_count<K>(&self, store: &str, key: K) -> Result<u32, Self::StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast;
|
||||
K: TryToJs;
|
||||
|
||||
async fn get_all_keys(&self, store: &str) -> Result<js_sys::Array, Self::StorageError>;
|
||||
async fn get_all_keys(&self, store: &str) -> Result<Vec<JsValue>, Self::StorageError>;
|
||||
}
|
||||
|
||||
#[async_trait(?Send)]
|
||||
@@ -55,7 +56,7 @@ impl BaseWasmStorage for WasmStorage {
|
||||
async fn read_value<T, K>(&self, store: &str, key: K) -> Result<Option<T>, Self::StorageError>
|
||||
where
|
||||
T: DeserializeOwned,
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.read_value(store, key).await
|
||||
}
|
||||
@@ -68,33 +69,33 @@ impl BaseWasmStorage for WasmStorage {
|
||||
) -> Result<(), Self::StorageError>
|
||||
where
|
||||
T: Serialize,
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs + TryFromJs,
|
||||
{
|
||||
self.store_value(store, key, value).await
|
||||
}
|
||||
|
||||
async fn remove_value<K>(&self, store: &str, key: K) -> Result<(), Self::StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.remove_value(store, key).await
|
||||
}
|
||||
|
||||
async fn has_value<K>(&self, store: &str, key: K) -> Result<bool, Self::StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.has_value(store, key).await
|
||||
}
|
||||
|
||||
async fn key_count<K>(&self, store: &str, key: K) -> Result<u32, Self::StorageError>
|
||||
where
|
||||
K: wasm_bindgen::JsCast,
|
||||
K: TryToJs,
|
||||
{
|
||||
self.key_count(store, key).await
|
||||
}
|
||||
|
||||
async fn get_all_keys(&self, store: &str) -> Result<Array, Self::StorageError> {
|
||||
async fn get_all_keys(&self, store: &str) -> Result<Vec<JsValue>, Self::StorageError> {
|
||||
self.get_all_keys(store).await
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@ use js_sys::Promise;
|
||||
use std::sync::Arc;
|
||||
use wasm_bindgen::prelude::*;
|
||||
use wasm_bindgen_futures::future_to_promise;
|
||||
use wasm_storage::{IdbVersionChangeEvent, WasmStorage};
|
||||
use wasm_storage::RawDbResult;
|
||||
use wasm_storage::{Build, Database, VersionChangeEvent, WasmStorage};
|
||||
use wasm_utils::check_promise_result;
|
||||
use wasm_utils::error::{PromisableResult, PromisableResultError};
|
||||
use zeroize::Zeroizing;
|
||||
@@ -33,8 +34,8 @@ pub struct ExtensionStorage {
|
||||
}
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
fn db_migration() -> Box<dyn Fn(&IdbVersionChangeEvent) -> Result<(), JsValue>> {
|
||||
Box::new(|evt: &IdbVersionChangeEvent| -> Result<(), JsValue> {
|
||||
fn db_migration() -> Box<dyn Fn(VersionChangeEvent, Database) -> RawDbResult<()>> {
|
||||
Box::new(|evt: VersionChangeEvent, db: Database| -> RawDbResult<()> {
|
||||
// Even if the web-sys bindings expose the version as a f64, the IndexedDB API
|
||||
// works with an unsigned integer.
|
||||
// See <https://github.com/rustwasm/wasm-bindgen/issues/1149>
|
||||
@@ -42,9 +43,7 @@ fn db_migration() -> Box<dyn Fn(&IdbVersionChangeEvent) -> Result<(), JsValue>>
|
||||
|
||||
if old_version < 1 {
|
||||
// migrating to version 1
|
||||
let db = evt.db();
|
||||
|
||||
db.create_object_store(v1::MNEMONICS_STORE)?;
|
||||
db.create_object_store(v1::MNEMONICS_STORE).build()?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -122,7 +121,7 @@ impl ExtensionStorage {
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
async fn get_all_mnemonic_keys_async(&self) -> Result<js_sys::Array, ExtensionStorageError> {
|
||||
async fn get_all_mnemonic_keys_async(&self) -> Result<Vec<JsValue>, ExtensionStorageError> {
|
||||
self.inner
|
||||
.get_all_keys(v1::MNEMONICS_STORE)
|
||||
.await
|
||||
|
||||
Reference in New Issue
Block a user