javascript
Executes a provided JavaScript code block or file for each message.
Introduced in version 4.14.0.
# Config fields, showing default values
label: ""
javascript:
code: "" # No default (optional)
file: "" # No default (optional)
global_folders: []
The execution engine behind this processor provides full ECMAScript 5.1 support (including regex and strict mode). Most of the ECMAScript 6 spec is implemented but this is a work in progress.
Imports via require
should work similarly to NodeJS, and access to the console is supported which will print via the Redpanda Connect logger. More caveats can be found on GitHub.
This processor is implemented using the github.com/dop251/goja library.
Fields
code
An inline JavaScript program to run. One of code
or file
must be defined.
This field supports interpolation functions.
Type: string
file
A file containing a JavaScript program to run. One of code
or file
must be defined.
This field supports interpolation functions.
Type: string
Examples
-
Simple mutation
-
Structured mutation
In this example we define a simple function that performs a basic mutation against messages, treating their contents as raw strings.
pipeline:
processors:
- javascript:
code: 'benthos.v0_msg_set_string(benthos.v0_msg_as_string() + "hello world");'
In this example we define a function that performs basic mutations against a structured message. Note that we encapsulate the logic within an anonymous function that is called for each invocation, this is required in order to avoid duplicate variable declarations in the global state.
pipeline:
processors:
- javascript:
code: |
(() => {
let thing = benthos.v0_msg_as_structured();
thing.num_keys = Object.keys(thing).length;
delete thing["b"];
benthos.v0_msg_set_structured(thing);
})();
Runtime
In order to optimize code execution JS runtimes are created on demand (in order to support parallel execution) and are reused across invocations. Therefore, it is important to understand that global state created by your programs will outlive individual invocations. In order for your programs to avoid failing after the first invocation ensure that you do not define variables at the global scope.
Although technically possible, it is recommended that you do not rely on the global state for maintaining state across invocations as the pooling nature of the runtimes will prevent deterministic behavior. We aim to support deterministic strategies for mutating global state in the future.
Functions
benthos.v0_fetch
Executes an HTTP request synchronously and returns the result as an object of the form {"status":200,"body":"foo"}
.
benthos.v0_msg_as_structured
Obtain the root of the processed message as a structured value. If the message is not valid JSON or has not already been expanded into a structured form this function will throw an error.