Skip to content

Commit 587450e

Browse files
committed
Introduce Run.script task with JavaScript
Signed-off-by: Matheus Cruz <matheuscruz.dev@gmail.com>
1 parent e825fd0 commit 587450e

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

impl/core/src/main/java/io/serverlessworkflow/impl/executors/RunScriptExecutor.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737

3838
public class RunScriptExecutor implements RunnableTask<RunScript> {
3939

40-
public enum ScriptLanguage {
40+
public enum LanguageId {
4141
JS("js"),
4242
PYTHON("python");
4343

4444
private final String lang;
4545

46-
ScriptLanguage(String lang) {
46+
LanguageId(String lang) {
4747
this.lang = lang;
4848
}
4949

@@ -52,7 +52,7 @@ public String getLang() {
5252
}
5353

5454
public static boolean isSupported(String lang) {
55-
for (ScriptLanguage l : ScriptLanguage.values()) {
55+
for (LanguageId l : LanguageId.values()) {
5656
if (l.getLang().equalsIgnoreCase(lang)) {
5757
return true;
5858
}
@@ -68,8 +68,10 @@ private interface CodeSupplier {
6868

6969
@SuppressWarnings("rawtypes")
7070
private Map<String, WorkflowValueResolver> environmentExpr;
71+
7172
@SuppressWarnings("rawtypes")
7273
private Map<String, WorkflowValueResolver> argumentExpr;
74+
7375
private CodeSupplier codeSupplier;
7476
private boolean isAwait;
7577
private RunTaskConfiguration.ProcessReturnType returnType;
@@ -82,13 +84,13 @@ public void init(RunScript taskConfiguration, WorkflowDefinition definition) {
8284
String language = scriptUnion.get().getLanguage();
8385

8486
WorkflowApplication application = definition.application();
85-
if (language == null || !ScriptLanguage.isSupported(language)) {
87+
if (language == null || !LanguageId.isSupported(language)) {
8688
throw new IllegalArgumentException(
8789
"Unsupported script language: "
8890
+ language
8991
+ ". Supported languages are: "
9092
+ Arrays.toString(
91-
Arrays.stream(ScriptLanguage.values()).map(ScriptLanguage::getLang).toArray()));
93+
Arrays.stream(LanguageId.values()).map(LanguageId::getLang).toArray()));
9294
}
9395

9496
this.taskRunner =
@@ -161,7 +163,7 @@ public CompletableFuture<WorkflowModel> apply(
161163

162164
String code = this.codeSupplier.apply(workflowContext, taskContext);
163165

164-
RunScriptContext ctx =
166+
RunScriptContext scriptContext =
165167
builder
166168
.withApplication(workflowContext.definition().application())
167169
.withReturnType(returnType)
@@ -171,7 +173,8 @@ public CompletableFuture<WorkflowModel> apply(
171173
.withAwait(isAwait)
172174
.build();
173175

174-
return CompletableFuture.supplyAsync(() -> taskRunner.buildRun(taskContext).apply(ctx, input));
176+
return CompletableFuture.supplyAsync(
177+
() -> taskRunner.buildRun(taskContext).apply(scriptContext, input));
175178
}
176179

177180
@Override

impl/core/src/main/java/io/serverlessworkflow/impl/executors/ScriptTaskRunner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public interface ScriptTaskRunner {
2525
/**
2626
* The scripting language supported by this script task runner.
2727
*
28-
* @return the scripting language as {@link RunScriptExecutor.ScriptLanguage} enum.
28+
* @return the scripting language as {@link RunScriptExecutor.LanguageId} enum.
2929
*/
30-
RunScriptExecutor.ScriptLanguage forLanguage();
30+
RunScriptExecutor.LanguageId identifier();
3131

3232
/**
3333
* Returns a function that executes the script task.

impl/script-js/src/main/java/io/serverlessworkflow/impl/executors/script/js/JavaScriptScriptTaskRunner.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,25 @@
2929
import java.util.function.BiFunction;
3030
import org.graalvm.polyglot.Context;
3131
import org.graalvm.polyglot.PolyglotException;
32+
import org.graalvm.polyglot.Source;
3233
import org.graalvm.polyglot.Value;
3334

35+
/**
36+
* JavaScript implementation of the {@link ScriptTaskRunner} interface that executes JavaScript
37+
* scripts using GraalVM Polyglot API.
38+
*/
3439
public class JavaScriptScriptTaskRunner implements ScriptTaskRunner {
3540

3641
@Override
37-
public RunScriptExecutor.ScriptLanguage forLanguage() {
38-
return RunScriptExecutor.ScriptLanguage.JS;
42+
public RunScriptExecutor.LanguageId identifier() {
43+
return RunScriptExecutor.LanguageId.JS;
3944
}
4045

4146
@Override
4247
public BiFunction<RunScriptExecutor.RunScriptContext, WorkflowModel, WorkflowModel> buildRun(
4348
TaskContext taskContext) {
4449
return (script, input) -> {
45-
String js = forLanguage().getLang();
50+
String js = identifier().getLang();
4651
WorkflowApplication application = script.getApplication();
4752
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
4853
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
@@ -77,7 +82,7 @@ public BiFunction<RunScriptExecutor.RunScriptContext, WorkflowModel, WorkflowMod
7782
return application.modelFactory().fromAny(input);
7883
}
7984

80-
ctx.eval(js, script.getCode());
85+
ctx.eval(Source.create(js, script.getCode()));
8186

8287
return switch (script.getReturnType()) {
8388
case ALL ->
@@ -126,7 +131,7 @@ private String buildStderr(PolyglotException e, ByteArrayOutputStream stderr) {
126131
* @param envs the environment variables to set
127132
*/
128133
private void configureProcessEnv(Context context, Map<String, String> envs) {
129-
String js = RunScriptExecutor.ScriptLanguage.JS.getLang();
134+
String js = RunScriptExecutor.LanguageId.JS.getLang();
130135
Value bindings = context.getBindings(js);
131136
Value process = context.eval(js, "({ env: {} })");
132137

0 commit comments

Comments
 (0)