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="Humanizer.Core" Version="2.14.1" />
<PackageVersion Include="IronCompress" Version="1.5.2" /> <PackageVersion Include="IronCompress" Version="1.5.2" />
<PackageVersion Include="JetBrains.Annotations" Version="2024.2.0" /> <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="LinqKit.Core" Version="1.2.5" />
<PackageVersion Include="MailKit" Version="4.7.1.1" /> <PackageVersion Include="MailKit" Version="4.7.1.1" />
<PackageVersion Include="MassTransit" Version="8.2.3" /> <PackageVersion Include="MassTransit" Version="8.2.3" />

View file

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

View file

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

View file

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

View file

@ -1,13 +1,12 @@
using Elsa.Abstractions; using Elsa.Abstractions;
using Elsa.Workflows.Contracts; using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity; using Elsa.Workflows.Management;
using Elsa.Workflows.Management.Contracts;
using JetBrains.Annotations; using JetBrains.Annotations;
namespace Elsa.Workflows.Api.Endpoints.ActivityDescriptors.List; namespace Elsa.Workflows.Api.Endpoints.ActivityDescriptors.List;
[PublicAPI] [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() 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.Activities;
using Elsa.Workflows.Runtime.Options;
using Elsa.Workflows.Runtime.Stimuli; using Elsa.Workflows.Runtime.Stimuli;
namespace Elsa.Workflows.Runtime; namespace Elsa.Workflows.Runtime;
/// <inheritdoc /> /// <inheritdoc />
public class TaskReporter(IStimulusSender stimulusSender) : ITaskReporter public class TaskReporter(IBookmarkQueue stimulusSender, IStimulusHasher stimulusHasher) : ITaskReporter
{ {
private static readonly string ActivityTypeName = ActivityTypeNameHelper.GenerateTypeName<RunTask>();
/// <inheritdoc /> /// <inheritdoc />
public async Task ReportCompletionAsync(string taskId, object? result = default, CancellationToken cancellationToken = default) 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> var input = new Dictionary<string, object>
{ {
[RunTask.InputKey] = result! [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);
} }
} }