Stability: 1 - Experimental

    The WASI API provides an implementation of the [WebAssembly System Interface][] specification. WASI gives sandboxed WebAssembly applications access to the underlying operating system via a collection of POSIX-like functions.

    1. 'use strict';
    2. const fs = require('fs');
    3. const { WASI } = require('wasi');
    4. const wasi = new WASI({
    5. args: process.argv,
    6. env: process.env,
    7. preopens: {
    8. '/sandbox': '/some/real/path/that/wasm/can/access'
    9. }
    10. });
    11. const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
    12. (async () => {
    13. const wasm = await WebAssembly.compile(fs.readFileSync('./demo.wasm'));
    14. const instance = await WebAssembly.instantiate(wasm, importObject);
    15. wasi.start(instance);
    16. })();

    To run the above example, create a new WebAssembly text format file named demo.wat:

    1. (module
    2. ;; Import the required fd_write WASI function which will write the given io vectors to stdout
    3. ;; The function signature for fd_write is:
    4. ;; (File Descriptor, *iovs, iovs_len, nwritten) -> Returns number of bytes written
    5. (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))
    6. (memory 1)
    7. (export "memory" (memory 0))
    8. ;; Write 'hello world\n' to memory at an offset of 8 bytes
    9. ;; Note the trailing newline which is required for the text to appear
    10. (data (i32.const 8) "hello world\n")
    11. (func $main (export "_start")
    12. ;; Creating a new io vector within linear memory
    13. (i32.store (i32.const 0) (i32.const 8)) ;; iov.iov_base - This is a pointer to the start of the 'hello world\n' string
    14. (i32.store (i32.const 4) (i32.const 12)) ;; iov.iov_len - The length of the 'hello world\n' string
    15. (call $fd_write
    16. (i32.const 1) ;; file_descriptor - 1 for stdout
    17. (i32.const 0) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
    18. (i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
    19. (i32.const 20) ;; nwritten - A place in memory to store the number of bytes written
    20. )
    21. drop ;; Discard the number of bytes written from the top of the stack
    22. )
    23. )

    Use wabt to compile .wat to .wasm

    1. $ wat2wasm demo.wat

    The --experimental-wasi-unstable-preview1 and --experimental-wasm-bigint CLI arguments are needed for this example to run.