An experimental implementation of the WebAssembly System Interface designed to run on Cloudflare Workers
import { WASI } from 'workers-wasi';
import mywasm from './mywasm.wasm';
const wasi = new WASI();
const instance = new WebAssembly.Instance(mywasm, {
wasi_snapshot_preview1: wasi.wasiImport
});
await wasi.start(instance);
nvm use --lts
Build and test
git clone --recursive [email protected]:cloudflare/workers-wasi.git
cd ./workers-wasi
make -j test
git clone --recursive [email protected]:cloudflare/workers-wasi.git
cd ./workers-wasi
cat ./Dockerfile | docker build -t workers-wasi-build -
docker run --rm -it -v $(pwd):/workers-wasi workers-wasi-build
We aim to be interchangeable with other WASI implementations. Integration tests are run locally using Miniflare against the following test suites:
-
(52/52)
https://github.com/caspervonb/wasi-test-suite -
(27/42)
https://github.com/bytecodealliance/wasmtime/tree/main/crates/test-programs/wasi-tests
An ephemeral filesystem implementation built on littlefs is included. Both soft and hard links are not yet supported.
The following syscalls are not yet supported and return ENOSYS
fd_readdir
path_link
path_readlink
path_symlink
poll_oneoff
sock_recv
sock_send
sock_shutdown
Timestamps are captured using Date.now()
which has unique behavior on the Workers platform for security reasons. This affects the implementation of
clock_res_get
clock_time_get
fd_filestat_set_times
path_filestat_set_times
Misc TODO:
- path_rename (update old path for existing open fds)
- clean up tmp_alloc() - wrap all exports
- fix preopens interface (use object), and update options docs
- document difference between nodejs options and ours (streams/fs)
- complete memfs.cc todos
- fd_close (stdio)
- fd_renumber (stdio)
- fd_read/fd_write does not work with renumbering stdio
- update file timestamps appropriately