Files

@ruvector/wasm

WebAssembly bindings for Ruvector - High-performance vector database for browsers and Node.js.

Features

  • 🚀 High Performance: SIMD-accelerated vector operations
  • 🌐 Universal: Works in browsers and Node.js
  • 🎯 Multiple Distance Metrics: Cosine, Euclidean, Dot Product, Manhattan
  • 🔍 Fast Search: HNSW indexing for approximate nearest neighbor search
  • 💾 Persistent Storage: IndexedDB (browser) and file system (Node.js)
  • 🦀 Rust-powered: Built with Rust and WebAssembly

Installation

npm install @ruvector/wasm

Quick Start

Browser

import { VectorDB } from '@ruvector/wasm/browser';

// Create database
const db = new VectorDB({ dimensions: 128 });
await db.init();

// Insert vectors
const vector = new Float32Array(128).fill(0.5);
const id = db.insert(vector, 'my-vector', { label: 'example' });

// Search
const results = db.search(vector, 10);
console.log(results);

// Save to IndexedDB
await db.saveToIndexedDB();

Node.js

import { VectorDB } from '@ruvector/wasm/node';

// Create database
const db = new VectorDB({ dimensions: 128 });
await db.init();

// Insert vectors
const vector = new Float32Array(128).fill(0.5);
const id = db.insert(vector, 'my-vector', { label: 'example' });

// Search
const results = db.search(vector, 10);
console.log(results);

Universal (Auto-detect)

import { VectorDB } from '@ruvector/wasm';

// Works in both browser and Node.js
const db = new VectorDB({ dimensions: 128 });
await db.init();

const vector = new Float32Array(128).fill(0.5);
const id = db.insert(vector);
const results = db.search(vector, 10);

API Reference

VectorDB

Constructor

new VectorDB(options: DbOptions)

Options:

  • dimensions: number - Vector dimensions (required)
  • metric?: 'euclidean' | 'cosine' | 'dotproduct' | 'manhattan' - Distance metric (default: 'cosine')
  • useHnsw?: boolean - Use HNSW index (default: true)

Methods

init()

Initialize the database (must be called before use).

await db.init(): Promise<void>
insert()

Insert a single vector.

db.insert(
  vector: Float32Array | number[],
  id?: string,
  metadata?: Record<string, any>
): string
insertBatch()

Insert multiple vectors efficiently.

db.insertBatch(entries: VectorEntry[]): string[]

Search for similar vectors.

db.search(
  query: Float32Array | number[],
  k: number,
  filter?: Record<string, any>
): SearchResult[]
delete()

Delete a vector by ID.

db.delete(id: string): boolean
get()

Get a vector by ID.

db.get(id: string): VectorEntry | null
len()

Get the number of vectors.

db.len(): number
isEmpty()

Check if database is empty.

db.isEmpty(): boolean
getDimensions()

Get vector dimensions.

db.getDimensions(): number
save()

Save database to persistent storage.

await db.save(path?: string): Promise<void>

Utility Functions

detectSIMD()

Check if SIMD is supported.

const hasSIMD = await detectSIMD();

version()

Get library version.

const ver = await version();

benchmark()

Run performance benchmark.

const opsPerSec = await benchmark('insert', 1000, 128);

Types

VectorEntry

interface VectorEntry {
  id?: string;
  vector: Float32Array | number[];
  metadata?: Record<string, any>;
}

SearchResult

interface SearchResult {
  id: string;
  score: number;
  vector?: Float32Array;
  metadata?: Record<string, any>;
}

DbOptions

interface DbOptions {
  dimensions: number;
  metric?: 'euclidean' | 'cosine' | 'dotproduct' | 'manhattan';
  useHnsw?: boolean;
}

Performance

Ruvector WASM delivers exceptional performance:

  • SIMD Acceleration: Up to 4x faster with WebAssembly SIMD
  • HNSW Index: Sub-linear search complexity
  • Zero-copy: Efficient memory usage with transferable objects
  • Batch Operations: Optimized bulk inserts

Browser Compatibility

  • Chrome 91+ (SIMD support)
  • Firefox 89+ (SIMD support)
  • Safari 16.4+ (SIMD support)
  • Edge 91+ (SIMD support)

License

MIT