preveen-stack / nodejs

0 stars 0 forks source link

uvwasi example #12

Open preveen-stack opened 2 months ago

preveen-stack commented 2 months ago
sh-3.2$ cat file.wat 
// file.wat

(module
  (import "uvwasi_snapshot_preview1" "fd_read" (func $fd_read (param i32 i32 i32 i32) (result i32)))
  (memory 1)
  (data (i32.const 0) "Hello, world!")
  (export "read_file" (func $read_file))
)
sh-3.2$ cat ex-uvwasi.js 
const fs = require('fs');
const uvwasi = require('uvwasi');
const { WASI } = require('wasi');

async function main() {
  const module = await WebAssembly.compile(fs.readFileSync('./file.wasm'));

  const wasi = new WASI({
    preopens: {
      '/sandbox': './sandbox'
    },
    args: [ './file.wasm' ]
  });

  const importObject = {
    uvwasi_snapshot_preview1: uvwasi.snapshot_preview1
  };

  const instance = await WebAssembly.instantiate(module, {
    ...importObject,
    wasi_snapshot_preview1: wasi.wasiImport
  });

  wasi.start(instance);

  const { read_file } = instance.exports;

  const buffer = new Uint8Array(256);
  const bytesRead = read_file(3, buffer.byteOffset, buffer.byteLength, 0);
  const text = new TextDecoder().decode(buffer.slice(0, bytesRead));

  console.log(text);
}

main().catch((err) => {
  console.error(err);
});