diff --git a/lib/wasify.rb b/lib/wasify.rb
index f1e1090..db78ce5 100644
--- a/lib/wasify.rb
+++ b/lib/wasify.rb
@@ -5,11 +5,73 @@
require 'erb'
require_relative 'wasify/cmd_runner'
require_relative 'wasify/deps_manager'
+
# wrapper for Wasify
class Wasify
+ DEFAULT_WASM_VERSION = "2.5.0"
+ DEFAULT_RUBY_VERSION = "3.3"
+
+ # Anything before 2.1.0 doesn't have a browser.umd.js in CDN
+ #RUBY_WASM_VERSIONS = [ "2.1.0", "2.2.0", "2.3.0", "2.4.0", "2.4.1" ]
+
+ def self.download_filename
+ return @ruby_wasm_filename if @ruby_wasm_filename
+
+ wasm_version = ENV["WS_RUBY_WASM_VERSION"] ? ENV["WS_RUBY_WASM_VERSION"] : DEFAULT_WASM_VERSION
+
+ sep = "."
+ if wasm_version[0..2] < "2.4"
+ # Before 2.4, used an underscore separator.
+ sep = "_"
+ end
+
+ # Grab the Ruby version (3.2 or 3.3) and parse out the major and minor numbers
+ rv = gems_ruby_version
+ maj = gems_ruby_version[0]
+ min = gems_ruby_version[2]
+
+ @ruby_wasm_filename = "ruby-#{maj}#{sep}#{min}-wasm32-unknown-wasi-full-js-debug"
+ end
+
+ def self.dir_filename
+ return @ruby_dir_filename if @ruby_dir_filename
+
+ wasm_version = ENV["WS_RUBY_WASM_VERSION"] ? ENV["WS_RUBY_WASM_VERSION"] : DEFAULT_WASM_VERSION
+ if wasm_version[0..2] < "2.4"
+ @ruby_dir_filename = download_filename
+ else
+ @ruby_dir_filename = download_filename.delete_prefix("ruby-")
+ end
+ end
+
+ def self.gems_ruby_version
+ return @ruby_version if @ruby_version
+
+ ruby_short_version = ENV["WS_RUBY_VERSION"] ? ENV["WS_RUBY_VERSION"] : DEFAULT_RUBY_VERSION
+
+ if ruby_short_version == "3.3"
+ @ruby_version = "3.3.0"
+ elsif ruby_short_version == "3.2"
+ @ruby_version = "3.2.0"
+ else
+ raise "Unrecognized ENV WS_RUBY_VERSION value: should be 3.2 or 3.3!"
+ end
+ end
+
+ # This is the version of ruby/ruby.wasm being used
+ def self.wasi_version
+ return @wasi_version if @wasi_version
+
+ @wasi_version = ENV["WS_RUBY_WASM_VERSION"] || DEFAULT_WASM_VERSION
+
+ @wasi_version
+ end
+
+ # TODO: control the wasi-vfs version in the same way
+
def self.prepack
- CMDRunner.download_binary unless File.exist?('ruby-3_2-wasm32-unknown-wasi-full-js.tar.gz')
- CMDRunner.unzip_binary unless Dir.exist?('ruby-3_2-wasm32-unknown-wasi-full-js')
+ CMDRunner.download_binary unless File.exist?(self.download_filename + '.tar.gz')
+ CMDRunner.unzip_binary unless Dir.exist?(self.dir_filename)
CMDRunner.move_binary unless File.exist?('ruby.wasm')
CMDRunner.fix_lockfile
CMDRunner.copy_gemfile
@@ -34,6 +96,7 @@ def self.pack
def self.generate_html(entrypoint)
entrypoint_txt = DepsManager.add_entrypoint(entrypoint)
+ wasm_wasi_version = wasi_version
template = 'wasify/template.erb'
html = ERB.new(File.read(File.join(__dir__, template))).result(binding)
File.rename('index.html', 'index.html.bak') if File.exist?('index.html')
diff --git a/lib/wasify/cmd_runner.rb b/lib/wasify/cmd_runner.rb
index bcefde4..eeee872 100644
--- a/lib/wasify/cmd_runner.rb
+++ b/lib/wasify/cmd_runner.rb
@@ -3,36 +3,42 @@
class Wasify
# methods interacting with the command line
class CMDRunner
+ def self.run_or_fail(cmd)
+ system(cmd) || raise("Failed with #{$?.exitstatus} running cmd: #{cmd.inspect} in dir #{Dir.pwd.inspect}")
+ end
+
def self.download_binary
- system('curl -LO https://github.com/ruby/ruby.wasm/releases/latest/download/ruby-3_2-wasm32-unknown-wasi-full-js.tar.gz')
+ version = Wasify.wasi_version
+ url = "https://github.com/ruby/ruby.wasm/releases/download/#{version}/#{Wasify.download_filename}.tar.gz"
+ run_or_fail("curl -LO #{url}")
end
def self.unzip_binary
- system('tar xfz ruby-3_2-wasm32-unknown-wasi-full-js.tar.gz')
- system('chmod -R u+rw 3_2-wasm32-unknown-wasi-full-js')
+ run_or_fail("tar xfz #{Wasify.download_filename}.tar.gz")
+ run_or_fail("chmod -R u+rw #{Wasify.dir_filename}")
end
def self.move_binary
- system('mv 3_2-wasm32-unknown-wasi-full-js/usr/local/bin/ruby ruby.wasm')
+ run_or_fail("mv #{Wasify.dir_filename}/usr/local/bin/ruby ruby.wasm")
end
def self.copy_gemfile
- system('mkdir -p deps && cp -r Gemfile deps/Gemfile && cp -r Gemfile.lock deps/Gemfile.lock')
+ run_or_fail('mkdir -p deps && cp -r Gemfile deps/Gemfile && cp -r Gemfile.lock deps/Gemfile.lock')
end
def self.fix_lockfile
- system('bundle lock --add-platform wasm32-unknown')
+ run_or_fail('bundle lock --add-platform wasm32-unknown')
end
def self.run_vfs
- system('wasi-vfs pack ruby.wasm --mapdir /src::./src --mapdir /usr::./3_2-wasm32-unknown-wasi-full-js/usr --mapdir /deps::./deps -o packed_ruby.wasm')
+ run_or_fail("wasi-vfs pack ruby.wasm --mapdir /src::./src --mapdir /usr::./#{Wasify.dir_filename}/usr --mapdir /deps::./deps -o packed_ruby.wasm")
end
def self.cleanup
- system('rm -rf 3_2-wasm32-unknown-wasi-full-js')
- system('rm ruby-3_2-wasm32-unknown-wasi-full-js.tar.gz')
- system('rm ruby.wasm')
- system('rm -rf deps')
+ run_or_fail("rm -rf #{Wasify.dir_filename}")
+ run_or_fail("rm #{Wasify.download_filename}.tar.gz")
+ run_or_fail('rm ruby.wasm')
+ run_or_fail('rm -rf deps')
end
end
end
diff --git a/lib/wasify/deps_manager.rb b/lib/wasify/deps_manager.rb
index 4c4307e..3a0f595 100644
--- a/lib/wasify/deps_manager.rb
+++ b/lib/wasify/deps_manager.rb
@@ -64,7 +64,7 @@ def self.get_deps
def self.copy_deps
get_deps.each do |gem_name, dep|
- dest_dir = "./3_2-wasm32-unknown-wasi-full-js/usr/local/lib/ruby/gems/3.2.0/gems/#{gem_name}"
+ dest_dir = "./#{Wasify.dir_filename}/usr/local/lib/ruby/gems/#{Wasify.gems_ruby_version}/gems/#{gem_name}"
if dep[:files] == :all
FileUtils.cp_r dep[:root], dest_dir
elsif dep[:files].respond_to?(:each)
@@ -84,9 +84,9 @@ def self.copy_deps
def self.copy_specs
deps = get_deps
specs = get_specs(deps)
- FileUtils.mkdir_p "./3_2-wasm32-unknown-wasi-full-js/usr/local/lib/ruby/gems/3.2.0/specifications/"
+ FileUtils.mkdir_p "./#{Wasify.dir_filename}/usr/local/lib/ruby/gems/#{Wasify.gems_ruby_version}/specifications/"
specs.each do |name, contents|
- File.write("./3_2-wasm32-unknown-wasi-full-js/usr/local/lib/ruby/gems/3.2.0/specifications/#{name}", contents)
+ File.write("./#{Wasify.dir_filename}/usr/local/lib/ruby/gems/#{Wasify.gems_ruby_version}/specifications/#{name}", contents)
end
end
diff --git a/lib/wasify/template.erb b/lib/wasify/template.erb
index 2c411e2..09f67cb 100644
--- a/lib/wasify/template.erb
+++ b/lib/wasify/template.erb
@@ -1,6 +1,6 @@
-
+