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