thingsboard-memoizeit

Changes

Details

diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
index a8b66dc..c1a2c17 100644
--- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
+++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
@@ -44,7 +44,7 @@ import org.thingsboard.server.dao.relation.RelationService;
 import org.thingsboard.server.dao.rule.RuleChainService;
 import org.thingsboard.server.dao.timeseries.TimeseriesService;
 import org.thingsboard.server.dao.user.UserService;
-import org.thingsboard.server.service.script.JsScriptEngine;
+import org.thingsboard.server.service.script.RuleNodeJsScriptEngine;
 import scala.concurrent.duration.Duration;
 
 import java.util.Collections;
@@ -151,8 +151,8 @@ class DefaultTbContext implements TbContext {
     }
 
     @Override
-    public ScriptEngine createJsScriptEngine(String script, String functionName, String... argNames) {
-        return new JsScriptEngine(mainCtx.getJsSandbox(), script, functionName, argNames);
+    public ScriptEngine createJsScriptEngine(String script, String... argNames) {
+        return new RuleNodeJsScriptEngine(mainCtx.getJsSandbox(), script, argNames);
     }
 
     @Override
diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
index e8a5f8d..86b8fda 100644
--- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
+++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
@@ -50,9 +50,8 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
 import org.thingsboard.server.common.msg.TbMsg;
 import org.thingsboard.server.common.msg.TbMsgMetaData;
 import org.thingsboard.server.dao.event.EventService;
-import org.thingsboard.server.service.script.JsExecutorService;
 import org.thingsboard.server.service.script.JsSandboxService;
-import org.thingsboard.server.service.script.JsScriptEngine;
+import org.thingsboard.server.service.script.RuleNodeJsScriptEngine;
 
 import java.util.List;
 import java.util.Map;
@@ -266,7 +265,6 @@ public class RuleChainController extends BaseController {
         try {
             String script = inputParams.get("script").asText();
             String scriptType = inputParams.get("scriptType").asText();
-            String functionName = inputParams.get("functionName").asText();
             JsonNode argNamesJson = inputParams.get("argNames");
             String[] argNames = objectMapper.treeToValue(argNamesJson, String[].class);
 
@@ -278,7 +276,7 @@ public class RuleChainController extends BaseController {
             String errorText = "";
             ScriptEngine engine = null;
             try {
-                engine = new JsScriptEngine(jsSandboxService, script, functionName, argNames);
+                engine = new RuleNodeJsScriptEngine(jsSandboxService, script, argNames);
                 TbMsg inMsg = new TbMsg(UUIDs.timeBased(), msgType, null, new TbMsgMetaData(metadata), data, null, null, 0L);
                 switch (scriptType) {
                     case "update":
diff --git a/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsSandboxService.java b/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsSandboxService.java
new file mode 100644
index 0000000..58ad84c
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsSandboxService.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright © 2016-2018 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thingsboard.server.service.script;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import delight.nashornsandbox.NashornSandbox;
+import delight.nashornsandbox.NashornSandboxes;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.script.ScriptException;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Slf4j
+public abstract class AbstractNashornJsSandboxService implements JsSandboxService {
+
+    private NashornSandbox sandbox = NashornSandboxes.create();
+    private ExecutorService monitorExecutorService;
+
+    private Map<UUID, String> functionsMap = new ConcurrentHashMap<>();
+
+    private Map<UUID,AtomicInteger> blackListedFunctions = new ConcurrentHashMap<>();
+
+    @PostConstruct
+    public void init() {
+        monitorExecutorService = Executors.newFixedThreadPool(getMonitorThreadPoolSize());
+        sandbox.setExecutor(monitorExecutorService);
+        sandbox.setMaxCPUTime(getMaxCpuTime());
+        sandbox.allowNoBraces(false);
+        sandbox.setMaxPreparedStatements(30);
+    }
+
+    @PreDestroy
+    public void stop() {
+        if  (monitorExecutorService != null) {
+            monitorExecutorService.shutdownNow();
+        }
+    }
+
+    protected abstract int getMonitorThreadPoolSize();
+
+    protected abstract long getMaxCpuTime();
+
+    protected abstract int getMaxErrors();
+
+    @Override
+    public ListenableFuture<UUID> eval(JsScriptType scriptType, String scriptBody, String... argNames) {
+        UUID scriptId = UUID.randomUUID();
+        String functionName = "invokeInternal_" + scriptId.toString().replace('-','_');
+        String jsScript = generateJsScript(scriptType, functionName, scriptBody, argNames);
+        try {
+            sandbox.eval(jsScript);
+            functionsMap.put(scriptId, functionName);
+        } catch (Exception e) {
+            log.warn("Failed to compile JS script: {}", e.getMessage(), e);
+            return Futures.immediateFailedFuture(e);
+        }
+        return Futures.immediateFuture(scriptId);
+    }
+
+    @Override
+    public ListenableFuture<Object> invokeFunction(UUID scriptId, Object... args) {
+        String functionName = functionsMap.get(scriptId);
+        if (functionName == null) {
+            return Futures.immediateFailedFuture(new RuntimeException("No compiled script found for scriptId: [" + scriptId + "]!"));
+        }
+        if (!isBlackListed(scriptId)) {
+            try {
+                return Futures.immediateFuture(sandbox.getSandboxedInvocable().invokeFunction(functionName, args));
+            } catch (Exception e) {
+                blackListedFunctions.computeIfAbsent(scriptId, key -> new AtomicInteger(0)).incrementAndGet();
+                return Futures.immediateFailedFuture(e);
+            }
+        } else {
+            return Futures.immediateFailedFuture(
+                    new RuntimeException("Script is blacklisted due to maximum error count " + getMaxErrors() + "!"));
+        }
+    }
+
+    @Override
+    public ListenableFuture<Void> release(UUID scriptId) {
+        String functionName = functionsMap.get(scriptId);
+        if (functionName != null) {
+            try {
+                sandbox.eval(functionName + " = undefined;");
+                functionsMap.remove(scriptId);
+                blackListedFunctions.remove(scriptId);
+            } catch (ScriptException e) {
+                return Futures.immediateFailedFuture(e);
+            }
+        }
+        return Futures.immediateFuture(null);
+    }
+
+    private boolean isBlackListed(UUID scriptId) {
+        if (blackListedFunctions.containsKey(scriptId)) {
+            AtomicInteger errorCount = blackListedFunctions.get(scriptId);
+            return errorCount.get() >= getMaxErrors();
+        } else {
+            return false;
+        }
+    }
+
+    private String generateJsScript(JsScriptType scriptType, String functionName, String scriptBody, String... argNames) {
+        switch (scriptType) {
+            case RULE_NODE_SCRIPT:
+                return RuleNodeScriptFactory.generateRuleNodeScript(functionName, scriptBody, argNames);
+            default:
+                throw new RuntimeException("No script factory implemented for scriptType: " + scriptType);
+        }
+    }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/script/JsSandboxService.java b/application/src/main/java/org/thingsboard/server/service/script/JsSandboxService.java
index d250857..ee86c62 100644
--- a/application/src/main/java/org/thingsboard/server/service/script/JsSandboxService.java
+++ b/application/src/main/java/org/thingsboard/server/service/script/JsSandboxService.java
@@ -16,12 +16,16 @@
 
 package org.thingsboard.server.service.script;
 
-import javax.script.ScriptException;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.UUID;
 
 public interface JsSandboxService {
 
-    Object eval(String js) throws ScriptException;
+    ListenableFuture<UUID> eval(JsScriptType scriptType, String scriptBody, String... argNames);
+
+    ListenableFuture<Object> invokeFunction(UUID scriptId, Object... args);
 
-    Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException;
+    ListenableFuture<Void> release(UUID scriptId);
 
 }
diff --git a/application/src/main/java/org/thingsboard/server/service/script/JsScriptType.java b/application/src/main/java/org/thingsboard/server/service/script/JsScriptType.java
new file mode 100644
index 0000000..f7a4748
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/script/JsScriptType.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright © 2016-2018 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thingsboard.server.service.script;
+
+public enum JsScriptType {
+    RULE_NODE_SCRIPT
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/script/NashornJsSandboxService.java b/application/src/main/java/org/thingsboard/server/service/script/NashornJsSandboxService.java
index 576e149..a08a1a8 100644
--- a/application/src/main/java/org/thingsboard/server/service/script/NashornJsSandboxService.java
+++ b/application/src/main/java/org/thingsboard/server/service/script/NashornJsSandboxService.java
@@ -16,21 +16,13 @@
 
 package org.thingsboard.server.service.script;
 
-import delight.nashornsandbox.NashornSandbox;
-import delight.nashornsandbox.NashornSandboxes;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.script.ScriptException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
 @Slf4j
 @Service
-public class NashornJsSandboxService implements JsSandboxService {
+public class NashornJsSandboxService extends AbstractNashornJsSandboxService {
 
     @Value("${actors.rule.js_sandbox.monitor_thread_pool_size}")
     private int monitorThreadPoolSize;
@@ -38,33 +30,21 @@ public class NashornJsSandboxService implements JsSandboxService {
     @Value("${actors.rule.js_sandbox.max_cpu_time}")
     private long maxCpuTime;
 
-    private NashornSandbox sandbox = NashornSandboxes.create();
-    private ExecutorService monitorExecutorService;
-
-    @PostConstruct
-    public void init() {
-        monitorExecutorService = Executors.newFixedThreadPool(monitorThreadPoolSize);
-        sandbox.setExecutor(monitorExecutorService);
-        sandbox.setMaxCPUTime(maxCpuTime);
-        sandbox.allowNoBraces(false);
-        sandbox.setMaxPreparedStatements(30);
-    }
+    @Value("${actors.rule.js_sandbox.max_errors}")
+    private int maxErrors;
 
-    @PreDestroy
-    public void stop() {
-        if  (monitorExecutorService != null) {
-            monitorExecutorService.shutdownNow();
-        }
+    @Override
+    protected int getMonitorThreadPoolSize() {
+        return monitorThreadPoolSize;
     }
 
     @Override
-    public Object eval(String js) throws ScriptException {
-        return sandbox.eval(js);
+    protected long getMaxCpuTime() {
+        return maxCpuTime;
     }
 
     @Override
-    public Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException {
-        return sandbox.getSandboxedInvocable().invokeFunction(name, args);
+    protected int getMaxErrors() {
+        return maxErrors;
     }
-
 }
diff --git a/application/src/main/java/org/thingsboard/server/service/script/RuleNodeScriptFactory.java b/application/src/main/java/org/thingsboard/server/service/script/RuleNodeScriptFactory.java
new file mode 100644
index 0000000..5cc9c55
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/script/RuleNodeScriptFactory.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright © 2016-2018 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thingsboard.server.service.script;
+
+public class RuleNodeScriptFactory {
+
+    public static final String MSG = "msg";
+    public static final String METADATA = "metadata";
+    public static final String MSG_TYPE = "msgType";
+    public static final String RULE_NODE_FUNCTION_NAME = "ruleNodeFunc";
+
+    private static final String JS_WRAPPER_PREFIX_TEMPLATE = "function %s(msgStr, metadataStr, msgType) { " +
+            "    var msg = JSON.parse(msgStr); " +
+            "    var metadata = JSON.parse(metadataStr); " +
+            "    return JSON.stringify(%s(msg, metadata, msgType));" +
+            "    function %s(%s, %s, %s) {";
+    private static final String JS_WRAPPER_SUFFIX = "}" +
+            "\n}";
+
+
+    public static String generateRuleNodeScript(String functionName, String scriptBody, String... argNames) {
+        String msgArg;
+        String metadataArg;
+        String msgTypeArg;
+        if (argNames != null && argNames.length == 3) {
+            msgArg = argNames[0];
+            metadataArg = argNames[1];
+            msgTypeArg = argNames[2];
+        } else {
+            msgArg = MSG;
+            metadataArg = METADATA;
+            msgTypeArg = MSG_TYPE;
+        }
+        String jsWrapperPrefix = String.format(JS_WRAPPER_PREFIX_TEMPLATE, functionName,
+                RULE_NODE_FUNCTION_NAME, RULE_NODE_FUNCTION_NAME, msgArg, metadataArg, msgTypeArg);
+        return jsWrapperPrefix + scriptBody + JS_WRAPPER_SUFFIX;
+    }
+
+}
diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml
index 50f6e3e..018b47e 100644
--- a/application/src/main/resources/thingsboard.yml
+++ b/application/src/main/resources/thingsboard.yml
@@ -243,6 +243,8 @@ actors:
       monitor_thread_pool_size: "${ACTORS_RULE_JS_SANDBOX_MONITOR_THREAD_POOL_SIZE:4}"
       # Maximum CPU time in milliseconds allowed for script execution
       max_cpu_time: "${ACTORS_RULE_JS_SANDBOX_MAX_CPU_TIME:100}"
+      # Maximum allowed JavaScript execution errors before JavaScript will be blacklisted
+      max_errors: "${ACTORS_RULE_JS_SANDBOX_MAX_ERRORS:3}"
     chain:
       # Errors for particular actor are persisted once per specified amount of milliseconds
       error_persist_frequency: "${ACTORS_RULE_CHAIN_ERROR_FREQUENCY:3000}"
diff --git a/application/src/test/java/org/thingsboard/server/service/script/TestNashornJsSandboxService.java b/application/src/test/java/org/thingsboard/server/service/script/TestNashornJsSandboxService.java
index 84cca0c..f5f49e0 100644
--- a/application/src/test/java/org/thingsboard/server/service/script/TestNashornJsSandboxService.java
+++ b/application/src/test/java/org/thingsboard/server/service/script/TestNashornJsSandboxService.java
@@ -16,39 +16,40 @@
 
 package org.thingsboard.server.service.script;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import delight.nashornsandbox.NashornSandbox;
 import delight.nashornsandbox.NashornSandboxes;
 
 import javax.script.ScriptException;
+import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-public class TestNashornJsSandboxService implements JsSandboxService {
+public class TestNashornJsSandboxService extends AbstractNashornJsSandboxService {
 
-    private NashornSandbox sandbox = NashornSandboxes.create();
-    private ExecutorService monitorExecutorService;
+    private final int monitorThreadPoolSize;
+    private final long maxCpuTime;
+    private final int maxErrors;
 
-    public TestNashornJsSandboxService(int monitorThreadPoolSize, long maxCpuTime) {
-        monitorExecutorService = Executors.newFixedThreadPool(monitorThreadPoolSize);
-        sandbox.setExecutor(monitorExecutorService);
-        sandbox.setMaxCPUTime(maxCpuTime);
-        sandbox.allowNoBraces(false);
-        sandbox.setMaxPreparedStatements(30);
+    public TestNashornJsSandboxService(int monitorThreadPoolSize, long maxCpuTime, int maxErrors) {
+        this.monitorThreadPoolSize = monitorThreadPoolSize;
+        this.maxCpuTime = maxCpuTime;
+        this.maxErrors = maxErrors;
+        init();
     }
 
     @Override
-    public Object eval(String js) throws ScriptException {
-        return sandbox.eval(js);
+    protected int getMonitorThreadPoolSize() {
+        return monitorThreadPoolSize;
     }
 
     @Override
-    public Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException {
-        return sandbox.getSandboxedInvocable().invokeFunction(name, args);
+    protected long getMaxCpuTime() {
+        return maxCpuTime;
     }
 
-    public void destroy() {
-        if (monitorExecutorService != null) {
-            monitorExecutorService.shutdownNow();
-        }
+    @Override
+    protected int getMaxErrors() {
+        return maxErrors;
     }
 }
diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
index 31b7913..7349176 100644
--- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
+++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
@@ -90,6 +90,6 @@ public interface TbContext {
 
     MailService getMailService();
 
-    ScriptEngine createJsScriptEngine(String script, String functionName, String... argNames);
+    ScriptEngine createJsScriptEngine(String script, String... argNames);
 
 }
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java
index adb861b..8cf00cc 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java
@@ -43,7 +43,7 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura
     @Override
     public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
         this.config = loadAlarmNodeConfig(configuration);
-        this.buildDetailsJsEngine = ctx.createJsScriptEngine(config.getAlarmDetailsBuildJs(), "Details");
+        this.buildDetailsJsEngine = ctx.createJsScriptEngine(config.getAlarmDetailsBuildJs());
     }
 
     protected abstract C loadAlarmNodeConfig(TbNodeConfiguration configuration) throws TbNodeException;
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
index 595826f..892b4d7 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
@@ -46,7 +46,7 @@ public class TbLogNode implements TbNode {
     @Override
     public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
         this.config = TbNodeUtils.convert(configuration, TbLogNodeConfiguration.class);
-        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "ToString");
+        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript());
     }
 
     @Override
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java
index 9ad08c1..5de3dff 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java
@@ -65,7 +65,7 @@ public class TbMsgGeneratorNode implements TbNode {
         } else {
             originatorId = ctx.getSelfId();
         }
-        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "Generate", "prevMsg", "prevMetadata", "prevMsgType");
+        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "prevMsg", "prevMetadata", "prevMsgType");
         sentTickMsg(ctx);
     }
 
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsFilterNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsFilterNode.java
index c77d122..5075578 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsFilterNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsFilterNode.java
@@ -45,7 +45,7 @@ public class TbJsFilterNode implements TbNode {
     @Override
     public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
         this.config = TbNodeUtils.convert(configuration, TbJsFilterNodeConfiguration.class);
-        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "Filter");
+        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript());
     }
 
     @Override
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsSwitchNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsSwitchNode.java
index 8d60dd3..ac39eb5 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsSwitchNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbJsSwitchNode.java
@@ -47,7 +47,7 @@ public class TbJsSwitchNode implements TbNode {
     @Override
     public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
         this.config = TbNodeUtils.convert(configuration, TbJsSwitchNodeConfiguration.class);
-        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "Switch");
+        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript());
     }
 
     @Override
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbTransformMsgNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbTransformMsgNode.java
index 6edea6b..0334c3d 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbTransformMsgNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbTransformMsgNode.java
@@ -43,7 +43,7 @@ public class TbTransformMsgNode extends TbAbstractTransformNode {
     @Override
     public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
         this.config = TbNodeUtils.convert(configuration, TbTransformMsgNodeConfiguration.class);
-        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "Transform");
+        this.jsEngine = ctx.createJsScriptEngine(config.getJsScript());
         setConfig(config);
     }
 
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java
index d5e594a..bdc61e9 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java
@@ -152,7 +152,7 @@ public class TbAlarmNodeTest {
 
         verifyError(msg, "message", NotImplementedException.class);
 
-        verify(ctx).createJsScriptEngine("DETAILS", "Details");
+        verify(ctx).createJsScriptEngine("DETAILS");
         verify(ctx, times(1)).getJsExecutor();
         verify(ctx).getAlarmService();
         verify(ctx, times(2)).getDbCallbackExecutor();
@@ -314,7 +314,7 @@ public class TbAlarmNodeTest {
             ObjectMapper mapper = new ObjectMapper();
             TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
 
-            when(ctx.createJsScriptEngine("DETAILS", "Details")).thenReturn(detailsJs);
+            when(ctx.createJsScriptEngine("DETAILS")).thenReturn(detailsJs);
 
             when(ctx.getTenantId()).thenReturn(tenantId);
             when(ctx.getJsExecutor()).thenReturn(executor);
@@ -338,7 +338,7 @@ public class TbAlarmNodeTest {
             ObjectMapper mapper = new ObjectMapper();
             TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
 
-            when(ctx.createJsScriptEngine("DETAILS", "Details")).thenReturn(detailsJs);
+            when(ctx.createJsScriptEngine("DETAILS")).thenReturn(detailsJs);
 
             when(ctx.getTenantId()).thenReturn(tenantId);
             when(ctx.getJsExecutor()).thenReturn(executor);
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java
index 50dd869..aeb20bb 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java
@@ -97,7 +97,7 @@ public class TbJsFilterNodeTest {
         ObjectMapper mapper = new ObjectMapper();
         TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
 
-        when(ctx.createJsScriptEngine("scr", "Filter")).thenReturn(scriptEngine);
+        when(ctx.createJsScriptEngine("scr")).thenReturn(scriptEngine);
 
         node = new TbJsFilterNode();
         node.init(ctx, nodeConfiguration);
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java
index cc4c297..6d62009 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java
@@ -79,7 +79,7 @@ public class TbJsSwitchNodeTest {
         ObjectMapper mapper = new ObjectMapper();
         TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
 
-        when(ctx.createJsScriptEngine("scr", "Switch")).thenReturn(scriptEngine);
+        when(ctx.createJsScriptEngine("scr")).thenReturn(scriptEngine);
 
         node = new TbJsSwitchNode();
         node.init(ctx, nodeConfiguration);
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java
index 5a71b7c..48e6353 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java
@@ -97,7 +97,7 @@ public class TbTransformMsgNodeTest {
         ObjectMapper mapper = new ObjectMapper();
         TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
 
-        when(ctx.createJsScriptEngine("scr", "Transform")).thenReturn(scriptEngine);
+        when(ctx.createJsScriptEngine("scr")).thenReturn(scriptEngine);
 
         node = new TbTransformMsgNode();
         node.init(ctx, nodeConfiguration);