Update dependencies and streamline JavaScript engine configuration

Refactor InputFunctionsDefinitionProvider to remove unused parameter. Simplify JintJavaScriptEvaluator object wrapping configuration and update Jint package to version 4.0.1. Add type Random to ConfigureEngineWithCommonTypes and enhance error handling in TaskReporter.
This commit is contained in:
Sipke Schoorstra 2024-08-14 21:14:08 +02:00
parent d0316687c1
commit 96371b683c
7 changed files with 30 additions and 23 deletions

View file

@ -44,7 +44,7 @@
<PackageVersion Include="Humanizer.Core" Version="2.14.1" />
<PackageVersion Include="IronCompress" Version="1.5.2" />
<PackageVersion Include="JetBrains.Annotations" Version="2024.2.0" />
<PackageVersion Include="Jint" Version="4.0.0" />
<PackageVersion Include="Jint" Version="4.0.1" />
<PackageVersion Include="LinqKit.Core" Version="1.2.5" />
<PackageVersion Include="MailKit" Version="4.7.1.1" />
<PackageVersion Include="MassTransit" Version="8.2.3" />

View file

@ -19,6 +19,7 @@ public class ConfigureEngineWithCommonTypes : INotificationHandler<EvaluatingJav
engine.RegisterType<DateTimeOffset>();
engine.RegisterType<TimeSpan>();
engine.RegisterType<Guid>();
engine.RegisterType<Random>();
return Task.CompletedTask;
}

View file

@ -2,6 +2,7 @@ using Elsa.JavaScript.Contracts;
using Elsa.JavaScript.TypeDefinitions.Abstractions;
using Elsa.JavaScript.TypeDefinitions.Models;
using Elsa.Workflows.Activities;
using Elsa.Workflows.Management;
using Humanizer;
using JetBrains.Annotations;
@ -9,8 +10,7 @@ namespace Elsa.JavaScript.Providers;
/// Produces <see cref="FunctionDefinition"/>s for common functions.
[UsedImplicitly]
internal class InputFunctionsDefinitionProvider(ITypeAliasRegistry typeAliasRegistry, IWorkflowDefinitionService workflowDefinitionService)
: FunctionDefinitionProvider
internal class InputFunctionsDefinitionProvider(ITypeAliasRegistry typeAliasRegistry) : FunctionDefinitionProvider
{
protected override ValueTask<IEnumerable<FunctionDefinition>> GetFunctionDefinitionsAsync(TypeDefinitionContext context)
{

View file

@ -1,5 +1,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Security.Cryptography;
using System.Text;
using Acornima.Ast;
using Elsa.Expressions.Helpers;
using Elsa.Expressions.Models;
using Elsa.JavaScript.Contracts;
@ -8,7 +10,6 @@ using Elsa.JavaScript.Notifications;
using Elsa.JavaScript.ObjectConverters;
using Elsa.JavaScript.Options;
using Elsa.Mediator.Contracts;
using Esprima.Ast;
using Jint;
using Jint.Runtime.Interop;
using Microsoft.Extensions.Caching.Memory;
@ -46,18 +47,13 @@ public class JintJavaScriptEvaluator(IConfiguration configuration, INotification
options ??= new ExpressionEvaluatorOptions();
var engineOptions = new Jint.Options();
;
if (_jintOptions.AllowClrAccess)
engineOptions.AllowClr();
// Wrap objects in ObjectWrapper instances and set their prototype to Array.prototype if they are array-like.
engineOptions.SetWrapObjectHandler((engine, target, type) =>
{
ConfigureClrAccess(opts);
ConfigureObjectWrapper(opts);
ConfigureObjectConverters(opts);
});
ConfigureClrAccess(engineOptions);
ConfigureObjectWrapper(engineOptions);
ConfigureObjectConverters(engineOptions);
engineOptions.Interop.ObjectConverters.Add(new ByteArrayConverter());

View file

@ -12,8 +12,8 @@ internal class CommonTypeDefinitionProvider(ITypeDescriber typeDescriber) : Type
{
protected override IEnumerable<TypeDefinition> GetTypeDefinitions(TypeDefinitionContext context)
{
yield return _typeDescriber.DescribeType(typeof(Guid));
yield return _typeDescriber.DescribeType(typeof(JsonObject));
yield return _typeDescriber.DescribeType(typeof(Random));
yield return typeDescriber.DescribeType(typeof(Guid));
yield return typeDescriber.DescribeType(typeof(JsonObject));
yield return typeDescriber.DescribeType(typeof(Random));
}
}

View file

@ -1,13 +1,12 @@
using Elsa.Abstractions;
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity;
using Elsa.Workflows.Management.Contracts;
using Elsa.Workflows.Management;
using JetBrains.Annotations;
namespace Elsa.Workflows.Api.Endpoints.ActivityDescriptors.List;
[PublicAPI]
internal class List(IActivityRegistry registry, IActivityRegistryPopulator registryPopulator, WorkflowDefinitionActivityProvider workflowDefinitionActivityProvider) : ElsaEndpointWithoutRequest<Response>
internal class List(IActivityRegistry registry, IActivityRegistryPopulator registryPopulator) : ElsaEndpointWithoutRequest<Response>
{
public override void Configure()
{

View file

@ -1,25 +1,36 @@
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Helpers;
using Elsa.Workflows.Runtime.Activities;
using Elsa.Workflows.Runtime.Options;
using Elsa.Workflows.Runtime.Stimuli;
namespace Elsa.Workflows.Runtime;
/// <inheritdoc />
public class TaskReporter(IStimulusSender stimulusSender) : ITaskReporter
public class TaskReporter(IBookmarkQueue stimulusSender, IStimulusHasher stimulusHasher) : ITaskReporter
{
private static readonly string ActivityTypeName = ActivityTypeNameHelper.GenerateTypeName<RunTask>();
/// <inheritdoc />
public async Task ReportCompletionAsync(string taskId, object? result = default, CancellationToken cancellationToken = default)
{
var bookmarkPayload = new RunTaskStimulus(taskId, default!);
var stimulus = new RunTaskStimulus(taskId, default!);
var input = new Dictionary<string, object>
{
[RunTask.InputKey] = result!
};
var sender = new StimulusMetadata
var bookmarkQueueItem = new NewBookmarkQueueItem
{
Input = input,
ActivityTypeName = ActivityTypeName,
StimulusHash = stimulusHasher.Hash(ActivityTypeName, stimulus),
Options = new ResumeBookmarkOptions
{
Input = input
}
};
await stimulusSender.SendAsync<RunTask>(bookmarkPayload, sender, cancellationToken: cancellationToken);
await stimulusSender.EnqueueAsync(bookmarkQueueItem, cancellationToken);
}
}