Signaling refactorings

This commit is contained in:
Sipke Schoorstra 2021-03-31 21:57:15 +02:00
parent d9b0f01029
commit 3fc3f792f2
16 changed files with 9546 additions and 926 deletions

View file

@ -27,7 +27,6 @@
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="5.0.0" />
<PackageReference Include="Open.Linq.AsyncExtensions" Version="1.2.0" />
</ItemGroup>

View file

@ -8,8 +8,7 @@ using Microsoft.AspNetCore.Mvc;
namespace Elsa.Activities.Http.Endpoints.Signals
{
[ApiController]
[ApiVersion("1")]
[Route("v{version:apiVersion}/signals/dispatch/{token}")]
[Route("signals/dispatch/{token}")]
[Produces("application/json")]
public class DispatchEndpoint : ControllerBase
{

View file

@ -8,8 +8,7 @@ using Microsoft.AspNetCore.Mvc;
namespace Elsa.Activities.Http.Endpoints.Signals
{
[ApiController]
[ApiVersion("1")]
[Route("v{version:apiVersion}/signals/trigger/{token}")]
[Route("signals/trigger/{token}")]
[Produces("application/json")]
public class TriggerEndpoint : ControllerBase
{

View file

@ -0,0 +1,22 @@
using Elsa.Activities.Http.Models;
using Elsa.Activities.Http.Services;
using Elsa.Services.Models;
namespace Elsa.Activities.Http.Extensions
{
public static class ActivityExecutionContextExtensions
{
public static string GenerateSignalUrl(this ActivityExecutionContext context, string signal)
{
var workflowInstanceId =
context.WorkflowExecutionContext.WorkflowInstance.Id;
var payload = new Signal(signal, workflowInstanceId);
var tokenService = context.GetService<ITokenService>();
var token = tokenService.CreateToken(payload);
var url = $"/signals/trigger/{token}";
var absoluteUrlProvider = context.GetService<IAbsoluteUrlProvider>();
return absoluteUrlProvider.ToAbsoluteUrl(url).ToString();
}
}
}

View file

@ -1,6 +1,7 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Activities.Http.Extensions;
using Elsa.Activities.Http.Models;
using Elsa.Activities.Http.Services;
using Elsa.Scripting.JavaScript.Messages;
@ -12,16 +13,13 @@ namespace Elsa.Activities.Http.Handlers
{
public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScriptExpression>
{
private readonly ITokenService _tokenService;
private readonly IAbsoluteUrlProvider _absoluteUrlProvider;
private readonly IHttpContextAccessor _httpContextAccessor;
public ConfigureJavaScriptEngine(
ITokenService tokenService,
IAbsoluteUrlProvider absoluteUrlProvider,
IHttpContextAccessor httpContextAccessor)
{
_tokenService = tokenService;
_absoluteUrlProvider = absoluteUrlProvider;
_httpContextAccessor = httpContextAccessor;
}
@ -33,7 +31,7 @@ namespace Elsa.Activities.Http.Handlers
engine.SetValue(
"queryString",
(Func<string, string>)(key => _httpContextAccessor.HttpContext.Request.Query[key].ToString())
(Func<string, string>)(key => _httpContextAccessor.HttpContext!.Request.Query[key].ToString())
);
engine.SetValue(
"absoluteUrl",
@ -41,22 +39,10 @@ namespace Elsa.Activities.Http.Handlers
);
engine.SetValue(
"signalUrl",
(Func<string, string>)(signal => GenerateUrl(signal, activityExecutionContext))
(Func<string, string>)(signal => activityExecutionContext.GenerateSignalUrl(signal))
);
return Task.CompletedTask;
}
private string GenerateUrl(string signal, ActivityExecutionContext activityExecutionContext)
{
var workflowInstanceId =
activityExecutionContext.WorkflowExecutionContext.WorkflowInstance.Id;
var payload = new Signal(signal, workflowInstanceId);
var token = _tokenService.CreateToken(payload);
var url = $"/workflows/signal?token={token}";
return _absoluteUrlProvider.ToAbsoluteUrl(url).ToString();
}
}
}

View file

@ -4,6 +4,6 @@ namespace Elsa.Metadata
{
public static class ActivityDescriberExtensions
{
public static ActivityDescriptor? Describe<T>(this IDescribeActivityType type) where T : IActivity => type.Describe(typeof(T));
public static ActivityDescriptor? Describe<T>(this IDescribesActivityType type) where T : IActivity => type.Describe(typeof(T));
}
}

View file

@ -2,7 +2,7 @@ using System;
namespace Elsa.Metadata
{
public interface IDescribeActivityType
public interface IDescribesActivityType
{
ActivityDescriptor? Describe(Type activityType);
}

View file

@ -12,15 +12,15 @@ namespace Elsa.ActivityTypeProviders
{
public class TypeBasedActivityProvider : IActivityTypeProvider
{
private readonly IDescribeActivityType _describeActivityType;
private readonly IDescribesActivityType _describesActivityType;
private readonly IActivityActivator _activityActivator;
private readonly ElsaOptions _elsaOptions;
public TypeBasedActivityProvider(ElsaOptions options,
IDescribeActivityType describeActivityType,
IDescribesActivityType describesActivityType,
IActivityActivator activityActivator)
{
_describeActivityType = describeActivityType;
_describesActivityType = describesActivityType;
_activityActivator = activityActivator;
_elsaOptions = options;
}
@ -31,7 +31,7 @@ namespace Elsa.ActivityTypeProviders
private ActivityType? CreateActivityType(Type activityType)
{
var info = _describeActivityType.Describe(activityType);
var info = _describesActivityType.Describe(activityType);
if (info == null)
return default;

View file

@ -153,7 +153,7 @@ namespace Microsoft.Extensions.DependencyInjection
// Metadata.
services
.AddSingleton<IDescribeActivityType, TypedActivityTypeDescriber>()
.AddSingleton<IDescribesActivityType, TypedActivityTypeDescriber>()
.AddSingleton<IActivityPropertyOptionsResolver, ActivityPropertyOptionsResolver>()
.AddSingleton<IActivityPropertyDefaultValueResolver, ActivityPropertyDefaultValueResolver>()
.AddSingleton<IActivityPropertyUIHintResolver, ActivityPropertyUIHintResolver>();

View file

@ -7,7 +7,7 @@ using Humanizer;
namespace Elsa.Metadata
{
public class TypedActivityTypeDescriber : IDescribeActivityType
public class TypedActivityTypeDescriber : IDescribesActivityType
{
private readonly IActivityPropertyOptionsResolver _optionsResolver;
private readonly IActivityPropertyUIHintResolver _uiHintResolver;

File diff suppressed because it is too large Load diff

View file

@ -27,29 +27,27 @@
"build:tailwind:prod": "cross-env NODE_ENV=production tailwind build ./tailwind.css -o ./src/globals/tailwind.css & copyfiles -u 2 \"./src/globals/tailwind.css\" \"./src/assets\""
},
"dependencies": {
"@fullhuman/postcss-purgecss": "^4.0.2",
"@stencil/core": "^2.4.0",
"@fullhuman/postcss-purgecss": "^4.0.3",
"@stencil/core": "^2.5.2",
"@stencil/postcss": "^2.0.0",
"@stencil/state-tunnel": "^1.0.1",
"@stencil/store": "^1.4.1",
"@tailwindcss/forms": "^0.2.1",
"@tailwindcss/ui": "^0.7.2",
"autoprefixer": "10.2.4",
"autoprefixer": "10.2.5",
"axios": "^0.21.1",
"cssnano": "^4.1.10",
"el-transition": "^0.0.7",
"eslint": "7.20.0",
"eslint": "7.23.0",
"js-event-bus": "^1.0.3",
"jsplumb": "2.15.5",
"monaco-editor": "^0.22.3",
"postcss": "^8.2.6",
"monaco-editor": "^0.23.0",
"postcss": "^8.2.9",
"postcss-import": "^14.0.0",
"postcss-preset-env": "^6.7.0",
"stencil-click-outside": "^1.7.1",
"tailwindcss": "2.0.3",
"tailwindcss": "2.0.4",
"tslint": "6.1.3",
"tslint-stencil": "1.0.1",
"typescript": "4.2.2",
"typescript": "4.2.3",
"typescript-tslint-plugin": "1.0.1"
},
"devDependencies": {

View file

@ -6,6 +6,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\activities\Elsa.Activities.Http\Elsa.Activities.Http.csproj" />
<ProjectReference Include="..\..\..\activities\Elsa.Activities.Temporal.Quartz\Elsa.Activities.Temporal.Quartz.csproj" />
<ProjectReference Include="..\..\..\core\Elsa\Elsa.csproj" />
</ItemGroup>

View file

@ -1,11 +1,19 @@
using Elsa.Samples.ForkJoinTimerAndSignalHttp.Workflows;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Samples.ForkJoinTimerAndSignalHttp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services
@ -14,6 +22,7 @@ namespace Elsa.Samples.ForkJoinTimerAndSignalHttp
services
.AddElsa(options => options
.AddConsoleActivities()
.AddHttpActivities(httpOptions => Configuration.GetSection("Elsa:Http").Bind(httpOptions))
.AddQuartzTemporalActivities()
.StartWorkflow<DemoWorkflow>()
);

View file

@ -1,5 +1,6 @@
using Elsa.Activities.Console;
using Elsa.Activities.ControlFlow;
using Elsa.Activities.Http.Extensions;
using Elsa.Activities.Primitives;
using Elsa.Activities.Temporal;
using Elsa.Builders;
@ -19,14 +20,15 @@ namespace Elsa.Samples.ForkJoinTimerAndSignalHttp.Workflows
public DemoWorkflow(IClock clock)
{
_clock = clock;
_timeOut = Duration.FromSeconds(10);
_timeOut = Duration.FromSeconds(20);
}
public void Build(IWorkflowBuilder builder)
{
builder
.SetVariable("SignalUrl", context => context.GenerateSignalUrl("hurry"))
.WriteLine(context =>
$"The demo completes in {_timeOut.ToString()} ({_clock.GetCurrentInstant().Plus(_timeOut)}). Can't wait that long? Send me the secret \"hurry\" signal! (http://localhost:7304/signal/hurry/trigger?correlationId={GetCorrelationId(context)})")
$"The demo completes in {_timeOut.ToString()} ({_clock.GetCurrentInstant().Plus(_timeOut)}). Can't wait that long? Send me the secret \"hurry\" signal! ({context.GetVariable<string>("SignalUrl")})")
.Then<Fork>(
fork => fork.WithBranches("Timer", "Signal"),
fork =>

View file

@ -1,9 +1,14 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Elsa": {
"Http": {
"BaseUrl": "http://localhost:7304"
}
}
}
}