idb
A futures based crate for interacting with IndexedDB on browsers using webassembly.
Usage
To use idb
, you need to add the following to your Cargo.toml
:
[dependencies]
idb = "0.5"
Example
To create a new database, you can use [Factory::open
]:
use idb::{Database, Error, Factory};
async fn create_database() -> Result<Database, Error> {
let factory = Factory::new()?;
let mut open_request = factory.open("test", Some(1)).unwrap();
open_request.on_upgrade_needed(|event| {
let database = event.database().unwrap();
let mut store_params = ObjectStoreParams::new();
store_params.auto_increment(true);
store_params.key_path(Some(KeyPath::new_single("id")));
let store = database
.create_object_store("employees", store_params)
.unwrap();
let mut index_params = IndexParams::new();
index_params.unique(true);
store
.create_index("email", KeyPath::new_single("email"), Some(index_params))
.unwrap();
});
open_request.await
}
To add data to an object store, you can use [ObjectStore::add
]:
use idb::{Database, Error};
use serde::Serialize;
use serde_wasm_bindgen::Serializer;
async fn add_data(database: &Database) -> Result<JsValue, Error> {
let transaction = database.transaction(&["employees"], TransactionMode::ReadWrite)?;
let store = transaction.object_store("employees").unwrap();
let employee = serde_json::json!({
"name": "John Doe",
"email": "john@example.com",
});
let id = store
.add(
&employee.serialize(&Serializer::json_compatible()).unwrap(),
None,
)
.unwrap()
.await?;
transaction.commit().await?;
Ok(id)
}
To get data from an object store, you can use [ObjectStore::get
]:
async fn get_data(database: &Database, id: JsValue) -> Result<Option<serde_json::Value>, Error> {
let transaction = database
.transaction(&["employees"], TransactionMode::ReadOnly)
.unwrap();
let store = transaction.object_store("employees").unwrap();
let stored_employee: Option<JsValue> = store.get(id).await?;
let stored_employee: Option<serde_json::Value> = stored_employee
.map(|stored_employee| serde_wasm_bindgen::from_value(stored_employee).unwrap());
transaction.done().await?;
Ok(stored_employee)
}
For more examples on using other functionality, see the
tests directory.
License
Licensed under either of
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as
defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.