using Elsa.Common.DistributedLocks.Noop; using Elsa.EntityFrameworkCore.Extensions; using Elsa.EntityFrameworkCore.Modules.Management; using Elsa.EntityFrameworkCore.Modules.Runtime; using Elsa.MassTransit.Options; using Elsa.Extensions; using Elsa.ServerAndStudio.Web.Extensions; using Elsa.MassTransit.Extensions; using Elsa.ServerAndStudio.Web.Enums; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.Sqlite; using Proto.Persistence.Sqlite; const bool useMassTransit = true; const bool useProtoActor = false; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseStaticWebAssets(); var services = builder.Services; var configuration = builder.Configuration; var sqliteConnectionString = configuration.GetConnectionString("Sqlite")!; var rabbitMqConnectionString = configuration.GetConnectionString("RabbitMq")!; var azureServiceBusConnectionString = configuration.GetConnectionString("AzureServiceBus")!; var identitySection = configuration.GetSection("Identity"); var identityTokenSection = identitySection.GetSection("Tokens"); var massTransitSection = configuration.GetSection("MassTransit"); var massTransitDispatcherSection = configuration.GetSection("MassTransit.Dispatcher"); var heartbeatSection = configuration.GetSection("Heartbeat"); const MassTransitBroker useMassTransitBroker = MassTransitBroker.AzureServiceBus; services.Configure(massTransitSection); services.Configure(massTransitDispatcherSection); // Add Elsa services. services .AddElsa(elsa => { elsa .UseSasTokens() .UseIdentity(identity => { identity.IdentityOptions = options => identitySection.Bind(options); identity.TokenOptions = options => identityTokenSection.Bind(options); identity.UseConfigurationBasedUserProvider(options => identitySection.Bind(options)); identity.UseConfigurationBasedApplicationProvider(options => identitySection.Bind(options)); identity.UseConfigurationBasedRoleProvider(options => identitySection.Bind(options)); }) .UseDefaultAuthentication() .UseInstanceManagement(x => x.HeartbeatOptions = settings => heartbeatSection.Bind(settings)) .UseWorkflowManagement(management => { if (useMassTransit) { management.UseMassTransitDispatcher(); } management.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); }) .UseWorkflowRuntime(runtime => { runtime.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); runtime.UseMassTransitDispatcher(); if (useProtoActor) { runtime.UseProtoActor(proto => proto.PersistenceProvider = _ => { return new SqliteProvider(new SqliteConnectionStringBuilder(sqliteConnectionString)); }); } runtime.DistributedLockProvider = _ => new NoopDistributedSynchronizationProvider(); runtime.WorkflowInboxCleanupOptions = options => configuration.GetSection("Runtime:WorkflowInboxCleanup").Bind(options); runtime.WorkflowDispatcherOptions = options => configuration.GetSection("Runtime:WorkflowDispatcher").Bind(options); }) .UseScheduling() .UseJavaScript(options => options.AllowClrAccess = true) .UseLiquid() .UseCSharp() // .UsePython() .UseHttp(http => http.ConfigureHttpOptions = options => configuration.GetSection("Http").Bind(options)) .UseEmail(email => email.ConfigureOptions = options => configuration.GetSection("Smtp").Bind(options)) .UseWebhooks(webhooks => webhooks.WebhookOptions = options => builder.Configuration.GetSection("Webhooks").Bind(options)) .UseWorkflowsApi() .UseRealTimeWorkflows() .AddActivitiesFrom() .AddWorkflowsFrom(); if (useMassTransit) { elsa.UseMassTransit(massTransit => { switch (useMassTransitBroker) { case MassTransitBroker.AzureServiceBus: massTransit.UseAzureServiceBus(azureServiceBusConnectionString); break; case MassTransitBroker.RabbitMq: massTransit.UseRabbitMq(rabbitMqConnectionString); break; } } ); } }); services.AddHealthChecks(); services.AddCors(cors => cors.Configure(configuration.GetSection("CorsPolicy"))); // Razor Pages. services.AddRazorPages(options => options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute())); // Configure middleware pipeline. var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.MapHealthChecks("/health"); app.UseRouting(); app.UseCors(); app.UseStaticFiles(); app.UseAuthentication(); app.UseAuthorization(); app.UseWorkflowsApi(); app.UseWorkflows(); app.UseWorkflowsSignalRHubs(); app.MapFallbackToPage("/_Host"); app.Run();