elsa-core/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngine.cs

72 lines
3.1 KiB
C#
Raw Normal View History

2021-03-04 15:11:18 +00:00
using System;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Scripting.JavaScript.Messages;
using Jint;
using Jint.Runtime.Interop;
using MediatR;
using Microsoft.Extensions.Configuration;
2021-03-04 15:11:18 +00:00
using NodaTime;
namespace Elsa.Scripting.JavaScript.Handlers
{
public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScriptExpression>
{
private readonly IConfiguration _configuration;
public ConfigureJavaScriptEngine(IConfiguration configuration)
{
_configuration = configuration;
}
2021-03-04 15:11:18 +00:00
public Task Handle(EvaluatingJavaScriptExpression notification, CancellationToken cancellationToken)
{
var activityContext = notification.ActivityExecutionContext;
var workflowExecutionContext = activityContext.WorkflowExecutionContext;
var workflowBlueprint = workflowExecutionContext.WorkflowBlueprint;
var workflowInstance = workflowExecutionContext.WorkflowInstance;
var engine = notification.Engine;
// Global functions.
engine.SetValue("guid", (Func<string>) (() => Guid.NewGuid().ToString()));
engine.SetValue("setVariable", (Action<string, object>) ((name, value) => activityContext.SetVariable(name, value)));
engine.SetValue("getVariable", (Func<string, object?>) (name => activityContext.GetVariable(name)));
engine.SetValue("getConfig", (Func<string, object?>) (name => _configuration.GetSection(name).Value));
2021-04-15 14:08:17 +00:00
engine.SetValue("isNullOrWhiteSpace", (Func<string, bool>) (string.IsNullOrWhiteSpace));
engine.SetValue("isNullOrEmpty", (Func<string, bool>) (string.IsNullOrEmpty));
2021-03-04 15:11:18 +00:00
// Global variables.
engine.SetValue("input", activityContext.Input);
engine.SetValue("correlationId", workflowInstance.CorrelationId);
engine.SetValue("currentCulture", CultureInfo.InvariantCulture);
2021-04-13 21:01:49 +00:00
engine.SetValue("workflowContext", activityContext.GetWorkflowContext());
2021-03-04 15:11:18 +00:00
// NodaTime types.
RegisterType<Instant>(engine);
RegisterType<Duration>(engine);
RegisterType<Period>(engine);
RegisterType<LocalDate>(engine);
RegisterType<LocalTime>(engine);
RegisterType<LocalDateTime>(engine);
var variables = workflowExecutionContext.GetMergedVariables();
2021-03-04 15:11:18 +00:00
// Add workflow variables.
foreach (var variable in variables.Data)
engine.SetValue(variable.Key, variable.Value);
// Add activity outputs.
foreach (var activity in workflowBlueprint.Activities.Where(x => x.Name is not null and not "" && workflowInstance.ActivityOutput.ContainsKey(x.Id)))
{
var output = new { Output = workflowInstance.ActivityOutput[activity.Id!] };
engine.SetValue(activity.Name, output);
}
2021-03-04 15:11:18 +00:00
return Task.CompletedTask;
}
2021-03-04 15:11:18 +00:00
private void RegisterType<T>(Engine engine) => engine.SetValue(typeof(T).Name, TypeReference.CreateTypeReference(engine, typeof(T)));
}
}