diff --git a/src/Testing/CoreTests/Acceptance/publishing_ISendMyself_messages.cs b/src/Testing/CoreTests/Acceptance/publishing_ISendMyself_messages.cs new file mode 100644 index 000000000..8ddb901c2 --- /dev/null +++ b/src/Testing/CoreTests/Acceptance/publishing_ISendMyself_messages.cs @@ -0,0 +1,28 @@ +using Wolverine.Runtime; +using Wolverine.Tracking; +using Xunit; + +namespace CoreTests.Acceptance; + +public class publishing_ISendMyself_messages : IntegrationContext +{ + public publishing_ISendMyself_messages(DefaultApp @default) : base(@default) + { + } + + [Fact] + public async Task assert_can_not_send_with_isendmyself() + { + var selfSender = new SelfSender(Guid.NewGuid()); + var tracked = await Host.SendMessageAndWaitAsync(selfSender); + tracked.Executed.SingleMessage().Id.ShouldBe(selfSender.Id); + } + + [Fact] + public async Task assert_can_not_publish_with_isendmyself() + { + var selfSender = new SelfSender(Guid.NewGuid()); + var tracked = await Host.ExecuteAndWaitValueTaskAsync(c => c.PublishAsync(selfSender)); + tracked.Executed.SingleMessage().Id.ShouldBe(selfSender.Id); + } +} \ No newline at end of file diff --git a/src/Wolverine/Runtime/MessageBus.cs b/src/Wolverine/Runtime/MessageBus.cs index cbd27696a..6f575cf4f 100644 --- a/src/Wolverine/Runtime/MessageBus.cs +++ b/src/Wolverine/Runtime/MessageBus.cs @@ -7,7 +7,7 @@ namespace Wolverine.Runtime; -public class MessageBus : IMessageBus +public class MessageBus : IMessageBus, IMessageContext { public static MessageBus Build(IWolverineRuntime runtime, string correlationId) => new MessageBus(runtime, correlationId); @@ -42,6 +42,11 @@ private void assertNotMediatorOnly() } public string? CorrelationId { get; set; } + public Envelope? Envelope { get; protected set; } + public virtual ValueTask RespondToSenderAsync(object response) + { + throw new NotSupportedException("Not supported from MessageBus, only within message handlers executing against MessageContext"); + } public IWolverineRuntime Runtime { get; } public IMessageStore Storage { get; protected set; } @@ -146,6 +151,13 @@ public ValueTask SendAsync(T message, DeliveryOptions? options = null) { throw new ArgumentNullException(nameof(message)); } + + // Check for both so you don't get an infinite loop + // from TimeoutMessage + if (options == null && message is ISendMyself m) + { + return m.ApplyAsync(this); + } Runtime.AssertHasStarted(); assertNotMediatorOnly(); @@ -164,6 +176,13 @@ public ValueTask PublishAsync(T message, DeliveryOptions? options = null) throw new ArgumentNullException(nameof(message)); } + // Check for both so you don't get an infinite loop + // from TimeoutMessage + if (options == null && message is ISendMyself m) + { + return m.ApplyAsync(this); + } + Runtime.AssertHasStarted(); assertNotMediatorOnly(); diff --git a/src/Wolverine/Runtime/MessageContext.cs b/src/Wolverine/Runtime/MessageContext.cs index 3ac2f6013..bcb3cbc43 100644 --- a/src/Wolverine/Runtime/MessageContext.cs +++ b/src/Wolverine/Runtime/MessageContext.cs @@ -296,7 +296,7 @@ public ValueTask RollbackAsync() /// /// /// - public ValueTask RespondToSenderAsync(object response) + public override ValueTask RespondToSenderAsync(object response) { if (Envelope == null) { @@ -312,8 +312,6 @@ public ValueTask RespondToSenderAsync(object response) return EndpointFor(Envelope.ReplyUri).SendAsync(response); } - public Envelope? Envelope { get; protected set; } - internal async Task CopyToAsync(IEnvelopeTransaction other) { await other.PersistOutgoingAsync(_outstanding.ToArray());