ruby.wasm is a collection of WebAssembly ports of the CRuby. It enables running Ruby application on browsers, WASI compatible WebAssembly runtimes, and Edge Computing platforms.
Try ruby.wasm in TryRuby in your browser.
Create and save index.html
page with the following contents:
<html>
<script src="https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@1.0.1/dist/browser.script.iife.js"></script>
<script type="text/ruby">
puts "Hello, world!"
</script>
</html>
Dependencies: wasi-vfs, wasmtime
# Download a prebuilt Ruby release
$ curl -LO https://github.com/ruby/ruby.wasm/releases/latest/download/ruby-3_2-wasm32-unknown-wasi-full.tar.gz
$ tar xfz ruby-3_2-wasm32-unknown-wasi-full.tar.gz
# Extract ruby binary not to pack itself
$ mv 3_2-wasm32-unknown-wasi-full/usr/local/bin/ruby ruby.wasm
# Put your app code
$ mkdir src
$ echo "puts 'Hello'" > src/my_app.rb
# Pack the whole directory under /usr and your app dir
$ wasi-vfs pack ruby.wasm --mapdir /src::./src --mapdir /usr::./3_2-wasm32-unknown-wasi-full/usr -o my-ruby-app.wasm
# Run the packed scripts
$ wasmtime my-ruby-app.wasm -- /src/my_app.rb
Hello
See the README.md
of each package for more detail and its usage.
Package | Description | npm |
---|---|---|
ruby-3_2-wasm-wasi | CRuby 3.2 built on WASI with JS interop support | |
ruby-head-wasm-wasi | HEAD CRuby built on WASI with JS interop support | |
ruby-head-wasm-emscripten | HEAD CRuby built on Emscripten (not well tested) |
This project distributes prebuilt Ruby binaries in GitHub Releases. A build is a combination of ruby version, profile, and target.
Triple | Description |
---|---|
wasm32-unknown-wasi |
Targeting WASI-compatible environments (e.g. Node.js, browsers with polyfill, wasmtime, and so on) |
wasm32-unknown-emscripten |
Targeting JavaScript environments including Node.js and browsers |
Profile | Description |
---|---|
minimal |
No standard extension libraries (like json , yaml , or stringio ) |
full |
All standard extension libraries |
*-js |
Enabled JS interoperability, only usable with npm package |
*-debug |
With DWARF info and name section for debugging |
Note: *
is a wildcard that represents any other profile name except for itself, applied recursively. For example, minimal-full-js-debug
is a valid profile.
The current WASI target build does not yet support Thread
related APIs. Specifically, WASI does not yet have an API for creating and managing threads yet.
Also there is no support for networking. It is one of the goal of WASI to support networking in the future, but it is not yet implemented.
See CONTRIBUTING.md for how to build and test, and how to contribute to this project. Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/ruby.wasm