class OpalWebpackLoader::CompileWorker

Constants

SIGNALS

Attributes

cache[R]
compiler_options_digest[R]
number[R]
tempfile[R]

Public Class Methods

new(master_pid, socket, tempfile, number, compiler_options, other_options) click to toggle source
# File lib/opal-webpack-loader/compile_worker.rb, line 9
def initialize(master_pid, socket, tempfile, number, compiler_options, other_options)
  @master_pid = master_pid
  @socket     = socket
  @tempfile   = tempfile
  @number     = number
  @compiler_options = compiler_options.merge(es6_modules: true)
  if other_options[:memcached]
    @cache = Dalli::Client.new(other_options[:memchached])
  elsif other_options[:redis]
    @cache = Redis.new(url: other_options[:redis])
  else
    @cache = false
  end
  @compiler_options_digest = Digest::SHA1.hexdigest(Oj.dump(@compiler_options, mode: :strict)) if cache
end

Public Instance Methods

==(other_number) click to toggle source
# File lib/opal-webpack-loader/compile_worker.rb, line 25
def ==(other_number)
  number == other_number
end
start() click to toggle source
# File lib/opal-webpack-loader/compile_worker.rb, line 29
def start
  $PROGRAM_NAME = "owl compile worker #{number}"
  SIGNALS.each { |sig| trap(sig, 'IGNORE') }
  trap('CHLD', 'DEFAULT')
  alive = true
  %w[TERM INT].each { |sig| trap(sig) { exit(0) } }
  trap('QUIT') do
    alive = false
    begin
      @socket.close
    rescue
      nil
    end
  end
  ret = nil
  i = 0
  while alive && @master_pid == Process.ppid
    tempfile.chmod(i += 1)

    if ret
      begin
        client = @socket.accept_nonblock
        request = client.gets("\x04")

        if request.start_with?('command:stop')
          OpalWebpackLoader::CompileServer.unlink_socket_on_exit
          Process.kill('TERM', @master_pid)
          exit(0)
        else
          result = compile(request)
          client.write result
          client.flush
          client.close
        end
      rescue Errno::EAGAIN, Errno::EWOULDBLOCK
      end
    end
    tempfile.chmod(i += 1)
    ret = begin
            IO.select([@socket], nil, nil, OpalWebpackLoader::CompileServer::TIMEOUT / 2) || next
          rescue Errno::EBADF
          end
  end
end

Private Instance Methods

compile(request) click to toggle source
# File lib/opal-webpack-loader/compile_worker.rb, line 76
def compile(request)
  request_json = Oj.load(request.chop!, mode: :strict)

  compile_source_map = request_json["source_map"]
  filename = request_json["filename"]
  source = File.read(filename)

  begin
    if cache
      source_digest = Digest::SHA1.hexdigest(source)
      key = "owl_#{compiler_options_digest}_#{source_digest}_#{compile_source_map}"
      result_json = cache.get(key)
      return result_json if result_json
    end
    c = Opal::Compiler.new(source, @compiler_options.merge(file: filename))
    result = { 'javascript' => c.compile }
    if compile_source_map
      result['source_map'] = c.source_map.as_json
      result['source_map']['file'] = filename
    end
    result['required_trees'] = c.required_trees
    result_json = Oj.dump(result, mode: :strict)
    cache.set(key, result_json) if cache
    result_json
  rescue Exception => e
    Oj.dump({ 'error' => { 'name' => e.class.to_s, 'message' => e.message, 'backtrace' => e.backtrace.join("\n") } }, mode: :strict)
  end
end