Use this file to discover all available pages before exploring further.
OpenMLS can be compiled to WebAssembly (Wasm) and run in browsers or Node.js environments. However, Wasm doesn’t provide certain required functionality, so OpenMLS needs access to JavaScript APIs for randomness and time.
OpenMLS requires two features not provided by WebAssembly itself:
Secure randomness - Cryptographically secure random number generation
Current time - Access to system time for various operations
These must be provided by the JavaScript runtime (browser or Node.js) through the web_sys crate.
Currently, OpenMLS WebAssembly support requires a JavaScript runtime with common Web APIs. Pure Wasm runtimes without JavaScript bindings are not yet supported.
The getrandom crate provides cryptographically secure randomness using JavaScript APIs:
// In Rust code (automatically handled by OpenMLS)use getrandom::getrandom;let mut buffer = [0u8; 32];getrandom(&mut buffer).expect("Failed to generate random bytes");
This uses:
Browsers: window.crypto.getRandomValues()
Node.js: crypto.randomBytes()
Ensure your JavaScript environment supports crypto.getRandomValues() (browsers) or crypto.randomBytes() (Node.js). Most modern environments do.
The fluvio-wasm-timer crate provides time functionality:
// Automatically handled by OpenMLS when js feature is enableduse std::time::{SystemTime, Duration};let now = SystemTime::now();let timestamp = now.duration_since(SystemTime::UNIX_EPOCH).unwrap();
// Save key package to localStorageconst keyPackageBytes = keyPackage.serialize();localStorage.setItem('keyPackage', JSON.stringify(Array.from(keyPackageBytes)));// Load key package from localStorageconst storedBytes = JSON.parse(localStorage.getItem('keyPackage'));const keyPackage = openmls.deserialize_key_package(new Uint8Array(storedBytes));
For larger data, use IndexedDB:
// Store group state in IndexedDBconst db = await openDatabase();const tx = db.transaction('groups', 'readwrite');await tx.objectStore('groups').put({ id: group.group_id(), state: group.serialize()});