using Elsa.Mediator; using Elsa.Mediator.Contracts; using Elsa.Mediator.PublishingStrategies; using Elsa.Workflows.Runtime.Activities; using Elsa.Workflows.Runtime.Bookmarks; using Elsa.Workflows.Runtime.Contracts; using Elsa.Workflows.Runtime.Models; using Elsa.Workflows.Runtime.Options; namespace Elsa.Workflows.Runtime.Services; /// public class EventPublisher : IEventPublisher { private readonly IWorkflowInbox _workflowInbox; /// /// Constructor. /// public EventPublisher(IWorkflowInbox workflowInbox) { _workflowInbox = workflowInbox; } /// public async Task PublishAsync( string eventName, string? correlationId = default, string? workflowInstanceId = default, string? activityInstanceId = default, IDictionary? input = default, CancellationToken cancellationToken = default) { await PublishInternalAsync(eventName, NotificationStrategy.Sequential, correlationId, workflowInstanceId, activityInstanceId, input, cancellationToken); } /// public async Task DispatchAsync( string eventName, string? correlationId = default, string? workflowInstanceId = default, string? activityInstanceId = default, IDictionary? input = default, CancellationToken cancellationToken = default) { await PublishInternalAsync(eventName, NotificationStrategy.FireAndForget, correlationId, workflowInstanceId, activityInstanceId, input, cancellationToken); } private async Task PublishInternalAsync( string eventName, IEventPublishingStrategy publishingStrategy, string? correlationId = default, string? workflowInstanceId = default, string? activityInstanceId = default, IDictionary? input = default, CancellationToken cancellationToken = default) { var eventBookmark = new EventBookmarkPayload(eventName); var message = NewWorkflowInboxMessage.For(eventBookmark, workflowInstanceId, correlationId, activityInstanceId, input); var options = new WorkflowInboxMessageDeliveryOptions { EventPublishingStrategy = publishingStrategy, }; await _workflowInbox.SubmitAsync(message, options, cancellationToken); } }