class LogStash::Filters::Javascript::Script

Constants

FILENAME
MAX_LINE_LENGTH

Attributes

context[R]

Public Class Methods

new(context, params, logger) click to toggle source

@param context the JS this context for the filter function @param params additional JS (key-value) parameters to set 'globally'

# File lib/logstash/filters/javascript.rb, line 177
def initialize(context, params, logger)
  @logger = logger
  @engine = javax.script.ScriptEngineManager.new.getEngineByName("nashorn")
  @context = context

  factory = @engine.getFactory
  logger.debug "initialized javascript (#{factory.getLanguageVersion}) engine:", name: factory.getEngineName, version: factory.getEngineVersion

  params.each { |name, value| @engine.put(name, value) }
end

Public Instance Methods

get(name) click to toggle source

@return nil if no such property

# File lib/logstash/filters/javascript.rb, line 205
def get(name)
  @engine.get(name)
end
js_call(js_fn, arg) click to toggle source
# File lib/logstash/filters/javascript.rb, line 200
def js_call(js_fn, arg)
  js_fn.call(@context, arg)
end
js_eval(code, path: nil) { |: code| ... } click to toggle source
# File lib/logstash/filters/javascript.rb, line 188
def js_eval(code, path: nil)
  filename = @engine.get(FILENAME)
  @engine.put(FILENAME, path)
  @engine.eval block_given? ? yield : code
rescue => e # (non-checked) Java::JavaxScript::ScriptException, e.g.
  # Java::JavaxScript::ScriptException (TypeError: Cannot read property "far" from undefined in <eval> at line number 2)
  @logger.error "failed to evaluate javascript code:", code_hint(code, path).merge(message: e.message)
  raise e
ensure
  @engine.put(FILENAME, filename)
end
verify() click to toggle source
# File lib/logstash/filters/javascript.rb, line 209
def verify
  true # NOTE can we do more JS code checks?
end

Private Instance Methods

code_hint(code, path) click to toggle source
# File lib/logstash/filters/javascript.rb, line 217
def code_hint(code, path)
  return { path: path } if path
  lines = code.split("\n")
  code = lines.find { |line| ! line.strip.empty? }
  if code.length <= MAX_LINE_LENGTH
    code = "#{code}..." if lines.size > 1
  else
    code = "#{code[0, MAX_LINE_LENGTH - 3]}..."
  end
  { code: code }
end