Modeling Guide

JavaScript Operator

The JavaScript engine allows you to execute JavaScript snippets within a graph. It is based on the JavaScript operator. This operator increments and outputs a counter value with the input.

Configuration Parameters

Parameter

Type

Description

codelanguage

string

The programming language used in the snippet.

Default: "javascript"

script

string

Mandatory. The inline script to be executed. If the script starts with "file://", then the script file is executed.

Default: ""

Input

Input

Type

Description

input

string

Any string that will trigger the counter output.

Output

Output

Type

Description

output

string

The counter value.

Creating a JavaScript Extension

  1. Create an extension of the JavaScript operator and add the desired input and output ports.
  2. Add your JavaScript snippet as an inline "script" parameter in the extension configuration or put the code into a separate file and use the prefix "file://" to specify the file name.

Basic Example

Count all incoming messages on the "input" port and write the count to the output port:
var counter = 0

$.setPortCallback("input",onInput)

function onInput(ctx,s) {
    counter++
    $.output(counter)
}

Generators

Generators are functions that are executed before the event processing loop starts.

For example:
var counter = 0

$.addGenerator(gen)
$.addGenerator(gen)

function gen(ctx) {
    for (var i = 0; i < 3; i++ ) {
      $.output(counter)
      counter++
    }
}

This example produces the values 0,1,2,3,4,5 on the output port "output".

Timers

This example produces the values 0,1,2,3,4,5 on the output port "output".

For example:
var counter = 0

$.addTimer("1s",t1)

function t1(ctx) {
  $.output(counter)
  counter++
}

This example produces the values 0,1,2... on port "output" until graph shutdown.

Shutdown Handlers

This example produces the values 0,1,2... on port "output" until graph shutdown.

For example:
var counter = 0

$.setPortCallback("input",onInput)

function onInput(ctx,s) {
    counter++
}

function shutdown(ctx) {
    $.output(counter)
}

$.addShutdownHandler(shutdown)
$.addShutdownHandler(shutdown)

This example produces values 7,7 if 7 values have been provided on the "input" port.

Configuration API

Configuration API provides the ability to read the configuration provided via a graph description.

For example:
function gen(ctx) {
  $.str($.config.getString("str"))
  $.int($.config.getInt("int"))
  $.bool(""+$.config.getBool("bool"))
  $.msg({Attributes: $.config.getObject("obj")})
  $.msg({Attributes: $.config.asObject()})
}
$.addGenerator(gen)

This example reads the configuration of the operator and provides the given values on the output ports.

Error Handling

The fail function provides the ability to terminate a processing loop in case of an internal error.

For example:
var counter = 0

$.setPortCallback("input",onInput)

function onInput(ctx,s) {
    counter++
    if (counter > 1 ) {
      $.fail("Failure in counter")
    }
    $.output(counter)
}

This example terminates the loop while processing the second input on "input" port.

Message Response Handling

The sendResponse function provides the ability to send either a response or error message to the request-response initiating operator. This function is only valid if the incoming data is of type message and it contains the response callback as part of a request-response message exchange.

For example:
var counter = 0

function onInput(ctx,s) {
    counter++
    if (counter < 100) {
        var msg = {};
        msg.Body = "pong " + counter;
        $.sendResponse(s, msg, null);
    } else {
        $.sendResponse(s, null, Error("Usage limit reached " + counter));
    }
}

This example sends a response or error depending on the current counter value.