#indexed-db #future #store-key #idb #key-value-store

indexed_db_futures

通过 web_sys 的 IndexedDB 的 Future 绑定

12 个不稳定版本 (4 个破坏性更改)

0.5.0 2024 年 7 月 26 日
0.4.1 2023 年 10 月 29 日
0.3.0 2022 年 12 月 3 日
0.2.3 2022 年 2 月 9 日
0.1.0 2021 年 7 月 25 日

#23 in WebAssembly

Download history 2985/week @ 2024-05-01 2640/week @ 2024-05-08 2624/week @ 2024-05-15 3007/week @ 2024-05-22 2633/week @ 2024-05-29 2696/week @ 2024-06-05 3179/week @ 2024-06-12 2767/week @ 2024-06-19 3404/week @ 2024-06-26 3518/week @ 2024-07-03 3720/week @ 2024-07-10 3844/week @ 2024-07-17 4275/week @ 2024-07-24 3669/week @ 2024-07-31 2908/week @ 2024-08-07 2692/week @ 2024-08-14

14,267 每月下载量
用于 20 个 crate (7 个直接使用)

MIT 许可证

120KB
2.5K SLoC

Indexed DB Futures

通过 web_sys 包装 Indexed DB API,以基于 Future 的 API 形式,并移除了在 Rust 中处理 JavaScript 回调的痛苦。

master CI badge crates.io badge docs.rs badge dependencies badge

整体 API 设计

在大多数情况下,API 方法将返回一个包含包装的 IdbRequest(它实现了 IntoFuture,例如 VoidRequest)的结果,或者在更合适的情况下,直接返回 Future,例如 CountFuture

包装请求与 Future 之间的主要区别是请求没有附加任何事件监听器,这旨在使向 IdbObjectStore 插入多个记录等快速操作更加高效。

特性

对于只需要类似 localStorage 的简单键值存储的应用程序,库可以不带游标或索引支持进行打包。

  • cursors - 启用游标支持
  • indices - 启用索引支持
  • nightly - 在适当的地方使用不安全的 nightly 功能,例如 unwrap_unchecked
  • 默认值:
    • cursors
    • indices

示例

连接到数据库并进行基本的 CRUD 操作

包含变量类型以供清晰。

use indexed_db_futures::prelude::*;

pub async fn example() -> Result<(), DomException> {
    // Open my_db v1
    let mut db_req: OpenDbRequest = IdbDatabase::open_u32("my_db", 1)?;
    db_req.set_on_upgrade_needed(Some(|evt: &IdbVersionChangeEvent| -> Result<(), JsValue> {
        // Check if the object store exists; create it if it doesn't
        if let None = evt.db().object_store_names().find(|n| n == "my_store") {
            evt.db().create_object_store("my_store")?;
        }
        Ok(())
    }));

    let db: IdbDatabase = db_req.await?;

    // Insert/overwrite a record
    let tx: IdbTransaction = db
      .transaction_on_one_with_mode("my_store", IdbTransactionMode::Readwrite)?;
    let store: IdbObjectStore = tx.object_store("my_store")?;

    let value_to_put: JsValue = get_some_js_value();
    store.put_key_val_owned("my_key", &value_to_put)?;

    // IDBTransactions can have an Error or an Abort event; into_result() turns both into a
    // DOMException
    tx.await.into_result()?;

    // Delete a record
    let tx = db.transaction_on_one_with_mode("my_store", IdbTransactionMode::Readwrite)?;
    let store = tx.object_store("my_store")?;
    store.delete_owned("my_key")?;
    tx.await.into_result()?;

    // Get a record
    let tx = db.transaction_on_one("my_store")?;
    let store = tx.object_store("my_store")?;

    let value: Option<JsValue> = store.get_owned("my_key")?.await?;
    use_value(value);

    Ok(())
}

依赖关系

~7–10MB
~185K SLoC