5.8 KiB
ruvector-wasm Integration Status
Summary
The ruvector-wasm crate has been updated to integrate ruvector-collections and ruvector-filter functionality. However, compilation is currently blocked by pre-existing issues in ruvector-core.
Changes Made
1. Cargo.toml Updates
Added Dependencies:
ruvector-collections = { path = "../ruvector-collections", optional = true }
ruvector-filter = { path = "../ruvector-filter", optional = true }
getrandom02 = { package = "getrandom", version = "0.2", features = ["js"] }
Added Features:
[features]
collections = ["dep:ruvector-collections", "dep:ruvector-filter"]
WASM Configuration:
[target.'cfg(target_arch = "wasm32")'.dependencies]
getrandom = { workspace = true, features = ["wasm_js"] }
2. src/lib.rs Updates
Added CollectionManager (Lines 411-587):
new(base_path: Option<String>)- Create collection managercreate_collection(name, dimensions, metric)- Create new collectionlist_collections()- List all collectionsdelete_collection(name)- Delete a collectionget_collection(name)- Get collection's VectorDBcreate_alias(alias, collection)- Create an aliasdelete_alias(alias)- Delete an aliaslist_aliases()- List all aliases
Added FilterBuilder (Lines 591-799):
eq(field, value)- Equality filterne(field, value)- Not-equal filtergt(field, value)- Greater-than filtergte(field, value)- Greater-than-or-equal filterlt(field, value)- Less-than filterlte(field, value)- Less-than-or-equal filterin_values(field, values)- IN filtermatch_text(field, text)- Text match filtergeo_radius(field, lat, lon, radius_m)- Geo radius filterand(filters)- AND combinatoror(filters)- OR combinatornot(filter)- NOT combinatorexists(field)- Field exists filteris_null(field)- Field is null filterto_json()- Convert to JavaScript objectget_fields()- Get referenced field names
Current Issues
Compilation Blockers
The ruvector-core crate has conditional compilation issues that prevent WASM builds:
- redb dependency: Code in
error.rsusesredbtypes without#[cfg(feature = "storage")]guards - hnsw_rs dependency: Code in
index/hnsw.rsuseshnsw_rswithout#[cfg(feature = "hnsw")]guards - uuid dependency: Some code uses
uuid::Uuidwithout proper feature guards
Architectural Limitations
Collections and Filter in WASM: The ruvector-collections crate relies on file I/O and memory-mapped files (via mmap-rs), which are not available in browser WASM environments. These features are marked as optional and require the collections feature to be enabled.
Usage
Standard WASM Build (Browser):
cd crates/ruvector-wasm
cargo build --target wasm32-unknown-unknown --release
This builds only the core VectorDB functionality without collections or filter support.
WASM with Collections (WASI/Server):
cargo build --target wasm32-unknown-unknown --release --features collections
Note: This requires a WASM runtime with file system support (e.g., WASI) and will not work in browsers.
JavaScript API Examples
CollectionManager:
import { CollectionManager } from 'ruvector-wasm';
// Create manager
const manager = new CollectionManager();
// Create collection
manager.createCollection("documents", 384, "cosine");
// List collections
const collections = manager.listCollections();
// Create alias
manager.createAlias("current_docs", "documents");
// Get collection
const db = manager.getCollection("current_docs");
// Use the VectorDB
const id = db.insert(vector, "doc1", { title: "Hello" });
FilterBuilder:
import { FilterBuilder } from 'ruvector-wasm';
// Simple equality filter
const filter1 = FilterBuilder.eq("status", "active");
// Complex filter
const filter2 = FilterBuilder.and([
FilterBuilder.eq("status", "active"),
FilterBuilder.or([
FilterBuilder.gte("age", 18),
FilterBuilder.lt("priority", 10)
])
]);
// Geo filter
const filter3 = FilterBuilder.geoRadius(
"location",
40.7128, // latitude
-74.0060, // longitude
1000 // radius in meters
);
// Convert to JSON for use with search
const filterJson = filter.toJson();
const results = db.search(queryVector, 10, filterJson);
Required Fixes
To make this fully functional, the following changes are needed in ruvector-core:
1. Add cfg guards to error.rs:
#[cfg(feature = "storage")]
impl From<redb::Error> for RuvectorError {
// ...
}
2. Add cfg guards to index/hnsw.rs:
#[cfg(feature = "hnsw")]
use hnsw_rs::prelude::*;
#[cfg(feature = "hnsw")]
pub struct HnswIndex {
// ...
}
3. Ensure memory-only feature works:
The memory-only feature should be a complete alternative that doesn't require redb or hnsw_rs.
Files Modified
/home/user/ruvector/crates/ruvector-wasm/Cargo.toml/home/user/ruvector/crates/ruvector-wasm/src/lib.rs/home/user/ruvector/Cargo.toml(attempted patch section, later removed)
Verification
Once ruvector-core's conditional compilation issues are fixed, verify with:
# Check basic WASM build
cargo check --target wasm32-unknown-unknown
# Check with collections feature (requires WASI)
cargo check --target wasm32-unknown-unknown --features collections
# Build release
cargo build --target wasm32-unknown-unknown --release
# Run WASM tests
wasm-pack test --node
Next Steps
- Fix ruvector-core conditional compilation issues
- Add proper cfg guards for all optional dependencies
- Test WASM builds with and without collections feature
- Add WASM-specific tests for CollectionManager and FilterBuilder
- Document WASI requirements for collections feature
- Consider creating a pure in-memory alternative to collections for browser use