diff --git a/src/scripting/Elsa.Scripting.JavaScript/Extensions/ServiceCollectionExtensions.cs b/src/scripting/Elsa.Scripting.JavaScript/Extensions/ServiceCollectionExtensions.cs index ce4cba93a..355053b75 100644 --- a/src/scripting/Elsa.Scripting.JavaScript/Extensions/ServiceCollectionExtensions.cs +++ b/src/scripting/Elsa.Scripting.JavaScript/Extensions/ServiceCollectionExtensions.cs @@ -1,5 +1,7 @@ using Elsa.Management.Services; +using Elsa.Mediator.Extensions; using Elsa.Scripting.JavaScript.Expressions; +using Elsa.Scripting.JavaScript.Handlers; using Elsa.Scripting.JavaScript.Implementations; using Elsa.Scripting.JavaScript.Providers; using Elsa.Scripting.JavaScript.Services; @@ -14,6 +16,7 @@ public static class ServiceCollectionExtensions return services .AddSingleton() .AddSingleton() + .AddNotificationHandlersFrom() .AddExpressionHandler(); } } \ No newline at end of file diff --git a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs new file mode 100644 index 000000000..14f25d66c --- /dev/null +++ b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs @@ -0,0 +1,46 @@ +using Elsa.Mediator.Services; +using Elsa.Models; +using Elsa.Scripting.JavaScript.Notifications; +using Elsa.Services; + +namespace Elsa.Scripting.JavaScript.Handlers; + +/// +/// Makes available activity output to the JavaScript runtime environment. +/// +public class ConfigureJavaScriptEngineWithActivityOutput : INotificationHandler +{ + private readonly IActivityWalker _activityWalker; + + public ConfigureJavaScriptEngineWithActivityOutput(IActivityWalker activityWalker) + { + _activityWalker = activityWalker; + } + + public Task HandleAsync(EvaluatingJavaScript notification, CancellationToken cancellationToken) + { + var engine = notification.Engine; + var workflow = notification.Context.Workflow; + var graph = _activityWalker.Walk(workflow.Root).Flatten(); + var register = notification.Context.Register; + var jsActivities = new Dictionary(); + + foreach (var node in graph) + { + var properties = node.Activity.GetOutputs().ToList(); + var jsActivity = new Dictionary(); + + foreach (var property in properties) + { + if (register.TryGetLocation(property.Value.LocationReference.Id, out var location)) + jsActivity[property.Name] = location.Value; + } + + jsActivities[node.NodeId] = jsActivity; + } + + engine.SetValue("activities", jsActivities); + + return Task.CompletedTask; + } +} \ No newline at end of file