using Elsa.Extensions; using Elsa.JavaScript.Notifications; using Elsa.JavaScript.TypeDefinitions.Builders; using Elsa.JavaScript.TypeDefinitions.Contracts; using Elsa.JavaScript.TypeDefinitions.Models; using Elsa.Mediator.Contracts; using JetBrains.Annotations; namespace Elsa.Http.Scripting.JavaScript; /// /// Configures the JavaScript engine with additional .NET types that can be instantiated. /// [PublicAPI] public class HttpJavaScriptHandler : INotificationHandler, ITypeDefinitionProvider, IFunctionDefinitionProvider { private readonly ITypeDescriber _typeDescriber; /// /// Initializes a new instance of the class. /// public HttpJavaScriptHandler(ITypeDescriber typeDescriber) { _typeDescriber = typeDescriber; } /// Task INotificationHandler.HandleAsync(EvaluatingJavaScript notification, CancellationToken cancellationToken) { var engine = notification.Engine; engine.RegisterType(); engine.RegisterType(); var activityExecutionContext = notification.Context; engine.SetValue("createEventTriggerUrl", (Func)((eventName, lifetimeOrExpiryDate) => { return lifetimeOrExpiryDate switch { TimeSpan lifetime => activityExecutionContext.GenerateEventTriggerUrl(eventName, lifetime), DateTimeOffset expiryDate => activityExecutionContext.GenerateEventTriggerUrl(eventName, expiryDate), _ => activityExecutionContext.GenerateEventTriggerUrl(eventName) }; })); return Task.CompletedTask; } /// ValueTask> ITypeDefinitionProvider.GetTypeDefinitionsAsync(TypeDefinitionContext context) { var definitions = GetTypeDefinitions(context); return new(definitions); } /// ValueTask> IFunctionDefinitionProvider.GetFunctionDefinitionsAsync(TypeDefinitionContext context) { var definitions = GetFunctionDefinitions(context); return new(definitions); } private IEnumerable GetTypeDefinitions(TypeDefinitionContext context) { yield return _typeDescriber.DescribeType(typeof(HttpHeaders)); yield return _typeDescriber.DescribeType(typeof(Downloadable)); } private IEnumerable GetFunctionDefinitions(TypeDefinitionContext context) { yield return CreateFunctionDefinition(function => function.Name("createEventTriggerUrl").ReturnType("string").Parameter("eventName", "string")); yield return CreateFunctionDefinition(function => function.Name("createEventTriggerUrl").ReturnType("string").Parameter("eventName", "string").Parameter("lifetime", "TimeSpan")); yield return CreateFunctionDefinition(function => function.Name("createEventTriggerUrl").ReturnType("string").Parameter("eventName", "string").Parameter("expiresAt", "DateTimeOffset")); } private FunctionDefinition CreateFunctionDefinition(Action setup) { var builder = new FunctionDefinitionBuilder(); setup(builder); return builder.BuildFunctionDefinition(); } }