From e60349604d49efbb0bd0fc4b1cd5b9f115f685ed Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Thu, 18 Nov 2021 12:40:45 +0100 Subject: [PATCH] implement custom value --- .../src/store/indexeddb_store/mod.rs | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/crates/matrix-sdk-base/src/store/indexeddb_store/mod.rs b/crates/matrix-sdk-base/src/store/indexeddb_store/mod.rs index 376096498..d6766dabb 100644 --- a/crates/matrix-sdk-base/src/store/indexeddb_store/mod.rs +++ b/crates/matrix-sdk-base/src/store/indexeddb_store/mod.rs @@ -804,25 +804,35 @@ impl IndexeddbStore { } async fn get_custom_value(&self, key: &[u8]) -> Result>> { - todo!() - // Ok(self.inner - // .transaction_on_one_with_mode(KEYS::CUSTOM, IdbTransactionMode::Readonly)? - // .object_store(KEYS::CUSTOM)? - // .get(&JsValue::from_str(key))? - // .await? - // .map(|f| self.deserialize_event(f)) - // .transpose()?) + let jskey = &JsValue::from_str( + core::str::from_utf8(key).map_err(|e| StoreError::Codec(format!("{:}", e)))?); + self.get_custom_value_for_js(&jskey).await + } + + async fn get_custom_value_for_js(&self, jskey: &JsValue) -> Result>> { + Ok(self.inner + .transaction_on_one_with_mode(KEYS::CUSTOM, IdbTransactionMode::Readonly)? + .object_store(KEYS::CUSTOM)? + .get(jskey)? + .await? + .map(|f| self.deserialize_event(f)) + .transpose()?) } async fn set_custom_value(&self, key: &[u8], value: Vec) -> Result>> { - todo!() - // let tx = self.inner - // .transaction_on_one_with_mode(KEYS::MEDIA, IdbTransactionMode::Readwrite)?; + let jskey = JsValue::from_str( + core::str::from_utf8(key).map_err(|e| StoreError::Codec(format!("{:}", e)))?); - // tx.object_store(KEYS::MEDIA)? - // .put_key_val(&JsValue::from_str(&key), &self.serialize_event(&value)?)?; + let prev = self.get_custom_value_for_js(&jskey).await?; - // tx.await.into_result().map_err(|e| e.into()) + let tx = self.inner + .transaction_on_one_with_mode(KEYS::CUSTOM, IdbTransactionMode::Readwrite)?; + + tx.object_store(KEYS::CUSTOM)? + .put_key_val(&jskey, &self.serialize_event(&value)?)?; + + tx.await.into_result().map_err::(|e| e.into())?; + Ok(prev) } async fn remove_media_content(&self, request: &MediaRequest) -> Result<()> { @@ -1239,14 +1249,14 @@ mod test { #[async_test] async fn test_custom_storage() { - // let key = "my_key"; - // let value = &[0, 1, 2, 3]; - // let store = IndexeddbStore::open().await.unwrap(); + let key = "my_key"; + let value = &[0, 1, 2, 3]; + let store = IndexeddbStore::open().await.unwrap(); - // store.set_custom_value(key.as_bytes(), value.to_vec()).await.unwrap(); + store.set_custom_value(key.as_bytes(), value.to_vec()).await.unwrap(); - // let read = store.get_custom_value(key.as_bytes()).await.unwrap(); + let read = store.get_custom_value(key.as_bytes()).await.unwrap(); - // assert_eq!(Some(value.as_ref()), read.as_deref()); + assert_eq!(Some(value.as_ref()), read.as_deref()); } }