using Elsa.Mediator;
using Elsa.Mediator.Contracts;
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;
using Elsa.Workflows.Runtime.Results;
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,
object? payload = default,
CancellationToken cancellationToken = default)
{
return await PublishInternalAsync(eventName, false, correlationId, workflowInstanceId, activityInstanceId, payload, cancellationToken);
}
///
public async Task DispatchAsync(
string eventName,
string? correlationId = default,
string? workflowInstanceId = default,
string? activityInstanceId = default,
object? payload = default,
CancellationToken cancellationToken = default)
{
await PublishInternalAsync(eventName, true, correlationId, workflowInstanceId, activityInstanceId, payload, cancellationToken);
}
private async Task> PublishInternalAsync(
string eventName,
bool dispatchAsynchronously,
string? correlationId = default,
string? workflowInstanceId = default,
string? activityInstanceId = default,
object? payload = default,
CancellationToken cancellationToken = default)
{
var eventBookmark = new EventBookmarkPayload(eventName);
var workflowInput = new Dictionary
{
[Event.EventPayloadWorkflowInputKey] = payload ?? new Dictionary()
};
var message = NewWorkflowInboxMessage.For(eventBookmark, workflowInstanceId, correlationId, activityInstanceId, workflowInput);
var options = new WorkflowInboxMessageDeliveryOptions
{
DispatchAsynchronously = dispatchAsynchronously
};
var result = await _workflowInbox.SubmitAsync(message, options, cancellationToken);
return result.WorkflowExecutionResults;
}
}