module RubyBox::Bridging
Public Instance Methods
exposes(*method_names)
click to toggle source
# File lib/ruby_box/bridging.rb, line 40 def exposes(*method_names) method_names.each do |method_name| handle = "Opal.RubyBox.CurrentBoxProxy.__exposed_method_#{method_name}" wrapper = ->(serialized_args) do args = JSON.parse(serialized_args, quirks_mode: true) value = send(method_name, *args) value.to_json end binds(handle, wrapper) executes <<-RUBY class RubyBox::CurrentBoxProxy define_method(#{method_name.inspect}) do |*args, &block| raise ArgumentError, 'Cannot pass block to bridged method `RubyBox::CurrentBoxProxy##{method_name}`' unless block.nil? serialized_args = args.to_json serialized_value = Native(`#{handle}`).call(serialized_args) JSON.parse(serialized_value, quirks_mode: true) end end RUBY end end
stderr()
click to toggle source
# File lib/ruby_box/bridging.rb, line 72 def stderr @stderr ||= [] end
stdout()
click to toggle source
# File lib/ruby_box/bridging.rb, line 68 def stdout @stdout ||= [] end
Private Instance Methods
eval_compiled_source(source)
click to toggle source
Calls superclass method
# File lib/ruby_box/bridging.rb, line 78 def eval_compiled_source(source) is_caught_value, serialized_value = super(<<-JAVASCRIPT) (function(evaluator, source) { var isCaughtValue = false; var value; try{ value = evaluator(source); if(value && typeof(value.$to_json) === 'function') { value = value.$to_json(); } }catch(error){ if(error && typeof(error.$class) === 'function' && typeof(error.$message) === 'function') { isCaughtValue = true; value = [error.$class().$name(), error.$message()]; }else{ throw error; } } if(typeof(value) !== 'string') { value = JSON.stringify(value); } return [isCaughtValue, value]; })(eval, #{source.to_json}); JAVASCRIPT value = JSON.parse(serialized_value, quirks_mode: true) if serialized_value if is_caught_value class_name, message = value raise BoxedError[class_name], message else value end rescue RuntimeError => error raise ExecutionError, error.message end