#indexed-db #idb #future

idb-sys

一个基于回调的库,用于在浏览器中使用 WebAssembly 与 IndexedDB 交互

6 个版本

0.2.2 2024 年 1 月 16 日
0.2.1 2023 年 3 月 11 日
0.2.0 2023 年 1 月 3 日
0.1.2 2022 年 12 月 12 日
0.1.0 2022 年 7 月 7 日

#648WebAssembly

Download history 333/week @ 2024-04-22 75/week @ 2024-04-29 5/week @ 2024-05-06 12/week @ 2024-05-13 11/week @ 2024-05-20 4/week @ 2024-05-27 10/week @ 2024-06-03 10/week @ 2024-06-10 43/week @ 2024-06-17 30/week @ 2024-06-24 55/week @ 2024-07-01 67/week @ 2024-07-08 97/week @ 2024-07-15 49/week @ 2024-07-22 129/week @ 2024-07-29 75/week @ 2024-08-05

每月 355 次下载

MIT/Apache

79KB
1.5K SLoC

idb

一个基于 futures 的库,用于在浏览器中使用 WebAssembly 与 IndexedDB 交互。

用法

要使用 idb,您需要将以下内容添加到您的 Cargo.toml

[dependencies]
idb = "0.5"

示例

要创建一个新数据库,您可以使用 Factory::open

use idb::{Database, Error, Factory};

async fn create_database() -> Result<Database, Error> {
    // Get a factory instance from global scope
    let factory = Factory::new()?;

    // Create an open request for the database
    let mut open_request = factory.open("test", Some(1)).unwrap();

    // Add an upgrade handler for database
    open_request.on_upgrade_needed(|event| {
        // Get database instance from event
        let database = event.database().unwrap();

        // Prepare object store params
        let mut store_params = ObjectStoreParams::new();
        store_params.auto_increment(true);
        store_params.key_path(Some(KeyPath::new_single("id")));

        // Create object store
        let store = database
            .create_object_store("employees", store_params)
            .unwrap();

        // Prepare index params
        let mut index_params = IndexParams::new();
        index_params.unique(true);

        // Create index on object store
        store
            .create_index("email", KeyPath::new_single("email"), Some(index_params))
            .unwrap();
    });

    // `await` open request
    open_request.await
}

要将数据添加到对象存储,您可以使用 ObjectStore::add

use idb::{Database, Error};
use serde::Serialize;
use serde_wasm_bindgen::Serializer;

async fn add_data(database: &Database) -> Result<JsValue, Error> {
    // Create a read-write transaction
    let transaction = database.transaction(&["employees"], TransactionMode::ReadWrite)?;

    // Get the object store
    let store = transaction.object_store("employees").unwrap();

    // Prepare data to add
    let employee = serde_json::json!({
        "name": "John Doe",
        "email": "[email protected]",
    });

    // Add data to object store
    let id = store
        .add(
            &employee.serialize(&Serializer::json_compatible()).unwrap(),
            None,
        )
        .unwrap()
        .await?;

    // Commit the transaction
    transaction.commit().await?;

    Ok(id)
}

要从对象存储获取数据,您可以使用 ObjectStore::get

async fn get_data(database: &Database, id: JsValue) -> Result<Option<serde_json::Value>, Error> {
    // Create a read-only transaction
    let transaction = database
        .transaction(&["employees"], TransactionMode::ReadOnly)
        .unwrap();

    // Get the object store
    let store = transaction.object_store("employees").unwrap();

    // Get the stored data
    let stored_employee: Option<JsValue> = store.get(id).await?;

    // Deserialize the stored data
    let stored_employee: Option<serde_json::Value> = stored_employee
        .map(|stored_employee| serde_wasm_bindgen::from_value(stored_employee).unwrap());

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

    Ok(stored_employee)
}

有关其他功能使用的更多示例,请参阅 测试目录

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的您提交的任何有意包含在作品中的贡献,均应按上述方式双重许可,无需任何额外条款或条件。

依赖关系

~7–9.5MB
~178K SLoC