class Alaska::Context

Public Class Methods

new(runtime, src = "", options = {}) click to toggle source

runtime is an instance of Alaska src is the js code to be eval()'d in the nodejs context

# File lib/alaska/context.rb, line 13
def initialize(runtime, src = "", options = {})
  @runtime = runtime

  # compile context source, in most cases
  # this is something like the CoffeeScript compiler
  # or the SASS compiler
  eval(src)
end

Public Instance Methods

call(identifier, *args) click to toggle source
# File lib/alaska/context.rb, line 50
def call(identifier, *args)
  eval "#{identifier}.apply(this, #{::JSON.generate(args)})"
end
eval(src) click to toggle source
# File lib/alaska/context.rb, line 22
def eval(src)
  if /\S/ =~ src #IMPORTANT! /\S/ =~ "()" => 0
    exec(src)
  end
end
exec(src) click to toggle source
# File lib/alaska/context.rb, line 28
def exec(src)
  return "" unless src.length > 0

  src = src.encode('UTF-8', :undef => :replace, :replace => '')
  src = compile_source(src)

  # src is either an empty object
  # OR a valid JSON string in the form
  #   ['ok', 'result-of-coffeescript-or-sass-compiler']
  # OR if an error occured
  #   ['err', 'some sort of error to be presented to the developer as a sprockets error']
  #
  status, value = src.empty? ? [] : ::JSON.parse(src, create_additions: false)
  if status == "ok"
    value
  elsif value =~ /SyntaxError:/
    raise ExecJS::RuntimeError, value
  else
    raise ExecJS::ProgramError, value
  end
end

Private Instance Methods

compile_source(contents) click to toggle source
# File lib/alaska/context.rb, line 56
def compile_source(contents)
  sock = Net::BufferedIO.new(@runtime.provision_socket)
  request = Net::HTTP::Post.new("/")
  request['Connection'] = 'close'
  request['Content-Type'] = 'application/x-www-form-urlencoded'
  request.body = contents
  request.exec(sock, "1.1", "/")

  begin
    response = Net::HTTPResponse.read_new(sock)
  end while response.kind_of?(Net::HTTPContinue)

  response.reading_body(sock, request.response_body_permitted?) { }
  sock.close
  response.body
end