From b0b06ccd99e4b0f1fbaa757d9afb15d347d14a2c Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Mon, 18 Apr 2022 12:01:58 +0000 Subject: [PATCH 1/3] Distribute +stdlib versions within npm packages --- packages/npm-packages/ruby-wasm-wasi/build-package.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/npm-packages/ruby-wasm-wasi/build-package.sh b/packages/npm-packages/ruby-wasm-wasi/build-package.sh index c15875d8fd..252c9320f5 100755 --- a/packages/npm-packages/ruby-wasm-wasi/build-package.sh +++ b/packages/npm-packages/ruby-wasm-wasi/build-package.sh @@ -31,5 +31,15 @@ wit-bindgen js \ wasm-opt --strip-debug "$ruby_root/usr/local/bin/ruby" -o "$dist_dir/ruby.wasm" cp "$ruby_root/usr/local/bin/ruby" "$dist_dir/ruby.debug.wasm" +# Build +stdlib versions (removing files that are not used in normal use cases) +workdir="$(mktemp -d)" +cp -R "$ruby_root" "$workdir/ruby-root" +rm -rf $workdir/ruby-root/usr/local/include +rm -f $workdir/ruby-root/usr/local/lib/libruby-static.a +rm -f $workdir/ruby-root/usr/local/bin/ruby +wasi-vfs pack "$dist_dir/ruby.wasm" --mapdir /usr::$workdir/ruby-root/usr -o "$dist_dir/ruby+stdlib.wasm" +wasi-vfs pack "$dist_dir/ruby.debug.wasm" --mapdir /usr::$workdir/ruby-root/usr -o "$dist_dir/ruby.debug+stdlib.wasm" + + mkdir "$dist_dir/bindgen" cp $(find "$package_dir/src/bindgen" -name "*.js" -or -name "*.d.ts") "$dist_dir/bindgen" From 338c3dd5f4427048230fe287d67d514a1dc31ecc Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Mon, 18 Apr 2022 12:18:18 +0000 Subject: [PATCH 2/3] Fix missing initialize method call in doc comment --- packages/npm-packages/ruby-wasm-wasi/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/npm-packages/ruby-wasm-wasi/src/index.ts b/packages/npm-packages/ruby-wasm-wasi/src/index.ts index 39cce68716..bf7d380c48 100644 --- a/packages/npm-packages/ruby-wasm-wasi/src/index.ts +++ b/packages/npm-packages/ruby-wasm-wasi/src/index.ts @@ -17,6 +17,7 @@ import { addRbJsAbiHostToImports, JsAbiValue } from "./bindgen/rb-js-abi-host"; * const instance = await WebAssembly.instantiate(rubyModule, imports); * await vm.setInstance(instance); * wasi.initialize(instance); + * vm.initialize(); * */ export class RubyVM { From fb4dd96a4a402aabed67fd8f78e7deb11efa5c0d Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Mon, 18 Apr 2022 12:18:46 +0000 Subject: [PATCH 3/3] Validate npm package structure --- .../ruby-wasm-wasi/test/package.test.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 packages/npm-packages/ruby-wasm-wasi/test/package.test.ts diff --git a/packages/npm-packages/ruby-wasm-wasi/test/package.test.ts b/packages/npm-packages/ruby-wasm-wasi/test/package.test.ts new file mode 100644 index 0000000000..46663f25ae --- /dev/null +++ b/packages/npm-packages/ruby-wasm-wasi/test/package.test.ts @@ -0,0 +1,48 @@ +import fs from "fs/promises"; +import path from "path"; +import { WASI } from "wasi"; +import { RubyVM } from "../dist/index.umd.js"; + +const initRubyVM = async (rubyModule: WebAssembly.Module, args: string[]) => { + const wasi = new WASI(); + const vm = new RubyVM(); + const imports = { + wasi_snapshot_preview1: wasi.wasiImport, + }; + + vm.addToImports(imports); + + const instance = await WebAssembly.instantiate(rubyModule, imports); + + await vm.setInstance(instance); + + wasi.initialize(instance); + vm.initialize(); + + return { + vm, + wasi, + instance, + }; +}; + +describe("Packaging validation", () => { + jest.setTimeout(20 /*sec*/ * 1000); + + test.each([ + { file: "ruby+stdlib.wasm", stdlib: true }, + { file: "ruby.debug.wasm", stdlib: false }, + { file: "ruby.debug+stdlib.wasm", stdlib: true }, + ])("Load all variants", async ({ file, stdlib }) => { + const binary = await fs.readFile(path.join(__dirname, `./../dist/${file}`)); + const mod = await WebAssembly.compile(binary.buffer); + const { vm } = await initRubyVM(mod, ["ruby.wasm", "-e_=0"]); + // Check loading ext library + vm.eval(`require "stringio"`) + if (stdlib) { + // Check loading stdlib gem + vm.eval(`require "English"`) + } + }); + +});