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);
}
}