jsTransform
jsTransform Component: Script Transformer. This component is used to transform and process messages using JavaScript scripts. It can flexibly modify the content of msg, metadata, and msgType to achieve functions such as data transformation, format conversion, and data enrichment.
JavaScript scripts support ECMAScript 5.1(+) syntax specifications and some ES6 features, including async/await/Promise/let, etc. They also support calling Go custom functions to extend functionality. For more details, see udf.
# Configuration
| Field | Type | Description | Default Value |
|---|---|---|---|
| jsScript | string | JavaScript transformation script | None |
jsScript: The JavaScript transformation script used to process messages. This field serves as the function body of the following function:function Transform(msg, metadata, msgType, dataType) { ${jsScript} }1
2
3Parameter Description:
- msg: Message content
- When dataType=JSON, it is of type
jsonObject, and fields can be accessed usingmsg.field. - When dataType=BINARY, it is of type
Uint8Array, and the byte array can be manipulated directly, such as accessing the first byte withmsg[0]. - For other dataTypes, it is of type
string.
- When dataType=JSON, it is of type
- metadata: Message metadata, of type
jsonObject. - msgType: Message type, of type
string. - dataType: Message data type (JSON, TEXT, BINARY, etc.), which needs to be converted to a string using
String(dataType).
Return Value:
- Must return an object containing the transformed
msg,metadata, andmsgType:return { 'msg': msg, // Transformed message content 'metadata': metadata, // Transformed metadata 'msgType': msgType, // Transformed message type 'dataType': dataType // Optional: Transformed data type };1
2
3
4
5
6 - Supported data type conversions:
- The message data type can be modified using the
dataTypefield in the return value. - The
msgfield supports returning a byte array (JavaScript array) that will be automatically converted to binary data.
- The message data type can be modified using the
- msg: Message content
Note
- Script execution has a timeout limit, which is configured through config.ScriptMaxExecutionTime.
# Relation Type
- Success: The script executes successfully, and the transformed message is sent to the
Successchain. - Failure: The message is sent to the
Failurechain in the following cases:- Script syntax error
- Script execution exception
- Script execution timeout
- Incorrect return value format
# Execution Result
The component transforms the message by executing the JavaScript script:
- It can modify the content of
msg. - It can modify/add
metadata. - It can modify
msgType. - It can modify
dataType. - The complete transformed message is passed to the next node.
# Configuration Examples
# Basic Data Transformation Example
{
"id": "s1",
"type": "jsTransform",
"name": "Transformation",
"configuration": {
"jsScript": "metadata['name']='test01';\n metadata['index']=11;\n msg['addField']='addValue1'; return {'msg':msg,'metadata':metadata,'msgType':msgType};"
}
}
2
3
4
5
6
7
8
# Binary Data Processing Example
{
"id": "s2",
"type": "jsTransform",
"name": "Binary Transformation",
"configuration": {
"jsScript": "if (String(dataType) === 'BINARY') { var newBytes = new Uint8Array(msg.length + 4); newBytes[0] = 0xFF; newBytes[1] = 0xFE; newBytes[2] = 0xFD; newBytes[3] = 0xFC; for (var i = 0; i < msg.length; i++) { newBytes[i + 4] = msg[i]; } metadata['processed'] = 'true'; return {'msg': newBytes, 'metadata': metadata, 'msgType': msgType, 'dataType': 'BINARY'}; } return {'msg': msg, 'metadata': metadata, 'msgType': msgType};"
}
}
2
3
4
5
6
7
8
# Data Type Conversion Example
{
"id": "s3",
"type": "jsTransform",
"name": "Type Conversion",
"configuration": {
"jsScript": "var bytes = [72, 101, 108, 108, 111]; metadata['converted'] = 'text_to_binary'; return {'msg': bytes, 'metadata': metadata, 'msgType': msgType, 'dataType': 'BINARY'};"
}
}
2
3
4
5
6
7
8
# JSON Data Enrichment Example
{
"id": "s4",
"type": "jsTransform",
"name": "JSON Data Enrichment",
"configuration": {
"jsScript": "if (String(dataType) === 'JSON') { msg.timestamp = new Date().toISOString(); msg.processedBy = 'RuleGo'; if (msg.temperature !== undefined) { msg.temperatureF = msg.temperature * 9/5 + 32; msg.status = msg.temperature > 25 ? 'hot' : 'normal'; } metadata['enhanced'] = 'true'; } return {'msg': msg, 'metadata': metadata, 'msgType': msgType};"
}
}
2
3
4
5
6
7
8
# Binary Protocol Parsing Example
{
"id": "s5",
"type": "jsTransform",
"name": "Protocol Parsing",
"configuration": {
"jsScript": "if (String(dataType) === 'BINARY' && msg.length >= 8) { var deviceId = (msg[0] << 8) | msg[1]; var functionCode = (msg[2] << 8) | msg[3]; var dataLength = (msg[4] << 8) | msg[5]; var payload = Array.from(msg.slice(6)); var result = { deviceId: deviceId, functionCode: functionCode, dataLength: dataLength, payload: payload, parsedAt: new Date().toISOString() }; metadata['protocol'] = 'custom'; metadata['parsed'] = 'true'; return {'msg': result, 'metadata': metadata, 'msgType': 'PARSED_DATA', 'dataType': 'JSON'}; } return {'msg': msg, 'metadata': metadata, 'msgType': msgType};"
}
}
2
3
4
5
6
7
8
# Text Log Parsing Example
{
"id": "s6",
"type": "jsTransform",
"name": "Log Parsing",
"configuration": {
"jsScript": "if (String(dataType) === 'TEXT') { var logPattern = /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(\\w+)\\] (.+)$/; var match = msg.match(logPattern); if (match) { var parsed = { timestamp: match[1], level: match[2], message: match[3], source: 'application' }; metadata['logParsed'] = 'true'; return {'msg': parsed, 'metadata': metadata, 'msgType': 'LOG_ENTRY', 'dataType': 'JSON'}; } } return {'msg': msg, 'metadata': metadata, 'msgType': msgType};"
}
}
2
3
4
5
6
7
8
# Binary Data Encryption Example
{
"id": "s7",
"type": "jsTransform",
"name": "Data Encryption",
"configuration": {
"jsScript": "if (String(dataType) === 'BINARY') { var encrypted = new Uint8Array(msg.length + 4); encrypted[0] = 0xAA; encrypted[1] = 0xBB; encrypted[2] = 0xCC; encrypted[3] = 0xDD; for (var i = 0; i < msg.length; i++) { encrypted[i + 4] = msg[i] ^ 0x55; } metadata['encrypted'] = 'true'; metadata['algorithm'] = 'xor'; return {'msg': encrypted, 'metadata': metadata, 'msgType': msgType, 'dataType': 'BINARY'}; } return {'msg': msg, 'metadata': metadata, 'msgType': msgType};"
}
}
2
3
4
5
6
7
8
# Multi-Data Type Conversion Example
{
"id": "s8",
"type": "jsTransform",
"name": "Smart Transformation",
"configuration": {
"jsScript": "var dt = String(dataType); metadata.originalType = dt; if (dt === 'JSON') { msg.converted = true; msg.convertedAt = new Date().toISOString(); return {'msg': msg, 'metadata': metadata, 'msgType': 'ENHANCED_JSON'}; } else if (dt === 'TEXT') { try { var parsed = JSON.parse(msg); metadata.textToJson = 'success'; return {'msg': parsed, 'metadata': metadata, 'msgType': 'CONVERTED_JSON', 'dataType': 'JSON'}; } catch(e) { metadata.conversionError = e.message; } } else if (dt === 'BINARY') { var hex = Array.from(msg).map(b => b.toString(16).padStart(2, '0')).join(''); metadata.hexString = hex; metadata.binaryLength = msg.length; } return {'msg': msg, 'metadata': metadata, 'msgType': msgType};"
}
}
2
3
4
5
6
7
8
# Application Example
Transform the message and then execute subsequent logic.
{
"ruleChain": {
"id":"rule01",
"name": "Test Rule Chain",
"root": true
},
"metadata": {
"nodes": [
{
"id": "s1",
"type": "jsTransform",
"name": "Transformation",
"configuration": {
"jsScript": "metadata['name']='test02';\n metadata['index']=22;\n msg['addField']='addValue2'; return {'msg':msg,'metadata':metadata,'msgType':msgType};"
}
},
{
"id": "s2",
"type": "restApiCall",
"name": "Push Data",
"configuration": {
"restEndpointUrlPattern": "<url id=\"d1d1j4gr7lpjqb3pt42g\" type=\"url\" status=\"failed\" title=\"\" wc=\"0\">http://192.168.136.26:9099/api/msg</url> ",
"requestMethod": "POST",
"maxParallelRequestsCount": 200
}
}
],
"connections": [
{
"fromId": "s1",
"toId": "s2",
"type": "Success"
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36