77 releases (46 stable)

new 17.0.2 Feb 28, 2024
17.0.0 Jan 25, 2024
16.0.0 Dec 20, 2023
15.0.1 Dec 1, 2023
0.25.0 Mar 16, 2021

#1380 in WebAssembly

Download history 16861/week @ 2023-11-07 14130/week @ 2023-11-14 11986/week @ 2023-11-21 14713/week @ 2023-11-28 17909/week @ 2023-12-05 20679/week @ 2023-12-12 15197/week @ 2023-12-19 10081/week @ 2023-12-26 18337/week @ 2024-01-02 21270/week @ 2024-01-09 25947/week @ 2024-01-16 21164/week @ 2024-01-23 24356/week @ 2024-01-30 21729/week @ 2024-02-06 20059/week @ 2024-02-13 19423/week @ 2024-02-20

90,089 downloads per month
Used in 40 crates (8 directly)

Apache-2.0 WITH LLVM-exception

7.5K SLoC

WASI implementation in Rust, using cap-std.


The wasi-cap-std-sync crate provides impl of WasiFile and WasiDir in terms of cap_std::fs::{File, Dir}. These types provide sandboxed access to the local filesystem on both Unix and Windows.

All syscalls are hidden behind the cap-std hierarchy, with the lone exception of the sched implementation, which is provided for both unix and windows in separate modules.

Any wasi_common::{WasiCtx, WasiCtxBuilder} is interoperable with the wasi-cap-std-sync crate. However, for convenience, wasi-cap-std-sync provides its own WasiCtxBuilder that hooks up to all of the crate's components, i.e. it fills in all of the arguments to WasiCtx::builder(...), presents preopen_dir in terms of cap_std::fs::Dir, and provides convenience methods for inheriting the parent process's stdio, args, and env.

For the convenience of consumers, cap_std::fs::Dir is re-exported from this crate. This saves consumers tracking an additional dep on the exact version of cap_std used by this crate, if they want to avoid it.

The only place we expect to run into long-term compatibility issues between wasi-cap-std-sync and the other impl crates that will come later is in the Sched abstraction. Once we can build an async scheduler based on Rust Futures, async impls will be able to interoperate, but the synchronous scheduler depends on downcasting the WasiFile type down to concrete types it knows about (which in turn impl AsFd for passing to unix poll, or the analogous traits on windows).

Why is this impl suffixed with -sync? Because async is coming soon! The async impl may end up depending on tokio or other relatively heavy deps, so we will retain a sync implementation so that wasi-common users have an option of not pulling in an async runtime.


~416K SLoC