- Remove hardcoded dependencies in kvstore Cargo.toml; use features instead. This allows for more flexible compilation for different targets (native vs. WASM). - Improve logging in vault crate using the `log` crate. This makes debugging easier and provides more informative output during execution. Native tests use `env_logger`, WASM tests use `console_log`. - Update README to reflect new logging best practices. - Add cfg attributes to native and wasm modules to improve clarity. - Update traits.rs to specify Send + Sync behavior expectations. |
||
---|---|---|
.. | ||
src | ||
tests | ||
Cargo.toml | ||
README.md |
kvstore: Async Key-Value Store for Native and WASM
kvstore
provides a runtime-agnostic, async trait for key-value storage, with robust implementations for both native (using sled
) and browser/WASM (using IndexedDB via the idb
crate) environments.
Features
- Unified async trait: Same API for all platforms. Methods:
get
,set
,remove
,contains_key
,keys
,clear
. - Native backend: Uses
sled
for fast, embedded storage. Blocking I/O is offloaded withtokio::task::spawn_blocking
. - WASM backend: Uses IndexedDB via the
idb
crate for browser storage. Fully async and Promise-based. - Error handling: Consistent error types across platforms.
- Conditional compilation: Uses Cargo features and
cfg
to select the backend.
Usage
Add to your Cargo.toml
:
[dependencies]
kvstore = { path = "../kvstore" }
Example
use kvstore::{KVStore, NativeStore};
#[tokio::main]
async fn main() {
let store = NativeStore::open("/tmp/mydb").unwrap();
store.set("foo", b"bar").await.unwrap();
let val = store.get("foo").await.unwrap();
println!("Got: {:?}", val);
}
For WASM/browser, use WasmStore
and run in a browser environment.
Testing
Native
cargo test -p kvstore --features native
WASM (browser)
cd kvstore
wasm-pack test --headless --firefox --features web
Architecture
- See
../docs/Architecture.md
for full design details.
License
MIT OR Apache-2.0