sal-modular/kvstore
Sameh Abouelsaad cea2d7e655 feat: Refactor kvstore and vault to use features and logging
- 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.
2025-05-15 16:42:19 +03:00
..
src feat: Refactor kvstore and vault to use features and logging 2025-05-15 16:42:19 +03:00
tests feat: Add basic project structure and initial crates 2025-05-13 20:24:29 +03:00
Cargo.toml feat: Refactor kvstore and vault to use features and logging 2025-05-15 16:42:19 +03:00
README.md feat: Add basic project structure and initial crates 2025-05-13 20:24:29 +03:00

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 with tokio::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