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 NodaTime;
|
|
|
|
|
|
|
|
|
|
namespace Elsa.Scripting.JavaScript.Handlers
|
|
|
|
|
{
|
|
|
|
|
public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScriptExpression>
|
|
|
|
|
{
|
|
|
|
|
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()));
|
2021-03-06 13:33:42 +00:00
|
|
|
engine.SetValue("setVariable", (Action<string, object>) ((name, value) => activityContext.SetVariable(name, value)));
|
|
|
|
|
engine.SetValue("getVariable", (Func<string, object?>) (name => activityContext.GetVariable(name)));
|
2021-03-11 21:50:18 +00:00
|
|
|
|
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-03-11 21:50:18 +00:00
|
|
|
|
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.WorkflowInstance.Variables;
|
|
|
|
|
|
|
|
|
|
// Add workflow variables.
|
|
|
|
|
foreach (var variable in variables.Data)
|
|
|
|
|
engine.SetValue(variable.Key, variable.Value);
|
|
|
|
|
|
|
|
|
|
// Add activity outputs.
|
2021-03-11 21:50:18 +00:00
|
|
|
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-11 21:50:18 +00:00
|
|
|
|
2021-03-04 15:11:18 +00:00
|
|
|
private void RegisterType<T>(Engine engine) => engine.SetValue(typeof(T).Name, TypeReference.CreateTypeReference(engine, typeof(T)));
|
|
|
|
|
}
|
|
|
|
|
}
|