Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

WASM Search

ABCrimson edited this page Mar 11, 2026 · 2 revisions

WASM Search

Optional Rust-compiled trigram index for sub-millisecond fuzzy search on 100K+ items.

Installation

pnpm add modern-cmdk-search-wasm

Main Thread Mode

import { createWasmSearchEngine } from 'modern-cmdk-search-wasm';
// await using for automatic cleanup
await using engine = await createWasmSearchEngine();
engine.index(items);
const results = engine.search('query', items).toArray();

Web Worker Mode

For non-blocking UI with large datasets:

import { createWorkerWasmSearchEngine } from 'modern-cmdk-search-wasm';
await using engine = await createWorkerWasmSearchEngine();
engine.index(items);
const results = engine.search('query', items).toArray();

Cross-Origin Isolation

Worker mode with SharedArrayBuffer requires these HTTP headers:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Without these headers, the worker falls back to postMessage with structured cloning.

Plugging into the State Machine

import { createCommandMachine } from 'modern-cmdk';
import { createWasmSearchEngine } from 'modern-cmdk-search-wasm';
const wasmEngine = await createWasmSearchEngine();
using machine = createCommandMachine({
 items,
 search: wasmEngine, // Pluggable search interface
});

Rust Crate

The WASM module is built from a Rust crate at packages/command-search-wasm/crate/:

  • trigram.rs — Trigram index construction and lookup
  • scorer.rs — Fuzzy scoring algorithm
  • lib.rs — wasm-bindgen bindings

Performance Comparison

Operation JS Scorer WASM (Main Thread) WASM (Worker)
Index 10K ~5ms ~2ms ~2ms (off-thread)
Search 10K ~5ms ~0.8ms ~0.8ms (off-thread)
Search 100K ~50ms ~3ms ~3ms (off-thread)

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /