class MrubySandbox::MrubySandbox

Attributes

logger[W]

Public Class Methods

logger() click to toggle source
# File lib/mruby_sandbox.rb, line 15
def logger
  @logger ||= Logger.new(STDOUT)
end
new() click to toggle source
Calls superclass method
# File lib/mruby_sandbox.rb, line 20
def initialize
  input, w = IO.pipe
  r, output  = IO.pipe
  @pid = spawn(executable, in: r, out: w)
  r.close; w.close

  self.class.logger.debug "Sandbox(#{__id__}) created with process #{@pid}"

  super(input: input, output: output)

rescue Errno::ENOENT => e
  STDERR.puts "The mruby_sandbox executable is missing. Run `build_mruby_sandbox` first."
  fail e
end

Public Instance Methods

client() click to toggle source
# File lib/mruby_sandbox.rb, line 35
def client
  clients[:default]
end
close(*) click to toggle source
Calls superclass method
# File lib/mruby_sandbox.rb, line 53
def close(*)
  return unless @pid
  super
  Process.kill 9, @pid
  Process.wait @pid
  self.class.logger.debug "Sandbox(#{__id__}) teared down and process #{@pid} killed"
  @pid = nil
end
eval(*args) click to toggle source
# File lib/mruby_sandbox.rb, line 39
def eval(*args)
  client.eval(*args)
end
inspect() click to toggle source
# File lib/mruby_sandbox.rb, line 62
def inspect
  "#<#{self.class}##{__id__} @pid=#{@pid}>"
end
start_logging() click to toggle source
# File lib/mruby_sandbox.rb, line 43
def start_logging
  on_sent do |message|
    self.class.logger.debug "Sandbox(#{__id__}) sent: #{message}"
  end

  on_received do |message|
    self.class.logger.debug "Sandbox(#{__id__}) received: #{message}"
  end
end

Private Instance Methods

executable() click to toggle source
# File lib/mruby_sandbox.rb, line 68
def executable
  current_dir = File.expand_path(File.dirname(__FILE__))
  File.join(current_dir, '../bin/mruby_sandbox')
end