2023-03-07 13:54:21 +00:00
|
|
|
using Elsa.Extensions;
|
|
|
|
|
using Elsa.JavaScript.Notifications;
|
2023-09-24 22:38:06 +00:00
|
|
|
using Elsa.JavaScript.TypeDefinitions.Builders;
|
2023-09-16 09:06:56 +00:00
|
|
|
using Elsa.JavaScript.TypeDefinitions.Contracts;
|
|
|
|
|
using Elsa.JavaScript.TypeDefinitions.Models;
|
2023-03-07 13:54:21 +00:00
|
|
|
using Elsa.Mediator.Contracts;
|
|
|
|
|
using JetBrains.Annotations;
|
|
|
|
|
|
|
|
|
|
namespace Elsa.Http.Scripting.JavaScript;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-09-16 09:06:56 +00:00
|
|
|
/// Configures the JavaScript engine with additional .NET types that can be instantiated.
|
2023-03-07 13:54:21 +00:00
|
|
|
/// </summary>
|
|
|
|
|
[PublicAPI]
|
2023-09-24 22:38:06 +00:00
|
|
|
public class HttpJavaScriptHandler : INotificationHandler<EvaluatingJavaScript>, ITypeDefinitionProvider, IFunctionDefinitionProvider
|
2023-03-07 13:54:21 +00:00
|
|
|
{
|
2023-09-16 09:06:56 +00:00
|
|
|
private readonly ITypeDescriber _typeDescriber;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Initializes a new instance of the <see cref="HttpJavaScriptHandler"/> class.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public HttpJavaScriptHandler(ITypeDescriber typeDescriber)
|
|
|
|
|
{
|
|
|
|
|
_typeDescriber = typeDescriber;
|
|
|
|
|
}
|
2023-09-24 22:38:06 +00:00
|
|
|
|
2023-03-07 13:54:21 +00:00
|
|
|
/// <inheritdoc />
|
2023-09-24 22:38:06 +00:00
|
|
|
Task INotificationHandler<EvaluatingJavaScript>.HandleAsync(EvaluatingJavaScript notification, CancellationToken cancellationToken)
|
2023-03-07 13:54:21 +00:00
|
|
|
{
|
|
|
|
|
var engine = notification.Engine;
|
2023-12-08 20:53:43 +00:00
|
|
|
engine.RegisterType<HttpHeaders>();
|
2023-09-16 09:06:56 +00:00
|
|
|
engine.RegisterType<Downloadable>();
|
2023-09-24 22:38:06 +00:00
|
|
|
|
|
|
|
|
var activityExecutionContext = notification.Context;
|
|
|
|
|
|
|
|
|
|
engine.SetValue("createEventTriggerUrl", (Func<string, object?, string>)((eventName, lifetimeOrExpiryDate) =>
|
|
|
|
|
{
|
|
|
|
|
return lifetimeOrExpiryDate switch
|
|
|
|
|
{
|
|
|
|
|
TimeSpan lifetime => activityExecutionContext.GenerateEventTriggerUrl(eventName, lifetime),
|
|
|
|
|
DateTimeOffset expiryDate => activityExecutionContext.GenerateEventTriggerUrl(eventName, expiryDate),
|
|
|
|
|
_ => activityExecutionContext.GenerateEventTriggerUrl(eventName)
|
|
|
|
|
};
|
|
|
|
|
}));
|
2023-08-14 12:47:35 +00:00
|
|
|
return Task.CompletedTask;
|
2023-03-07 13:54:21 +00:00
|
|
|
}
|
2023-09-16 09:06:56 +00:00
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
2023-09-24 22:38:06 +00:00
|
|
|
ValueTask<IEnumerable<TypeDefinition>> ITypeDefinitionProvider.GetTypeDefinitionsAsync(TypeDefinitionContext context)
|
2023-09-16 09:06:56 +00:00
|
|
|
{
|
|
|
|
|
var definitions = GetTypeDefinitions(context);
|
|
|
|
|
return new(definitions);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 22:38:06 +00:00
|
|
|
/// <inheritdoc />
|
|
|
|
|
ValueTask<IEnumerable<FunctionDefinition>> IFunctionDefinitionProvider.GetFunctionDefinitionsAsync(TypeDefinitionContext context)
|
|
|
|
|
{
|
|
|
|
|
var definitions = GetFunctionDefinitions(context);
|
|
|
|
|
return new(definitions);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-16 09:06:56 +00:00
|
|
|
private IEnumerable<TypeDefinition> GetTypeDefinitions(TypeDefinitionContext context)
|
|
|
|
|
{
|
2023-12-08 20:53:43 +00:00
|
|
|
yield return _typeDescriber.DescribeType(typeof(HttpHeaders));
|
2023-09-16 09:06:56 +00:00
|
|
|
yield return _typeDescriber.DescribeType(typeof(Downloadable));
|
|
|
|
|
}
|
2023-09-24 22:38:06 +00:00
|
|
|
|
|
|
|
|
private IEnumerable<FunctionDefinition> 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<FunctionDefinitionBuilder> setup)
|
|
|
|
|
{
|
|
|
|
|
var builder = new FunctionDefinitionBuilder();
|
|
|
|
|
setup(builder);
|
|
|
|
|
return builder.BuildFunctionDefinition();
|
|
|
|
|
}
|
2023-03-07 13:54:21 +00:00
|
|
|
}
|