Project

duktape

0.04
Low commit activity in last 3 years
No release in over a year
Bindings to the Duktape JavaScript interpreter
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

Duktape.rb

Duktape.rb is a C extension for the Duktape JavaScript interpreter.

Quickstart

$ rake
$ ruby example.rb

Usage

require 'duktape'

# Create a new context
ctx = Duktape::Context.new

## Evaluate a string
p ctx.eval_string('1 + 1')  # => 2.0

Contexts

Creating a context creates a fresh evaluation environment with no global variables or functions defined.

A common pattern is to create a new context, define static functions once, and reuse the context to invoke the function many times with call_prop.

ctx = Duktape::Context.new

ctx.exec_string <<-JS
  function process(str, options) {
    // ...
  }
JS

ctx.call_prop('process', 'some data', a: 1, b: 2)

Call APIs

  • exec_string - Evaluate a JavaScript String on the context and return nil.
  • eval_string - Evaluate a JavaScript String expression and return the result as a Ruby Object.
  • get_prop - Access the property of the global object and return the value as a Ruby Object.
  • call_prop - Call a defined function with the given parameters and return the value as a Ruby Object.

Defining functions

You can define simple functions in Ruby that can be called from JavaScript:

ctx.define_function("leftpad") do |str, n, ch=' '|
  str.rjust(n, ch)
end

Exceptions

Executing JS may raise two classes of errors: Duktape::Error and Duktape::InternalError.

Any JS runtime error that is thrown in the interpreter is converted to a Ruby Duktape::Error. Specific error subclasses, such as SyntaxError and TypeError, are mapped from JS to the Ruby equivalent of the same name.

ctx = Duktape::Context.new
ctx.exec_string <<JS
  (function() {
    throw new Error("fail");
  })();
JS
# raises Duktape::Error: fail

The second error hierarchy, Duktape::InternalError, is reserved for errors in the Duktape interpreter itself. It may be an indication of a bug in this library.