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