41 releases
Uses new Rust 2024
| new 0.4.6 | May 12, 2026 |
|---|---|
| 0.4.5 | May 10, 2026 |
| 0.3.9 | May 9, 2026 |
| 0.2.17 | May 3, 2026 |
| 0.1.1 | Oct 22, 2025 |
#371 in WebAssembly
705KB
17K
SLoC
wasi-virt-layer
WASI Virtual Layer is a virtual file system layer for WebAssembly System Interface (WASI) modules. It allows you to run WASI modules with a virtual file system that can be customized and extended.
example usage
- Install the CLI tool with
cargo binstall wasi_virt_layer-cli
- Prepare a WebAssembly module built for wasip1 (e.g. wasm32-wasip1 or wasm32-wasip1-threads).
- Create a new virtual filesystem (VFS) project with
wasi_virt_layer new my_vfs_project
This will automatically set up Cargo.toml with crate-type = ["cdylib"] and the necessary dependencies (wasi_virt_layer, wit-bindgen), as well as a basic wit directory and template source code.
3. Edit your VFS implementation. Use the import_wasm! macro to prepare for using the target wasm module.
4. Use the plug! macro series (plug_process!, plug_env!, plug_fs!, plug_random!, plug_sched!, etc.) to connect to the wasip1 ABI, and link virtual filesystems or virtual environment variables.
5. Run the build command
wasi_virt_layer build <wasm_path>
to execute the virtualization process. Note: use -p <package_name> if your VFS project is part of a workspace.
6. The built files (including the transpiled JavaScript if applicable) will be generated in the dist directory.
7. Run it with Deno or Node.js:
deno run dist/test_run.ts
or start a static server and open test_run.html in your browser.
As a component
By using plug! to block all WASIp1 ABIs and creating the ABI solely with wit-bindgen, it is entirely possible to treat it as a component. However, wasip1-threads is not supported as per the specification. For further details, please refer to the example.
TODO!
- Support non-binary Wasm modules (e.g., .wat files)
- Enable specifying multiple Wasm modules
- Support
selfis not passed inplug_thread!(make it optional) - Support self binary (improved
import_wasm!(self)and CLI integration) - Support
flush/syncto virtual file system - Fake global allocator and center allocator and merge with VFS
- Access Time Trait (expose to WASI ABI)
- Multiple LFS file system (VFS)
- Static file system (Embedded VFS)
- Feature: Access time and other stat traits
- Separate mode (connecting functions via JavaScript/Host)
- Threading VFS with non-threading WASM target
- Validator with detailed error reporting on thread mismatches
- Full Unicode support for paths (currently assumes Latin-1 bytes)
- Async WIT support
run example
cargo r -r -- -p example_vfs examples/test_wasm/example/test_wasm_opt.wasm
cargo r -r -- -p threads_vfs test_threads -t single --threads true
cannot
- support wasm-bindgen because it cannot use wasi
non goal
goal
development
install cargo binstall cargo-nextest -y
install deno
cargo nextest run -r --fail-fast
Notes and Caveats
- Thread & Memory Modes:
single_memorymode can sometimes fail in scenarios wheremulti_memorysucceeds. A sequence like_reset(); _start(); _main();in multi-threaded environments has been observed to trigger issues in single-memory mode. - Build Cache: The build process may benefit from a
--no-cacheoption (currently a TODO) if the target directory caching causes stale builds. - Concurrency: The CLI implements file-based locking to prevent collisions during parallel builds.
- CLI Arguments: Very long argument lists might still cause issues in some environments.
- Self-Calling Fallback: The tool supports a fallback mechanism for tools like
wasm-mergeandwasm-optby calling itself if the binaries are not found in the PATH. - Dynamic Wasm from JS: The capability to add Wasm modules from JavaScript is currently in early development and does not work reliably.
Multi-threading execution order
- single_memory: known failures in some configurations.
- multi_memory: generally stable.
- VFS -> Target Module: Success
- Target Module -> Target Module: Success
- VFS -> VFS: Success
lib.rs:
wasi_virt_layer provides a virtualization layer for WebAssembly System Interface (WASI).
This crate facilitates merging a Virtual File System (VFS) and threading mechanisms into standard WASI modules without modifying their source code in complex ways. It allows a host environment (like browsers via JavaScript bindings) to seamlessly interact with in-memory Wasm modules.
Core Concepts
- Virtual File System (VFS): Overrides filesystem-related WASI calls to a custom virtualized implementation.
- Threading: Provides components that patch how Wasm spawns and manages threads using shared memory.
- Memory Bridge: Manages memory boundaries and host-guest interaction.
Dependencies
~1.4–2.9MB
~52K SLoC