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
14,267 每月下载量
用于 20 个 crate (7 个直接使用)
120KB
2.5K SLoC
Indexed DB Futures
通过 web_sys 包装 Indexed DB API,以基于 Future 的 API 形式,并移除了在 Rust 中处理 JavaScript 回调的痛苦。
整体 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