javascript
Executes a JavaScript code block or file for each message.
Introduced in version 4.14.0.
# Configuration 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
Examples
Simple 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");'
Structured mutation
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
To optimize code execution, JavaScript runtimes are created on demand (in order to support parallel execution) and are reused across invocations. Therefore, it’s important to understand that the global state created by your programs will outlive individual invocations. 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.