Implement activity output JS support

This commit is contained in:
Sipke Schoorstra 2022-04-27 22:30:29 +02:00
parent cae0bf9968
commit aa176222df
2 changed files with 49 additions and 0 deletions

View file

@ -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<IExpressionSyntaxProvider, JavaScriptExpressionSyntaxProvider>()
.AddSingleton<IJavaScriptEvaluator, JintJavaScriptEvaluator>()
.AddNotificationHandlersFrom<ConfigureJavaScriptEngineWithActivityOutput>()
.AddExpressionHandler<JavaScriptExpressionHandler, JavaScriptExpression>();
}
}

View file

@ -0,0 +1,46 @@
using Elsa.Mediator.Services;
using Elsa.Models;
using Elsa.Scripting.JavaScript.Notifications;
using Elsa.Services;
namespace Elsa.Scripting.JavaScript.Handlers;
/// <summary>
/// Makes available activity output to the JavaScript runtime environment.
/// </summary>
public class ConfigureJavaScriptEngineWithActivityOutput : INotificationHandler<EvaluatingJavaScript>
{
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<string, object>();
foreach (var node in graph)
{
var properties = node.Activity.GetOutputs().ToList();
var jsActivity = new Dictionary<string, object?>();
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;
}
}