#indexed-db #future #idb #indexed

rexie

Rexie is an easy-to-use, futures based wrapper around IndexedDB that compiles to webassembly

10 releases (5 breaking)

0.6.2 Aug 12, 2024
0.6.1 Jul 4, 2024
0.5.0 Sep 7, 2023
0.4.2 Jun 13, 2022
0.3.0 Feb 19, 2022

#145 in WebAssembly

Download history 1828/week @ 2024-07-26 1657/week @ 2024-08-02 2220/week @ 2024-08-09 1812/week @ 2024-08-16 1567/week @ 2024-08-23 2941/week @ 2024-08-30 2577/week @ 2024-09-06 2487/week @ 2024-09-13 3486/week @ 2024-09-20 3482/week @ 2024-09-27 3161/week @ 2024-10-04 1891/week @ 2024-10-11 2637/week @ 2024-10-18 3187/week @ 2024-10-25 2808/week @ 2024-11-01 2504/week @ 2024-11-08

11,401 downloads per month
Used in 42 crates (12 directly)

MIT/Apache

30KB
443 lines

rexie

Rexie is an easy-to-use, futures based wrapper around IndexedDB that compiles to webassembly.

Usage

To use Rexie, you need to add the following to your Cargo.toml:

[dependencies]
rexie = "0.6"

Example

To create a new database, you can use the Rexie::builder method:

use rexie::*;

async fn build_database() -> Result<Rexie> {
   // Create a new database
   let rexie = Rexie::builder("test")
       // Set the version of the database to 1.0
       .version(1)
       // Add an object store named `employees`
       .add_object_store(
           ObjectStore::new("employees")
               // Set the key path to `id`
               .key_path("id")
               // Enable auto increment
               .auto_increment(true)
               // Add an index named `email` with the key path `email` with unique enabled
               .add_index(Index::new("email", "email").unique(true)),
       )
       // Build the database
       .build()
       .await?;

    // Check basic details of the database
    assert_eq!(rexie.name(), "test");
    assert_eq!(rexie.version(), Ok(1));
    assert_eq!(rexie.store_names(), vec!["employees"]);

    Ok(rexie)
}

To add an employee, you can use the Store::add method after creating a Transaction:

use rexie::*;

async fn add_employee(rexie: &Rexie, name: &str, email: &str) -> Result<u32> {
    // Create a new read-write transaction
    let transaction = rexie.transaction(&["employees"], TransactionMode::ReadWrite)?;

    // Get the `employees` store
    let employees = transaction.store("employees")?;

    // Create an employee
    let employee = serde_json::json!({
        "name": name,
        "email": email,
    });
    // Convert it to `JsValue`
    let employee = serde_wasm_bindgen::to_value(&employee).unwrap();

    // Add the employee to the store
    let employee_id = employees.add(&employee, None).await?;

    // Waits for the transaction to complete
    transaction.done().await?;

    // Return the employee id
    Ok(num_traits::cast(employee_id.as_f64().unwrap()).unwrap())
}

To get an employee, you can use the Store::get method after creating a Transaction:

use rexie::*;

async fn get_employee(rexie: &Rexie, id: u32) -> Result<Option<serde_json::Value>> {
    // Create a new read-only transaction
    let transaction = rexie.transaction(&["employees"], TransactionMode::ReadOnly)?;

    // Get the `employees` store
    let employees = transaction.store("employees")?;

    // Get the employee
    let employee = employees.get(id.into()).await?.unwrap();

    // Convert it to `serde_json::Value` from `JsValue`
    let employee: Option<serde_json::Value> = serde_wasm_bindgen::from_value(employee).unwrap();

    // Return the employee
    Ok(employee)
}

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.

Dependencies

~8–10MB
~188K SLoC