elsa-core/src/scripting/Elsa.Scripting.JavaScript/Services/JintJavaScriptEvaluator.cs

66 lines
2.3 KiB
C#
Raw Normal View History

using System;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Scripting.JavaScript.Messages;
using Elsa.Scripting.JavaScript.Options;
using Elsa.Services.Models;
using Jint;
using MediatR;
using Microsoft.Extensions.Options;
namespace Elsa.Scripting.JavaScript.Services
{
public class JintJavaScriptEvaluator : IJavaScriptService
{
2021-04-14 18:20:49 +00:00
private readonly IMediator _mediator;
private readonly IConvertsJintEvaluationResult _resultConverter;
private readonly ScriptOptions _scriptOptions;
2021-04-14 18:20:49 +00:00
public JintJavaScriptEvaluator(
IMediator mediator,
IOptions<ScriptOptions> scriptOptions,
IConvertsJintEvaluationResult resultConverter)
{
if (scriptOptions is null)
throw new ArgumentNullException(nameof(scriptOptions));
2021-04-14 18:20:49 +00:00
_mediator = mediator;
_resultConverter = resultConverter;
_scriptOptions = scriptOptions.Value;
}
2021-04-14 18:20:49 +00:00
public async Task<object?> EvaluateAsync(
string expression,
Type returnType,
ActivityExecutionContext context,
Action<Engine>? configureEngine = default,
CancellationToken cancellationToken = default)
{
var engine = await GetConfiguredEngine(configureEngine, context, cancellationToken);
var result = ExecuteExpressionAndGetResult(engine, expression);
2021-04-14 18:20:49 +00:00
return _resultConverter.ConvertToDesiredType(result, returnType);
}
async Task<Engine> GetConfiguredEngine(Action<Engine>? configureEngine, ActivityExecutionContext context, CancellationToken cancellationToken)
{
2021-04-14 18:20:49 +00:00
var engine = new Engine(opts =>
{
if (_scriptOptions.AllowClr)
opts.AllowClr();
});
configureEngine?.Invoke(engine);
// Listeners invoked by the mediator might further-configure the engine
2021-04-14 18:20:49 +00:00
await _mediator.Publish(new EvaluatingJavaScriptExpression(engine, context), cancellationToken);
return engine;
}
2021-04-14 18:20:49 +00:00
private static object? ExecuteExpressionAndGetResult(Engine engine, string expression)
{
engine.Execute(expression);
return engine.GetCompletionValue().ToObject();
}
}
}