From a58a62bcd15ff778b55b9faeafd678d3045c5247 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 9 May 2024 11:17:22 +0100 Subject: [PATCH 01/41] Initial subscription compression functionality --- .../Compression/GzipMessageBodyCompressor.cs | 20 ++++++ .../GzipMessageBodyDecompressor.cs | 22 ++++++ .../Compression/IMessageBodyCompressor.cs | 7 ++ .../Compression/IMessageBodyDecompressor.cs | 7 ++ .../IMessageDecompressionRegistry.cs | 6 ++ .../MessageDecompressionRegistry.cs | 16 +++++ .../Dispatch/MessageDispatcher.cs | 13 ++++ src/JustSaying/JustSaying.csproj | 1 + src/JustSaying/JustSayingBus.cs | 7 ++ .../PublicAPI/net461/PublicAPI.Shipped.txt | 1 - .../PublicAPI/net461/PublicAPI.Unshipped.txt | 9 +++ .../PublicAPI/net8.0/PublicAPI.Shipped.txt | 1 - .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 9 +++ .../netstandard2.0/PublicAPI.Shipped.txt | 1 - .../netstandard2.0/PublicAPI.Unshipped.txt | 9 +++ .../WhenDispatchingCompressedMessage.cs | 69 +++++++++++++++++++ .../WhenDispatchingMessage.cs | 2 + .../BaseSubscriptionGroupTests.cs | 2 + 18 files changed, 199 insertions(+), 3 deletions(-) create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs create mode 100644 tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs new file mode 100644 index 000000000..ba7cce3c3 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs @@ -0,0 +1,20 @@ +using System.IO.Compression; +using System.Text; + +namespace JustSaying.AwsTools.MessageHandling.Compression; + +class GzipMessageBodyCompressor : IMessageBodyCompressor +{ + public string ContentEncoding { get; } = "gzip,base64"; + public string Compress(string messageBody) + { + var contentBytes = Encoding.UTF8.GetBytes(messageBody); + using var compressedStream = new MemoryStream(); + using (var gZipStream = new GZipStream(compressedStream, CompressionMode.Compress)) + { + gZipStream.Write(contentBytes, 0, contentBytes.Length); + } + + return Convert.ToBase64String(compressedStream.ToArray()); + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs new file mode 100644 index 000000000..b591cb623 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs @@ -0,0 +1,22 @@ +using System.IO.Compression; +using System.Text; + +namespace JustSaying.AwsTools.MessageHandling.Compression; + +class GzipMessageBodyDecompressor : IMessageBodyDecompressor +{ + public string ContentEncoding { get; } = "gzip,base64"; + + public string Decompress(string messageBody) + { + var compressedBytes = Convert.FromBase64String(messageBody); + using var inputStream = new MemoryStream(compressedBytes); + using var outputStream = new MemoryStream(); + using (var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress)) + { + gZipStream.CopyTo(outputStream); + } + + return Encoding.UTF8.GetString(outputStream.ToArray()); + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs new file mode 100644 index 000000000..98d9902c7 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs @@ -0,0 +1,7 @@ +namespace JustSaying.AwsTools.MessageHandling.Compression; + +internal interface IMessageBodyCompressor +{ + string ContentEncoding { get; } + string Compress(string messageBody); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs new file mode 100644 index 000000000..28a5f47f3 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs @@ -0,0 +1,7 @@ +namespace JustSaying.AwsTools.MessageHandling.Compression; + +public interface IMessageBodyDecompressor +{ + string ContentEncoding { get; } + string Decompress(string messageBody); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs new file mode 100644 index 000000000..851fe45ad --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs @@ -0,0 +1,6 @@ +namespace JustSaying.AwsTools.MessageHandling.Compression; + +public interface IMessageDecompressionRegistry +{ + IMessageBodyDecompressor GetDecompressor(string contentEncoding); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs new file mode 100644 index 000000000..58ec7da3f --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs @@ -0,0 +1,16 @@ +namespace JustSaying.AwsTools.MessageHandling.Compression; + +public class MessageDecompressionRegistry : IMessageDecompressionRegistry +{ + private readonly IList _decompressors; + + public MessageDecompressionRegistry(IList decompressors) + { + _decompressors = decompressors; + } + + public IMessageBodyDecompressor GetDecompressor(string contentEncoding) + { + return _decompressors.FirstOrDefault(x => x.ContentEncoding == contentEncoding); + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 83b6f5c27..a3d62db46 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -1,3 +1,4 @@ +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging.Channels.Context; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; @@ -13,6 +14,7 @@ public class MessageDispatcher : IMessageDispatcher private readonly IMessageSerializationRegister _serializationRegister; private readonly IMessageMonitor _messagingMonitor; private readonly MiddlewareMap _middlewareMap; + private readonly IMessageDecompressionRegistry _decompressionRegistry; private static ILogger _logger; @@ -20,11 +22,13 @@ public MessageDispatcher( IMessageSerializationRegister serializationRegister, IMessageMonitor messagingMonitor, MiddlewareMap middlewareMap, + IMessageDecompressionRegistry decompressionRegistry, ILoggerFactory loggerFactory) { _serializationRegister = serializationRegister; _messagingMonitor = messagingMonitor; _middlewareMap = middlewareMap; + _decompressionRegistry = decompressionRegistry; _logger = loggerFactory.CreateLogger("JustSaying"); } @@ -78,6 +82,15 @@ await middleware.RunAsync(handleContext, null, cancellationToken) { _logger.LogDebug("Attempting to deserialize message with serialization register {Type}", _serializationRegister.GetType().FullName); + + messageContext.Message.MessageAttributes.TryGetValue("Content-Encoding", out var contentEncoding); + if (contentEncoding is not null) + { + var decompressor = _decompressionRegistry.GetDecompressor(contentEncoding.StringValue); + // TODO What to do when decompressor not found? + var decompressedBody = decompressor.Decompress(messageContext.Message.Body); + messageContext.Message.Body = decompressedBody; + } var messageWithAttributes = _serializationRegister.DeserializeMessage(messageContext.Message.Body); return (true, messageWithAttributes.Message, messageWithAttributes.MessageAttributes); } diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index edbd7e93b..362b1479e 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -2,6 +2,7 @@ true netstandard2.0;net461;net8.0 + $(NoWarn);RS0016;RS0017 diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index c5fbc347e..2d3bb125a 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -1,5 +1,6 @@ using System.Collections.Concurrent; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Extensions; using JustSaying.Messaging; @@ -32,6 +33,7 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; private readonly IMessageMonitor _monitor; + private IMessageDecompressionRegistry _decompressionRegistry; private ISubscriptionGroup SubscriptionGroups { get; set; } public IMessageSerializationRegister SerializationRegister { get; } @@ -55,6 +57,10 @@ public JustSayingBus( Config = config; SerializationRegister = serializationRegister; MiddlewareMap = new MiddlewareMap(); + _decompressionRegistry = new MessageDecompressionRegistry(new List + { + new GzipMessageBodyDecompressor() + }); _publishersByType = []; _subscriptionGroupSettings = @@ -164,6 +170,7 @@ private async Task RunImplAsync(CancellationToken stoppingToken) SerializationRegister, _monitor, MiddlewareMap, + _decompressionRegistry, _loggerFactory); var subscriptionGroupFactory = new SubscriptionGroupFactory( diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt index ac3e28b2f..aa86cc180 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt @@ -34,7 +34,6 @@ JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index e69de29bb..42e65c708 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -0,0 +1,9 @@ +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string +JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry +JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList decompressors) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void \ No newline at end of file diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt index a1c0546c3..a8755e383 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -34,7 +34,6 @@ JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index e69de29bb..42e65c708 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -0,0 +1,9 @@ +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string +JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry +JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList decompressors) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void \ No newline at end of file diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index ac3e28b2f..aa86cc180 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -34,7 +34,6 @@ JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index e69de29bb..a3c5eeb62 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -0,0 +1,9 @@ +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string +JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string +JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry +JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor +JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList decompressors) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs new file mode 100644 index 000000000..33e5b1317 --- /dev/null +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -0,0 +1,69 @@ +using System.IO.Compression; +using System.Text; +using Amazon.SQS.Model; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; +using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Messaging.Monitoring; +using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; +using Microsoft.Extensions.Logging; + +namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; + +public class WhenDispatchingCompressedMessage +{ + [Fact] + public async Task ShouldDecompressMessage() + { + // Arrange + var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; + var messageSerializer = new MessageSerializationRegister( + new NonGenericMessageSubjectProvider(), + new SystemTextJsonSerializationFactory()); + + messageSerializer.AddSerializer(); + + var payload = messageSerializer.Serialize(originalMessage, false); + + var memoryStream = new MemoryStream(); + await using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) + { + gzipStream.Write(Encoding.UTF8.GetBytes(payload)); + } + + var compressedPayload = Convert.ToBase64String(memoryStream.ToArray()); + + var sqsMessage = new Message + { + Body = compressedPayload, + MessageAttributes = + { + ["Content-Encoding"] = new MessageAttributeValue { DataType = "String", StringValue = "gzip,base64" } + } + }; + + var decompressorRegistry = + new MessageDecompressionRegistry( + new List + { + new GzipMessageBodyDecompressor() + }); + + var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty())); + var queueReader = new SqsQueueReader(queue); + var messageContext = queueReader.ToMessageContext(sqsMessage); + var middlewareMap = new MiddlewareMap(); + var inspectableMiddleware = new InspectableMiddleware(); + middlewareMap.Add("fake-queue-name", inspectableMiddleware); + var messageDispatcher = new MessageDispatcher(messageSerializer, new NullOpMessageMonitor(), middlewareMap, decompressorRegistry, new LoggerFactory()); + + // Act + await messageDispatcher.DispatchMessageAsync(messageContext, CancellationToken.None); + + // Assert + var handledDecompressedMessage = inspectableMiddleware.Handler.ReceivedMessages.ShouldHaveSingleItem(); + handledDecompressedMessage.Id.ShouldBe(originalMessage.Id); + } +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index b478a4b66..51decfdd9 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -1,6 +1,7 @@ using System.Globalization; using Amazon.SQS; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageProcessingStrategies; @@ -95,6 +96,7 @@ private MessageDispatcher CreateSystemUnderTestAsync() _serializationRegister, _messageMonitor, _middlewareMap, + new MessageDecompressionRegistry(new List()), _loggerFactory); return dispatcher; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 85c2af5d4..b987f7fe8 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; @@ -105,6 +106,7 @@ private ISubscriptionGroup CreateSystemUnderTest() SerializationRegister, Monitor, MiddlewareMap, + new MessageDecompressionRegistry(new List()), LoggerFactory); var defaults = new SubscriptionGroupSettingsBuilder() From cc7d4d38c34e312e26fa0b3ca7be92a186a0578d Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Wed, 12 Jun 2024 22:25:39 +0100 Subject: [PATCH 02/41] WIP - more compression changes --- ...essor.cs => GzipMessageBodyCompression.cs} | 16 +++++++++++++-- .../Compression/GzipMessageBodyCompressor.cs | 20 ------------------- ...mpressor.cs => IMessageBodyCompression.cs} | 3 ++- .../Compression/IMessageBodyCompressor.cs | 7 ------- .../IMessageCompressionRegistry.cs | 6 ++++++ .../IMessageDecompressionRegistry.cs | 6 ------ .../Compression/MessageCompressionRegistry.cs | 16 +++++++++++++++ .../MessageDecompressionRegistry.cs | 16 --------------- .../Dispatch/MessageDispatcher.cs | 8 ++++---- .../MessageHandling/SqsMessagePublisher.cs | 19 +++++++++++++++++- src/JustSaying/JustSayingBus.cs | 8 ++++---- .../WhenDispatchingCompressedMessage.cs | 6 +++--- .../WhenDispatchingMessage.cs | 4 +++- .../BaseSubscriptionGroupTests.cs | 2 +- 14 files changed, 71 insertions(+), 66 deletions(-) rename src/JustSaying/AwsTools/MessageHandling/Compression/{GzipMessageBodyDecompressor.cs => GzipMessageBodyCompression.cs} (51%) delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs rename src/JustSaying/AwsTools/MessageHandling/Compression/{IMessageBodyDecompressor.cs => IMessageBodyCompression.cs} (63%) delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompression.cs similarity index 51% rename from src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs rename to src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompression.cs index b591cb623..f94c98993 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyDecompressor.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompression.cs @@ -3,9 +3,21 @@ namespace JustSaying.AwsTools.MessageHandling.Compression; -class GzipMessageBodyDecompressor : IMessageBodyDecompressor +public class GzipMessageBodyCompression : IMessageBodyCompression { - public string ContentEncoding { get; } = "gzip,base64"; + public string ContentEncoding => "gzip,base64"; + + public string Compress(string messageBody) + { + var contentBytes = Encoding.UTF8.GetBytes(messageBody); + using var compressedStream = new MemoryStream(); + using (var gZipStream = new GZipStream(compressedStream, CompressionMode.Compress)) + { + gZipStream.Write(contentBytes, 0, contentBytes.Length); + } + + return Convert.ToBase64String(compressedStream.ToArray()); + } public string Decompress(string messageBody) { diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs deleted file mode 100644 index ba7cce3c3..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.IO.Compression; -using System.Text; - -namespace JustSaying.AwsTools.MessageHandling.Compression; - -class GzipMessageBodyCompressor : IMessageBodyCompressor -{ - public string ContentEncoding { get; } = "gzip,base64"; - public string Compress(string messageBody) - { - var contentBytes = Encoding.UTF8.GetBytes(messageBody); - using var compressedStream = new MemoryStream(); - using (var gZipStream = new GZipStream(compressedStream, CompressionMode.Compress)) - { - gZipStream.Write(contentBytes, 0, contentBytes.Length); - } - - return Convert.ToBase64String(compressedStream.ToArray()); - } -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs similarity index 63% rename from src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs rename to src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs index 28a5f47f3..f6a02482e 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyDecompressor.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs @@ -1,7 +1,8 @@ namespace JustSaying.AwsTools.MessageHandling.Compression; -public interface IMessageBodyDecompressor +public interface IMessageBodyCompression { string ContentEncoding { get; } + string Compress(string messageBody); string Decompress(string messageBody); } diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs deleted file mode 100644 index 98d9902c7..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompressor.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling.Compression; - -internal interface IMessageBodyCompressor -{ - string ContentEncoding { get; } - string Compress(string messageBody); -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs new file mode 100644 index 000000000..46f459d1e --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs @@ -0,0 +1,6 @@ +namespace JustSaying.AwsTools.MessageHandling.Compression; + +public interface IMessageCompressionRegistry +{ + IMessageBodyCompression GetCompression(string contentEncoding); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs deleted file mode 100644 index 851fe45ad..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageDecompressionRegistry.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling.Compression; - -public interface IMessageDecompressionRegistry -{ - IMessageBodyDecompressor GetDecompressor(string contentEncoding); -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs new file mode 100644 index 000000000..62a7943ce --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs @@ -0,0 +1,16 @@ +namespace JustSaying.AwsTools.MessageHandling.Compression; + +public class MessageCompressionRegistry : IMessageCompressionRegistry +{ + private readonly IList _compressions; + + public MessageCompressionRegistry(IList compressions) + { + _compressions = compressions; + } + + public IMessageBodyCompression GetCompression(string contentEncoding) + { + return _compressions.FirstOrDefault(x => x.ContentEncoding == contentEncoding); + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs deleted file mode 100644 index 58ec7da3f..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageDecompressionRegistry.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling.Compression; - -public class MessageDecompressionRegistry : IMessageDecompressionRegistry -{ - private readonly IList _decompressors; - - public MessageDecompressionRegistry(IList decompressors) - { - _decompressors = decompressors; - } - - public IMessageBodyDecompressor GetDecompressor(string contentEncoding) - { - return _decompressors.FirstOrDefault(x => x.ContentEncoding == contentEncoding); - } -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index a3d62db46..0f30e50bb 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -14,7 +14,7 @@ public class MessageDispatcher : IMessageDispatcher private readonly IMessageSerializationRegister _serializationRegister; private readonly IMessageMonitor _messagingMonitor; private readonly MiddlewareMap _middlewareMap; - private readonly IMessageDecompressionRegistry _decompressionRegistry; + private readonly IMessageCompressionRegistry _compressionRegistry; private static ILogger _logger; @@ -22,13 +22,13 @@ public MessageDispatcher( IMessageSerializationRegister serializationRegister, IMessageMonitor messagingMonitor, MiddlewareMap middlewareMap, - IMessageDecompressionRegistry decompressionRegistry, + IMessageCompressionRegistry compressionRegistry, ILoggerFactory loggerFactory) { _serializationRegister = serializationRegister; _messagingMonitor = messagingMonitor; _middlewareMap = middlewareMap; - _decompressionRegistry = decompressionRegistry; + _compressionRegistry = compressionRegistry; _logger = loggerFactory.CreateLogger("JustSaying"); } @@ -86,7 +86,7 @@ await middleware.RunAsync(handleContext, null, cancellationToken) messageContext.Message.MessageAttributes.TryGetValue("Content-Encoding", out var contentEncoding); if (contentEncoding is not null) { - var decompressor = _decompressionRegistry.GetDecompressor(contentEncoding.StringValue); + var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); // TODO What to do when decompressor not found? var decompressedBody = decompressor.Decompress(messageContext.Message.Body); messageContext.Message.Body = decompressedBody; diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index dc6a77337..0e72a35f3 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -1,3 +1,4 @@ +using System.Text; using Amazon.Runtime; using Amazon.SQS; using Amazon.SQS.Model; @@ -16,6 +17,7 @@ public class SqsMessagePublisher( { private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); public Action MessageResponseLogger { get; set; } + public PublishCompressionOptions CompressionOptions { get; set; } public Uri QueueUrl { get; internal set; } @@ -80,9 +82,17 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetadata metadata) { + var messageBody = GetMessageInContext(message); + + var bodyByteLength = Encoding.UTF8.GetByteCount(messageBody); // We should probably also include the length of the message attributes + if (bodyByteLength > CompressionOptions.MaxMessageSize) // Well under 256KB + { + // compress the message body + } + var request = new SendMessageRequest { - MessageBody = GetMessageInContext(message), + MessageBody = messageBody, QueueUrl = QueueUrl.AbsoluteUri, }; @@ -104,3 +114,10 @@ public InterrogationResult Interrogate() }); } } + +public sealed class PublishCompressionOptions +{ + public static PublishCompressionOptions Default => new(); + + public int MaxMessageSize { get; set; } = 248 * 1024; // 256KB - 8KB for overhead +} diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 2d3bb125a..8e6064b64 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -33,7 +33,7 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; private readonly IMessageMonitor _monitor; - private IMessageDecompressionRegistry _decompressionRegistry; + private readonly IMessageCompressionRegistry _compressionRegistry; private ISubscriptionGroup SubscriptionGroups { get; set; } public IMessageSerializationRegister SerializationRegister { get; } @@ -57,9 +57,9 @@ public JustSayingBus( Config = config; SerializationRegister = serializationRegister; MiddlewareMap = new MiddlewareMap(); - _decompressionRegistry = new MessageDecompressionRegistry(new List + _compressionRegistry = new MessageCompressionRegistry(new List { - new GzipMessageBodyDecompressor() + new GzipMessageBodyCompression() }); _publishersByType = []; @@ -170,7 +170,7 @@ private async Task RunImplAsync(CancellationToken stoppingToken) SerializationRegister, _monitor, MiddlewareMap, - _decompressionRegistry, + _compressionRegistry, _loggerFactory); var subscriptionGroupFactory = new SubscriptionGroupFactory( diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 33e5b1317..3499b96b6 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -45,10 +45,10 @@ public async Task ShouldDecompressMessage() }; var decompressorRegistry = - new MessageDecompressionRegistry( - new List + new MessageCompressionRegistry( + new List { - new GzipMessageBodyDecompressor() + new GzipMessageBodyCompression() }); var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty())); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index 51decfdd9..342210382 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -13,6 +13,7 @@ using JustSaying.UnitTests.Messaging.Channels.Fakes; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; using MELT; +using Meziantou.Xunit; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Newtonsoft.Json; @@ -21,6 +22,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; +[DisableParallelization] public class WhenDispatchingMessage : IAsyncLifetime { private const string ExpectedQueueUrl = "http://testurl.com/queue"; @@ -96,7 +98,7 @@ private MessageDispatcher CreateSystemUnderTestAsync() _serializationRegister, _messageMonitor, _middlewareMap, - new MessageDecompressionRegistry(new List()), + new MessageCompressionRegistry(new List()), _loggerFactory); return dispatcher; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index b987f7fe8..5347b494c 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -106,7 +106,7 @@ private ISubscriptionGroup CreateSystemUnderTest() SerializationRegister, Monitor, MiddlewareMap, - new MessageDecompressionRegistry(new List()), + new MessageCompressionRegistry(new List()), LoggerFactory); var defaults = new SubscriptionGroupSettingsBuilder() From 2d3c49599e7227b7de1b6db83fa0dd4ef50af168 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Wed, 26 Jun 2024 12:05:41 +0100 Subject: [PATCH 03/41] Add publisher compression support --- .../Program.cs | 11 ++++- .../appsettings.json | 2 +- .../appsettings.json | 2 +- .../Compression/MessageCompressionRegistry.cs | 2 +- .../MessageHandling/SnsMessagePublisher.cs | 46 ++++++++++++++++--- .../MessageHandling/SqsMessagePublisher.cs | 30 ++++++++++-- .../QueueCreation/SnsWriteConfiguration.cs | 4 +- .../QueueCreation/SqsBasicConfiguration.cs | 2 + .../QueueCreation/SqsWriteConfiguration.cs | 2 +- .../StaticPublicationConfiguration.cs | 2 + .../QueueAddressPublicationBuilder`1.cs | 17 ++++++- .../Fluent/QueuePublicationBuilder`1.cs | 4 +- .../TopicAddressPublicationBuilder`1.cs | 17 ++++++- .../Fluent/TopicPublicationBuilder`1.cs | 7 +++ src/JustSaying/JustSayingBus.cs | 9 ++-- src/JustSaying/MessagingConfig.cs | 4 +- .../WhenDispatchingCompressedMessage.cs | 6 +-- .../WhenDispatchingMessage.cs | 4 +- .../MessageHandling/Sqs/WhenPublishing.cs | 1 + .../Sqs/WhenPublishingAsync.cs | 1 + ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 3 +- .../Sqs/WhenPublishingDelayedMessage.cs | 1 + .../Sqs/WhenPublishingDelayedMessageAsync.cs | 1 + .../BaseSubscriptionGroupTests.cs | 2 +- 24 files changed, 139 insertions(+), 41 deletions(-) diff --git a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs index d9a8e61ae..2df2add2b 100644 --- a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs +++ b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs @@ -1,3 +1,4 @@ +using JustSaying.AwsTools.MessageHandling; using JustSaying.Sample.Restaurant.KitchenConsole; using JustSaying.Sample.Restaurant.KitchenConsole.Handlers; using JustSaying.Sample.Restaurant.Models; @@ -97,13 +98,19 @@ static async Task Run() config.Publications(x => { // Creates the following if they do not already exist - // - a SNS topic of name `orderreadyevent` with two tags: + // - an SNS topic of name `orderreadyevent` with two tags: // - "IsOrderEvent" with no value // - "Publisher" with the value "KitchenConsole" x.WithTopic(cfg => { cfg.WithTag("IsOrderEvent") - .WithTag("Publisher", appName); + .WithTag("Publisher", appName) + .WithWriteConfiguration(w => + w.CompressionOptions = new PublishCompressionOptions + { + CompressionEncoding = "gzip,base64", // TODO validate + MessageLengthThreshold = 0 + }); }); x.WithTopic(); }); diff --git a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/appsettings.json b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/appsettings.json index 73faf66c5..70876ec8a 100644 --- a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/appsettings.json +++ b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/appsettings.json @@ -1,4 +1,4 @@ { "AWSRegion": "eu-west-1", - "AWSServiceUrl": "http://localhost:4100" + "AWSServiceUrl": "http://localhost:4566" } diff --git a/samples/src/JustSaying.Sample.Restaurant.OrderingApi/appsettings.json b/samples/src/JustSaying.Sample.Restaurant.OrderingApi/appsettings.json index ad029c003..ef0bee20f 100644 --- a/samples/src/JustSaying.Sample.Restaurant.OrderingApi/appsettings.json +++ b/samples/src/JustSaying.Sample.Restaurant.OrderingApi/appsettings.json @@ -1,5 +1,5 @@ { "AWSRegion": "eu-west-1", - "AWSServiceUrl": "http://localhost:4100", + "AWSServiceUrl": "http://localhost:4566", "AllowedHosts": "*" } diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs index 62a7943ce..c18ea6239 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs @@ -1,6 +1,6 @@ namespace JustSaying.AwsTools.MessageHandling.Compression; -public class MessageCompressionRegistry : IMessageCompressionRegistry +public sealed class MessageCompressionRegistry : IMessageCompressionRegistry { private readonly IList _compressions; diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 835773bcf..2752313b5 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -1,6 +1,8 @@ +using System.Text; using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; @@ -21,6 +23,8 @@ public class SnsMessagePublisher( private readonly IMessageSubjectProvider _messageSubjectProvider = messageSubjectProvider; private readonly Func _handleException = handleException; public Action MessageResponseLogger { get; set; } + public PublishCompressionOptions CompressionOptions { get; set; } + public IMessageCompressionRegistry CompressionRegistry { get; set; } public string Arn { get; internal set; } protected IAmazonSimpleNotificationService Client { get; } = client; private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); @@ -93,26 +97,54 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel private PublishRequest BuildPublishRequest(Message message, PublishMetadata metadata) { var messageToSend = _serializationRegister.Serialize(message, serializeForSnsPublishing: true); + + string contentEncoding = null; + if (CompressionOptions?.CompressionEncoding is { } compressionEncoding && CompressionRegistry is not null) + { + var bodyByteLength = Encoding.UTF8.GetByteCount(messageToSend); // We should probably also include the length of the message attributes + if (bodyByteLength > (CompressionOptions?.MessageLengthThreshold ?? int.MaxValue)) // Well under 256KB + { + var compression = CompressionRegistry.GetCompression(compressionEncoding); + if (compression is null) + { + throw new PublishException($"Compression encoding '{compressionEncoding}' is not registered."); + } + + messageToSend = compression.Compress(messageToSend); + contentEncoding = compressionEncoding; + } + } + var messageType = _messageSubjectProvider.GetSubjectForType(message.GetType()); - return new PublishRequest + var request = new PublishRequest { TopicArn = Arn, Subject = messageType, Message = messageToSend, - MessageAttributes = BuildMessageAttributes(metadata) }; + + AddMessageAttributes(request.MessageAttributes, metadata); + + if (contentEncoding is not null) + { + request.MessageAttributes.Add("Content-Encoding", new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + } + + return request; } - private static Dictionary BuildMessageAttributes(PublishMetadata metadata) + private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) { if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) { - return null; + return; + } + + foreach (var attribute in metadata.MessageAttributes) + { + requestMessageAttributes.Add(attribute.Key, BuildMessageAttributeValue(attribute.Value)); } - return metadata.MessageAttributes.ToDictionary( - source => source.Key, - source => BuildMessageAttributeValue(source.Value)); } private static MessageAttributeValue BuildMessageAttributeValue(Messaging.MessageAttributeValue value) diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index 0e72a35f3..727587a6b 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -2,11 +2,13 @@ using Amazon.Runtime; using Amazon.SQS; using Amazon.SQS.Model; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; using Microsoft.Extensions.Logging; using Message = JustSaying.Models.Message; +using MessageAttributeValue = Amazon.SQS.Model.MessageAttributeValue; namespace JustSaying.AwsTools.MessageHandling; @@ -18,6 +20,7 @@ public class SqsMessagePublisher( private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); public Action MessageResponseLogger { get; set; } public PublishCompressionOptions CompressionOptions { get; set; } + public IMessageCompressionRegistry CompressionRegistry { get; set; } public Uri QueueUrl { get; internal set; } @@ -84,10 +87,21 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad { var messageBody = GetMessageInContext(message); - var bodyByteLength = Encoding.UTF8.GetByteCount(messageBody); // We should probably also include the length of the message attributes - if (bodyByteLength > CompressionOptions.MaxMessageSize) // Well under 256KB + string contentEncoding = null; + if (CompressionOptions?.CompressionEncoding is { } compressionEncoding && CompressionRegistry is not null) { - // compress the message body + var bodyByteLength = Encoding.UTF8.GetByteCount(messageBody); // We should probably also include the length of the message attributes + if (bodyByteLength > (CompressionOptions?.MessageLengthThreshold ?? int.MaxValue)) // Well under 256KB + { + var compression = CompressionRegistry.GetCompression(compressionEncoding); + if (compression is null) + { + throw new PublishException($"Compression encoding '{compressionEncoding}' is not registered."); + } + + messageBody = compression.Compress(messageBody); + contentEncoding = compressionEncoding; + } } var request = new SendMessageRequest @@ -96,6 +110,11 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad QueueUrl = QueueUrl.AbsoluteUri, }; + if (contentEncoding is not null) + { + request.MessageAttributes.Add("Content-Encoding", new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + } + if (metadata?.Delay != null) { request.DelaySeconds = (int) metadata.Delay.Value.TotalSeconds; @@ -104,7 +123,7 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad return request; } - public string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); + private string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); public InterrogationResult Interrogate() { @@ -119,5 +138,6 @@ public sealed class PublishCompressionOptions { public static PublishCompressionOptions Default => new(); - public int MaxMessageSize { get; set; } = 248 * 1024; // 256KB - 8KB for overhead + public int MessageLengthThreshold { get; set; } = 248 * 1024; // 256KB - 8KB for overhead + public string CompressionEncoding { get; set; } } diff --git a/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs index ffd472189..a754c7f67 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs @@ -1,3 +1,4 @@ +using JustSaying.AwsTools.MessageHandling; using JustSaying.Models; namespace JustSaying.AwsTools.QueueCreation; @@ -5,10 +6,11 @@ namespace JustSaying.AwsTools.QueueCreation; public class SnsWriteConfiguration { public ServerSideEncryption Encryption { get; set; } + public PublishCompressionOptions CompressionOptions { get; set; } /// /// Extension point enabling custom error handling on a per notification basis, including ability handle raised exceptions. /// /// Boolean indicating whether the exception has been handled public Func HandleException { get; set; } -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs index 0e84aa3ec..9fc565263 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs @@ -1,3 +1,4 @@ +using JustSaying.AwsTools.MessageHandling; using JustSaying.Naming; namespace JustSaying.AwsTools.QueueCreation; @@ -11,6 +12,7 @@ public class SqsBasicConfiguration public int RetryCountBeforeSendingToErrorQueue { get; set; } public bool ErrorQueueOptOut { get; set; } public ServerSideEncryption ServerSideEncryption { get; set; } + public PublishCompressionOptions CompressionOptions { get; set; } public string QueueName { get; set; } public void ApplyQueueNamingConvention(IQueueNamingConvention namingConvention) diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs index d92be8c99..c3ffd0c98 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs @@ -9,4 +9,4 @@ public SqsWriteConfiguration() VisibilityTimeout = JustSayingConstants.DefaultVisibilityTimeout; RetryCountBeforeSendingToErrorQueue = JustSayingConstants.DefaultHandlerRetryCount; } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index f7b8410fb..d8666325a 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -37,6 +37,8 @@ public static StaticPublicationConfiguration Build( bus.Config.MessageSubjectProvider) { MessageResponseLogger = bus.Config.MessageResponseLogger, + CompressionRegistry = bus.CompressionRegistry, + CompressionOptions = writeConfiguration.CompressionOptions, }; var snsTopic = new SnsTopicByName( diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index bbbb689a1..2c35a6aff 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -16,6 +16,7 @@ public sealed class QueueAddressPublicationBuilder : IPublicationBuilder where T : Message { private readonly QueueAddress _queueAddress; + private PublishCompressionOptions _compressionOptions; /// /// Initializes a new instance of the class. @@ -26,6 +27,12 @@ internal QueueAddressPublicationBuilder(QueueAddress queueAddress) _queueAddress = queueAddress; } + public QueueAddressPublicationBuilder WithCompression(PublishCompressionOptions compressionOptions) + { + _compressionOptions = compressionOptions; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -33,13 +40,19 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa logger.LogInformation("Adding SQS publisher for message type '{MessageType}'", typeof(T)); + var config = bus.Config; bus.SerializationRegister.AddSerializer(); var eventPublisher = new SqsMessagePublisher( _queueAddress.QueueUrl, proxy.GetAwsClientFactory().GetSqsClient(RegionEndpoint.GetBySystemName(_queueAddress.RegionName)), bus.SerializationRegister, - loggerFactory); + loggerFactory) + { + MessageResponseLogger = config.MessageResponseLogger, + CompressionRegistry = bus.CompressionRegistry, + CompressionOptions = _compressionOptions + }; bus.AddMessagePublisher(eventPublisher); @@ -48,4 +61,4 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa _queueAddress.QueueUrl, typeof(T)); } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs index 8bc4eacab..d69ee30b0 100644 --- a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs @@ -109,7 +109,9 @@ void IPublicationBuilder.Configure( bus.SerializationRegister, loggerFactory) { - MessageResponseLogger = config.MessageResponseLogger + MessageResponseLogger = config.MessageResponseLogger, + CompressionRegistry = bus.CompressionRegistry, + CompressionOptions = writeConfiguration.CompressionOptions }; #pragma warning disable 618 diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 2a8430465..1b3646390 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -1,5 +1,6 @@ using Amazon; using JustSaying.AwsTools; +using JustSaying.AwsTools.MessageHandling; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -16,6 +17,7 @@ public sealed class TopicAddressPublicationBuilder : IPublicationBuilder { private readonly TopicAddress _topicAddress; private Func _exceptionHandler; + private PublishCompressionOptions _compressionOptions; /// /// Initializes a new instance of the class. @@ -42,6 +44,12 @@ public TopicAddressPublicationBuilder WithExceptionHandler(Func WithCompression(PublishCompressionOptions compressionOptions) + { + _compressionOptions = compressionOptions; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -60,7 +68,12 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa config.MessageSubjectProvider, bus.SerializationRegister, _exceptionHandler, - _topicAddress); + _topicAddress) + { + MessageResponseLogger = config.MessageResponseLogger, + CompressionRegistry = bus.CompressionRegistry, + CompressionOptions = _compressionOptions + }; bus.AddMessagePublisher(eventPublisher); logger.LogInformation( @@ -68,4 +81,4 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa arn.Resource, typeof(T)); } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs index 3250bc835..cb3cd2bda 100644 --- a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs @@ -171,6 +171,13 @@ void IPublicationBuilder.Configure( var writeConfiguration = new SnsWriteConfiguration(); ConfigureWrites?.Invoke(writeConfiguration); + if (writeConfiguration.CompressionOptions?.CompressionEncoding is { } compressionEncoding) + { + if (bus.CompressionRegistry.GetCompression(compressionEncoding) is null) + { + throw new InvalidOperationException($"Compression encoding '{compressionEncoding}' is not registered with the bus."); + } + } var client = proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(region)); diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 8e6064b64..2f67721ea 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -33,12 +33,12 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; private readonly IMessageMonitor _monitor; - private readonly IMessageCompressionRegistry _compressionRegistry; private ISubscriptionGroup SubscriptionGroups { get; set; } public IMessageSerializationRegister SerializationRegister { get; } internal MiddlewareMap MiddlewareMap { get; } + internal IMessageCompressionRegistry CompressionRegistry { get; } public Task Completion { get; private set; } @@ -57,10 +57,7 @@ public JustSayingBus( Config = config; SerializationRegister = serializationRegister; MiddlewareMap = new MiddlewareMap(); - _compressionRegistry = new MessageCompressionRegistry(new List - { - new GzipMessageBodyCompression() - }); + CompressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); _publishersByType = []; _subscriptionGroupSettings = @@ -170,7 +167,7 @@ private async Task RunImplAsync(CancellationToken stoppingToken) SerializationRegister, _monitor, MiddlewareMap, - _compressionRegistry, + CompressionRegistry, _loggerFactory); var subscriptionGroupFactory = new SubscriptionGroupFactory( diff --git a/src/JustSaying/MessagingConfig.cs b/src/JustSaying/MessagingConfig.cs index f69ea8454..d55a45370 100644 --- a/src/JustSaying/MessagingConfig.cs +++ b/src/JustSaying/MessagingConfig.cs @@ -16,6 +16,7 @@ public MessagingConfig() MessageSubjectProvider = new NonGenericMessageSubjectProvider(); TopicNamingConvention = new DefaultNamingConventions(); QueueNamingConvention = new DefaultNamingConventions(); + CompressionOptions = new PublishCompressionOptions(); } public int PublishFailureReAttempts { get; set; } @@ -26,6 +27,7 @@ public MessagingConfig() public IMessageSubjectProvider MessageSubjectProvider { get; set; } public ITopicNamingConvention TopicNamingConvention { get; set; } public IQueueNamingConvention QueueNamingConvention { get; set; } + public PublishCompressionOptions CompressionOptions { get; set; } public virtual void Validate() { @@ -34,4 +36,4 @@ public virtual void Validate() throw new InvalidOperationException($"Config cannot have a null for the {nameof(MessageSubjectProvider)} property."); } } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 3499b96b6..1fbc3cc99 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -45,11 +45,7 @@ public async Task ShouldDecompressMessage() }; var decompressorRegistry = - new MessageCompressionRegistry( - new List - { - new GzipMessageBodyCompression() - }); + new MessageCompressionRegistry([new GzipMessageBodyCompression()]); var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty())); var queueReader = new SqsQueueReader(queue); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index 342210382..9f98218a5 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -13,7 +13,6 @@ using JustSaying.UnitTests.Messaging.Channels.Fakes; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; using MELT; -using Meziantou.Xunit; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Newtonsoft.Json; @@ -22,7 +21,6 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; -[DisableParallelization] public class WhenDispatchingMessage : IAsyncLifetime { private const string ExpectedQueueUrl = "http://testurl.com/queue"; @@ -98,7 +96,7 @@ private MessageDispatcher CreateSystemUnderTestAsync() _serializationRegister, _messageMonitor, _middlewareMap, - new MessageCompressionRegistry(new List()), + new MessageCompressionRegistry([]), _loggerFactory); return dispatcher; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 73fa15b6a..136190f1a 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index 74bff9492..3c2679ebe 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index 87faa815e..2a065efb2 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -2,6 +2,7 @@ using Amazon.Runtime; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; @@ -99,4 +100,4 @@ public void MessageIsForwardedToResponseLogger() { _message.ShouldNotBeNull(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index d4719cac6..18d309ffe 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index fbb28a4d0..5b129d09b 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 5347b494c..de2867a60 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -106,7 +106,7 @@ private ISubscriptionGroup CreateSystemUnderTest() SerializationRegister, Monitor, MiddlewareMap, - new MessageCompressionRegistry(new List()), + new MessageCompressionRegistry([]), LoggerFactory); var defaults = new SubscriptionGroupSettingsBuilder() From 426030d182cd151de6e4d896a2dae901376bc3ac Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 27 Jun 2024 11:28:27 +0100 Subject: [PATCH 04/41] Address more feedback --- .../Program.cs | 3 +- .../Compression/IMessageBodyCompression.cs | 8 ------ .../IMessageCompressionRegistry.cs | 6 ---- .../Compression/MessageCompressionRegistry.cs | 16 ----------- .../Dispatch/MessageDispatcher.cs | 2 +- .../MessageHandling/SnsMessagePublisher.cs | 2 +- .../MessageHandling/SqsMessagePublisher.cs | 6 ++-- src/JustSaying/JustSayingBus.cs | 2 +- .../Messaging/Compression/ContentEncodings.cs | 17 +++++++++++ .../Compression/GzipMessageBodyCompression.cs | 20 +++++++++++-- .../Compression/IMessageBodyCompression.cs | 26 +++++++++++++++++ .../IMessageCompressionRegistry.cs | 14 ++++++++++ .../Compression/MessageCompressionRegistry.cs | 28 +++++++++++++++++++ .../WhenDispatchingCompressedMessage.cs | 4 +-- .../WhenDispatchingMessage.cs | 2 +- .../MessageHandling/Sqs/WhenPublishing.cs | 1 - .../Sqs/WhenPublishingAsync.cs | 1 - ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 1 - .../Sqs/WhenPublishingDelayedMessage.cs | 1 - .../Sqs/WhenPublishingDelayedMessageAsync.cs | 1 - .../BaseSubscriptionGroupTests.cs | 2 +- 21 files changed, 113 insertions(+), 50 deletions(-) delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs create mode 100644 src/JustSaying/Messaging/Compression/ContentEncodings.cs rename src/JustSaying/{AwsTools/MessageHandling => Messaging}/Compression/GzipMessageBodyCompression.cs (53%) create mode 100644 src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs create mode 100644 src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs create mode 100644 src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs diff --git a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs index 2df2add2b..3b33b5ad8 100644 --- a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs +++ b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs @@ -1,4 +1,5 @@ using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; using JustSaying.Sample.Restaurant.KitchenConsole; using JustSaying.Sample.Restaurant.KitchenConsole.Handlers; using JustSaying.Sample.Restaurant.Models; @@ -108,7 +109,7 @@ static async Task Run() .WithWriteConfiguration(w => w.CompressionOptions = new PublishCompressionOptions { - CompressionEncoding = "gzip,base64", // TODO validate + CompressionEncoding = ContentEncodings.GzipBase64, // TODO validate MessageLengthThreshold = 0 }); }); diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs deleted file mode 100644 index f6a02482e..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageBodyCompression.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling.Compression; - -public interface IMessageBodyCompression -{ - string ContentEncoding { get; } - string Compress(string messageBody); - string Decompress(string messageBody); -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs deleted file mode 100644 index 46f459d1e..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/IMessageCompressionRegistry.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling.Compression; - -public interface IMessageCompressionRegistry -{ - IMessageBodyCompression GetCompression(string contentEncoding); -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs deleted file mode 100644 index c18ea6239..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionRegistry.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling.Compression; - -public sealed class MessageCompressionRegistry : IMessageCompressionRegistry -{ - private readonly IList _compressions; - - public MessageCompressionRegistry(IList compressions) - { - _compressions = compressions; - } - - public IMessageBodyCompression GetCompression(string contentEncoding) - { - return _compressions.FirstOrDefault(x => x.ContentEncoding == contentEncoding); - } -} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 0f30e50bb..f44b3c83e 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -1,5 +1,5 @@ -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging.Channels.Context; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 2752313b5..138686d9d 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -2,8 +2,8 @@ using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index 727587a6b..ae4f5a5a2 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -2,8 +2,8 @@ using Amazon.Runtime; using Amazon.SQS; using Amazon.SQS.Model; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; using Microsoft.Extensions.Logging; @@ -136,8 +136,6 @@ public InterrogationResult Interrogate() public sealed class PublishCompressionOptions { - public static PublishCompressionOptions Default => new(); - - public int MessageLengthThreshold { get; set; } = 248 * 1024; // 256KB - 8KB for overhead + public int MessageLengthThreshold { get; set; } = 248 * 1024; // (256KB - 8KB) for overhead public string CompressionEncoding { get; set; } } diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 2f67721ea..07cb336cf 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -1,11 +1,11 @@ using System.Collections.Concurrent; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Extensions; using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; diff --git a/src/JustSaying/Messaging/Compression/ContentEncodings.cs b/src/JustSaying/Messaging/Compression/ContentEncodings.cs new file mode 100644 index 000000000..d5c56b5cb --- /dev/null +++ b/src/JustSaying/Messaging/Compression/ContentEncodings.cs @@ -0,0 +1,17 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Provides constant values for various content encodings used in message body compression. +/// +/// +/// This class contains predefined string constants representing different content encoding schemes. +/// These constants can be used to ensure consistency and avoid typos when specifying +/// content encodings throughout the application. +/// +public static class ContentEncodings +{ + /// + /// The GzipBase64 constant represents the "gzip,base64" content encoding. + /// + public const string GzipBase64 = "gzip,base64"; +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompression.cs b/src/JustSaying/Messaging/Compression/GzipMessageBodyCompression.cs similarity index 53% rename from src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompression.cs rename to src/JustSaying/Messaging/Compression/GzipMessageBodyCompression.cs index f94c98993..de48bfb94 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompression.cs +++ b/src/JustSaying/Messaging/Compression/GzipMessageBodyCompression.cs @@ -1,12 +1,21 @@ using System.IO.Compression; using System.Text; -namespace JustSaying.AwsTools.MessageHandling.Compression; +namespace JustSaying.Messaging.Compression; -public class GzipMessageBodyCompression : IMessageBodyCompression +/// +/// Implements GZIP compression and Base64 encoding for message bodies. +/// +public sealed class GzipMessageBodyCompression : IMessageBodyCompression { - public string ContentEncoding => "gzip,base64"; + /// + /// Gets the content encoding identifier for GZIP compression with Base64 encoding. + /// + public string ContentEncoding => ContentEncodings.GzipBase64; + /// + /// Gets the content encoding identifier for GZIP compression with Base64 encoding. + /// public string Compress(string messageBody) { var contentBytes = Encoding.UTF8.GetBytes(messageBody); @@ -19,6 +28,11 @@ public string Compress(string messageBody) return Convert.ToBase64String(compressedStream.ToArray()); } + /// + /// Decodes the Base64 string and decompresses the message body using GZIP. + /// + /// The Base64 encoded and compressed message body to decompress. + /// The decompressed message body as a string. public string Decompress(string messageBody) { var compressedBytes = Convert.FromBase64String(messageBody); diff --git a/src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs b/src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs new file mode 100644 index 000000000..c53b1840d --- /dev/null +++ b/src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs @@ -0,0 +1,26 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Defines the contract for message body compression operations. +/// +public interface IMessageBodyCompression +{ + /// + /// Gets the content encoding identifier for this compression method. + /// + string ContentEncoding { get; } + + /// + /// Compresses the given message body. + /// + /// The message body to compress. + /// The compressed message body as a string. + string Compress(string messageBody); + + /// + /// Decompresses the given message body. + /// + /// The compressed message body to decompress. + /// The decompressed message body as a string. + string Decompress(string messageBody); +} diff --git a/src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs new file mode 100644 index 000000000..7c224ac40 --- /dev/null +++ b/src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs @@ -0,0 +1,14 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Defines the contract for a registry of message compression methods. +/// +public interface IMessageCompressionRegistry +{ + /// + /// Retrieves the appropriate compression method based on the content encoding. + /// + /// The content encoding identifier. + /// An instance for the specified encoding, or null if not found. + IMessageBodyCompression GetCompression(string contentEncoding); +} diff --git a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs new file mode 100644 index 000000000..6445b43e4 --- /dev/null +++ b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs @@ -0,0 +1,28 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Implements a registry for message compression methods. +/// +public sealed class MessageCompressionRegistry : IMessageCompressionRegistry +{ + private readonly IList _compressions; + + /// + /// Initializes a new instance of the class. + /// + /// A list of available compression methods. + public MessageCompressionRegistry(IList compressions) + { + _compressions = compressions; + } + + /// + /// Retrieves the appropriate compression method based on the content encoding. + /// + /// The content encoding identifier. + /// An instance for the specified encoding, or null if not found. + public IMessageBodyCompression GetCompression(string contentEncoding) + { + return _compressions.FirstOrDefault(x => x.ContentEncoding == contentEncoding); + } +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 1fbc3cc99..40a16bc30 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -2,8 +2,8 @@ using System.Text; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; @@ -40,7 +40,7 @@ public async Task ShouldDecompressMessage() Body = compressedPayload, MessageAttributes = { - ["Content-Encoding"] = new MessageAttributeValue { DataType = "String", StringValue = "gzip,base64" } + ["Content-Encoding"] = new MessageAttributeValue { DataType = "String", StringValue = ContentEncodings.GzipBase64 } } }; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index 9f98218a5..a32ae5e1e 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -1,8 +1,8 @@ using System.Globalization; using Amazon.SQS; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageProcessingStrategies; using JustSaying.Messaging.MessageSerialization; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 136190f1a..73fa15b6a 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -1,6 +1,5 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index 3c2679ebe..74bff9492 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -1,6 +1,5 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index 2a065efb2..ce05f5f1a 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -2,7 +2,6 @@ using Amazon.Runtime; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index 18d309ffe..d4719cac6 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -1,6 +1,5 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index 5b129d09b..fbb28a4d0 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -1,6 +1,5 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index de2867a60..6aee49b92 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -1,9 +1,9 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; -using JustSaying.AwsTools.MessageHandling.Compression; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; From e9a8a773ea4469f2b1287cfe1594383f645f8eda Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 13:48:52 +0100 Subject: [PATCH 05/41] Further compression development --- Directory.Packages.props | 4 +- .../Compression/MessageCompressionUtility.cs | 48 ++++++++++++ .../Compression/PublishCompressionOptions.cs | 7 ++ .../MessageHandling/SnsMessagePublisher.cs | 18 +---- .../MessageHandling/SqsMessagePublisher.cs | 60 +++++++++------ .../Fluent/AccountAddressProvider.cs | 4 +- src/JustSaying/Fluent/QueueAddress.cs | 7 +- src/JustSaying/Fluent/SqsEndpointHelper.cs | 15 ++++ src/JustSaying/JustSaying.csproj.DotSettings | 2 + .../Handle/HandlerMiddlewareBuilder.cs | 1 - .../GzipMessageBodyCompressionTests.cs | 74 +++++++++++++++++++ 11 files changed, 194 insertions(+), 46 deletions(-) create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs create mode 100644 src/JustSaying/Fluent/SqsEndpointHelper.cs create mode 100644 src/JustSaying/JustSaying.csproj.DotSettings create mode 100644 tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 6ecb07875..aaf13941d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,8 +1,8 @@ - - + + diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs new file mode 100644 index 000000000..58c8f43de --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -0,0 +1,48 @@ +using System.Text; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; + +namespace JustSaying.AwsTools.MessageHandling; + +internal static class MessageCompressionUtility +{ + public static (string compressedMessage, string contentEncoding) CompressMessageIfNeeded(string message, PublishMetadata metadata, PublishCompressionOptions compressionOptions, IMessageCompressionRegistry compressionRegistry) + { + string contentEncoding = null; + if (compressionOptions?.CompressionEncoding is { } compressionEncoding && compressionRegistry is not null) + { + var messageSize = CalculateTotalMessageSize(metadata, message); + if (messageSize > compressionOptions.MessageLengthThreshold) + { + var compression = GetCompressionAlgorithm(compressionEncoding, compressionRegistry); + message = compression.Compress(message); + contentEncoding = compressionEncoding; + } + } + + return (message, contentEncoding); + } + + private static int CalculateTotalMessageSize(PublishMetadata metadata, string message) + { + var messageSize = Encoding.UTF8.GetByteCount(message); + foreach (var attribute in metadata.MessageAttributes) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Key); + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); + messageSize += attribute.Value.BinaryValue.Count; + } + return messageSize; + } + + private static IMessageBodyCompression GetCompressionAlgorithm(string compressionEncoding, IMessageCompressionRegistry compressionRegistry) + { + var compression = compressionRegistry.GetCompression(compressionEncoding); + if (compression is null) + { + throw new PublishException($"Compression encoding '{compressionEncoding}' is not registered."); + } + return compression; + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs new file mode 100644 index 000000000..fe91fbd64 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs @@ -0,0 +1,7 @@ +namespace JustSaying.AwsTools.MessageHandling; + +public sealed class PublishCompressionOptions +{ + public int MessageLengthThreshold { get; set; } = 256 * 1024; + public string CompressionEncoding { get; set; } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 138686d9d..32622634a 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -1,4 +1,3 @@ -using System.Text; using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; @@ -98,21 +97,10 @@ private PublishRequest BuildPublishRequest(Message message, PublishMetadata meta { var messageToSend = _serializationRegister.Serialize(message, serializeForSnsPublishing: true); - string contentEncoding = null; - if (CompressionOptions?.CompressionEncoding is { } compressionEncoding && CompressionRegistry is not null) + (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageToSend, metadata, CompressionOptions, CompressionRegistry); + if (compressedMessage is not null) { - var bodyByteLength = Encoding.UTF8.GetByteCount(messageToSend); // We should probably also include the length of the message attributes - if (bodyByteLength > (CompressionOptions?.MessageLengthThreshold ?? int.MaxValue)) // Well under 256KB - { - var compression = CompressionRegistry.GetCompression(compressionEncoding); - if (compression is null) - { - throw new PublishException($"Compression encoding '{compressionEncoding}' is not registered."); - } - - messageToSend = compression.Compress(messageToSend); - contentEncoding = compressionEncoding; - } + messageToSend = compressedMessage; } var messageType = _messageSubjectProvider.GetSubjectForType(message.GetType()); diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index ae4f5a5a2..af820dd1f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -1,4 +1,3 @@ -using System.Text; using Amazon.Runtime; using Amazon.SQS; using Amazon.SQS.Model; @@ -87,29 +86,20 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad { var messageBody = GetMessageInContext(message); - string contentEncoding = null; - if (CompressionOptions?.CompressionEncoding is { } compressionEncoding && CompressionRegistry is not null) + (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageBody, metadata, CompressionOptions, CompressionRegistry); + if (compressedMessage is not null) { - var bodyByteLength = Encoding.UTF8.GetByteCount(messageBody); // We should probably also include the length of the message attributes - if (bodyByteLength > (CompressionOptions?.MessageLengthThreshold ?? int.MaxValue)) // Well under 256KB - { - var compression = CompressionRegistry.GetCompression(compressionEncoding); - if (compression is null) - { - throw new PublishException($"Compression encoding '{compressionEncoding}' is not registered."); - } - - messageBody = compression.Compress(messageBody); - contentEncoding = compressionEncoding; - } + messageBody = compressedMessage; } var request = new SendMessageRequest { MessageBody = messageBody, - QueueUrl = QueueUrl.AbsoluteUri, + QueueUrl = QueueUrl.AbsoluteUri }; + AddMessageAttributes(request.MessageAttributes, metadata); + if (contentEncoding is not null) { request.MessageAttributes.Add("Content-Encoding", new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); @@ -125,6 +115,38 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad private string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); + private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) + { + if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + { + return; + } + + foreach (var attribute in metadata.MessageAttributes) + { + requestMessageAttributes.Add(attribute.Key, BuildMessageAttributeValue(attribute.Value)); + } + } + + private static MessageAttributeValue BuildMessageAttributeValue(Messaging.MessageAttributeValue value) + { + if (value == null) + { + return null; + } + + var binaryValueStream = value.BinaryValue != null + ? new MemoryStream([.. value.BinaryValue], false) + : null; + + return new MessageAttributeValue + { + StringValue = value.StringValue, + BinaryValue = binaryValueStream, + DataType = value.DataType + }; + } + public InterrogationResult Interrogate() { return new InterrogationResult(new @@ -133,9 +155,3 @@ public InterrogationResult Interrogate() }); } } - -public sealed class PublishCompressionOptions -{ - public int MessageLengthThreshold { get; set; } = 248 * 1024; // (256KB - 8KB) for overhead - public string CompressionEncoding { get; set; } -} diff --git a/src/JustSaying/Fluent/AccountAddressProvider.cs b/src/JustSaying/Fluent/AccountAddressProvider.cs index 14dbec3ea..0f929bbe8 100644 --- a/src/JustSaying/Fluent/AccountAddressProvider.cs +++ b/src/JustSaying/Fluent/AccountAddressProvider.cs @@ -106,10 +106,10 @@ public Uri GetQueueUriByConvention() /// The for this queue. public Uri GetQueueUri(string queueName) { - var hostname = _regionEndpoint.GetEndpointForService("sqs").Hostname; + var hostname = SqsEndpointHelper.GetSqsHostname(_regionEndpoint.PartitionName, _regionEndpoint.SystemName); return new UriBuilder("https", hostname) { Path = $"{_accountId}/{queueName}" }.Uri; } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/QueueAddress.cs b/src/JustSaying/Fluent/QueueAddress.cs index 33b6ec08a..cceae0e79 100644 --- a/src/JustSaying/Fluent/QueueAddress.cs +++ b/src/JustSaying/Fluent/QueueAddress.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using Amazon; +using Amazon.SQS; namespace JustSaying.Fluent; @@ -79,9 +80,7 @@ public static QueueAddress FromArn(string queueArn) if (!Arn.TryParse(queueArn, out var arn)) throw new ArgumentException("Must be a valid ARN.", nameof(queueArn)); if (!string.Equals(arn.Service, "sqs", StringComparison.OrdinalIgnoreCase)) throw new ArgumentException("Must be an ARN for an SQS queue.", nameof(queueArn)); - var hostname = RegionEndpoint.GetBySystemName(arn.Region) - .GetEndpointForService("sqs") - .Hostname; + var hostname = SqsEndpointHelper.GetSqsHostname(arn.Partition, arn.Region); var queueUrl = new UriBuilder("https", hostname) { @@ -94,4 +93,4 @@ public static QueueAddress FromArn(string queueArn) RegionName = arn.Region }; } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/SqsEndpointHelper.cs b/src/JustSaying/Fluent/SqsEndpointHelper.cs new file mode 100644 index 000000000..b2e409e0f --- /dev/null +++ b/src/JustSaying/Fluent/SqsEndpointHelper.cs @@ -0,0 +1,15 @@ +namespace JustSaying.Fluent; + +internal static class SqsEndpointHelper +{ + public static string GetSqsHostname(string partition, string region) + { + return partition switch + { + "aws-cn" => $"sqs.{region}.amazonaws.com.cn", + "aws-us-gov" => $"sqs.{region}.amazonaws.com", + "aws" => $"sqs.{region}.amazonaws.com", + _ => throw new ArgumentException("Unknown partition.", nameof(partition)) + }; + } +} diff --git a/src/JustSaying/JustSaying.csproj.DotSettings b/src/JustSaying/JustSaying.csproj.DotSettings new file mode 100644 index 000000000..6f06f2100 --- /dev/null +++ b/src/JustSaying/JustSaying.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs b/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs index 77c07c11b..7cbaafe9d 100644 --- a/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs +++ b/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs @@ -108,7 +108,6 @@ public HandlerMiddlewareBuilder UseHandler() where TMessage : Message /// An that customises /// the pipeline. /// - public HandlerMiddlewareBuilder Configure( Action configure) { diff --git a/tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs b/tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs new file mode 100644 index 000000000..74cc2bbb0 --- /dev/null +++ b/tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs @@ -0,0 +1,74 @@ +using JustSaying.Messaging.Compression; + +namespace JustSaying.UnitTests.Messaging.Compression +{ + public class GzipMessageBodyCompressionTests + { + private readonly GzipMessageBodyCompression _compression = new(); + + [Fact] + public void ContentEncoding_ShouldReturnGzipBase64() + { + Assert.Equal(ContentEncodings.GzipBase64, _compression.ContentEncoding); + } + + [Theory] + [InlineData("")] + [InlineData("Hello, World!")] + [InlineData("This is a longer string with some special characters: !@#$%^&*()_+")] + public void Compress_ThenDecompress_ShouldReturnOriginalString(string original) + { + // Arrange + + // Act + string compressed = _compression.Compress(original); + string decompressed = _compression.Decompress(compressed); + + // Assert + Assert.Equal(original, decompressed); + } + + [Fact] + public void Compress_ShouldReturnBase64EncodedString() + { + // Arrange + string input = "Test string"; + + // Act + string compressed = _compression.Compress(input); + + // Assert + Assert.True(IsBase64String(compressed)); + } + + [Fact] + public void Decompress_WithInvalidBase64_ShouldThrowFormatException() + { + // Arrange + string invalidBase64 = "This is not a valid Base64 string"; + + // Act & Assert + Assert.Throws(() => _compression.Decompress(invalidBase64)); + } + + [Fact] + public void Compress_WithLargeString_ShouldCompressSuccessfully() + { + // Arrange + string largeString = new string('A', 1000000); // 1 million 'A' characters + + // Act + string compressed = _compression.Compress(largeString); + string decompressed = _compression.Decompress(compressed); + + // Assert + Assert.Equal(largeString, decompressed); + } + + private bool IsBase64String(string base64) + { + Span buffer = new Span(new byte[base64.Length]); + return Convert.TryFromBase64String(base64, buffer, out int _); + } + } +} From ddead74b219cafbd15b799de968e9ddf77ed2057 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 14:09:10 +0100 Subject: [PATCH 06/41] Add some extra null handling --- .../Compression/MessageCompressionUtility.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index 58c8f43de..1cadcd509 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -30,8 +30,14 @@ private static int CalculateTotalMessageSize(PublishMetadata metadata, string me { messageSize += Encoding.UTF8.GetByteCount(attribute.Key); messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); - messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); - messageSize += attribute.Value.BinaryValue.Count; + if (attribute.Value.StringValue is not null) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); + } + if (attribute.Value.BinaryValue is not null) + { + messageSize += attribute.Value.BinaryValue.Count; + } } return messageSize; } From 37eaa73eb51abc568fd633875f6088b86ffb3ece Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 14:27:41 +0100 Subject: [PATCH 07/41] Tweaked behaviour of CompressMessageIfNeeded --- .../Compression/MessageCompressionUtility.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index 1cadcd509..36b64932d 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -9,18 +9,19 @@ internal static class MessageCompressionUtility public static (string compressedMessage, string contentEncoding) CompressMessageIfNeeded(string message, PublishMetadata metadata, PublishCompressionOptions compressionOptions, IMessageCompressionRegistry compressionRegistry) { string contentEncoding = null; + string compressedMessage = null; if (compressionOptions?.CompressionEncoding is { } compressionEncoding && compressionRegistry is not null) { var messageSize = CalculateTotalMessageSize(metadata, message); if (messageSize > compressionOptions.MessageLengthThreshold) { var compression = GetCompressionAlgorithm(compressionEncoding, compressionRegistry); - message = compression.Compress(message); + compressedMessage = compression.Compress(message); contentEncoding = compressionEncoding; } } - - return (message, contentEncoding); + + return (compressedMessage, contentEncoding); } private static int CalculateTotalMessageSize(PublishMetadata metadata, string message) From 09413c369994f0ff2fc0925e82c4b4990af54218 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 14:40:23 +0100 Subject: [PATCH 08/41] Add more xml doc comments --- .../Compression/MessageCompressionUtility.cs | 30 +++++++++++++++++-- .../Compression/PublishCompressionOptions.cs | 16 ++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index 36b64932d..282cac3fb 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -4,15 +4,26 @@ namespace JustSaying.AwsTools.MessageHandling; +/// +/// Provides utility methods for compressing messages based on specified criteria. +/// internal static class MessageCompressionUtility { + /// + /// Compresses a message if it meets the specified compression criteria. + /// + /// The original message to potentially compress. + /// Metadata associated with the message. + /// Options specifying when and how to compress. + /// Registry of available compression algorithms. + /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). public static (string compressedMessage, string contentEncoding) CompressMessageIfNeeded(string message, PublishMetadata metadata, PublishCompressionOptions compressionOptions, IMessageCompressionRegistry compressionRegistry) { string contentEncoding = null; string compressedMessage = null; if (compressionOptions?.CompressionEncoding is { } compressionEncoding && compressionRegistry is not null) { - var messageSize = CalculateTotalMessageSize(metadata, message); + var messageSize = CalculateTotalMessageSize(message, metadata); if (messageSize > compressionOptions.MessageLengthThreshold) { var compression = GetCompressionAlgorithm(compressionEncoding, compressionRegistry); @@ -20,11 +31,17 @@ public static (string compressedMessage, string contentEncoding) CompressMessage contentEncoding = compressionEncoding; } } - + return (compressedMessage, contentEncoding); } - private static int CalculateTotalMessageSize(PublishMetadata metadata, string message) + /// + /// Calculates the total size of a message, including its metadata. + /// + /// The message content. + /// Metadata associated with the message. + /// The total size of the message in bytes. + private static int CalculateTotalMessageSize(string message, PublishMetadata metadata) { var messageSize = Encoding.UTF8.GetByteCount(message); foreach (var attribute in metadata.MessageAttributes) @@ -43,6 +60,13 @@ private static int CalculateTotalMessageSize(PublishMetadata metadata, string me return messageSize; } + /// + /// Retrieves the compression algorithm for the specified encoding from the compression registry. + /// + /// The encoding of the desired compression algorithm. + /// The registry containing available compression algorithms. + /// The compression algorithm corresponding to the specified encoding. + /// Thrown when the specified compression encoding is not registered. private static IMessageBodyCompression GetCompressionAlgorithm(string compressionEncoding, IMessageCompressionRegistry compressionRegistry) { var compression = compressionRegistry.GetCompression(compressionEncoding); diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs index fe91fbd64..9afa1f9ce 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs @@ -1,7 +1,23 @@ namespace JustSaying.AwsTools.MessageHandling; +/// +/// Represents options for message compression during publishing. +/// public sealed class PublishCompressionOptions { + /// + /// Gets or sets the message length threshold in bytes. + /// Messages larger than this threshold will be compressed. + /// + /// + /// The default value is 262,144 bytes (256 KB). + /// public int MessageLengthThreshold { get; set; } = 256 * 1024; + /// + /// Gets or sets the compression encoding to be used. + /// + /// + /// This should correspond to a registered compression algorithm in the IMessageCompressionRegistry. + /// public string CompressionEncoding { get; set; } } From ab075b004b4265b237b79924d9ea0dbccfa692c3 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 15:02:10 +0100 Subject: [PATCH 09/41] Add null check and remove binary breaking change --- .../MessageHandling/Dispatch/MessageDispatcher.cs | 13 +++++++++++++ .../Compression/MessageCompressionRegistry.cs | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index f44b3c83e..dfb87507e 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -32,6 +32,19 @@ public MessageDispatcher( _logger = loggerFactory.CreateLogger("JustSaying"); } + public MessageDispatcher( + IMessageSerializationRegister serializationRegister, + IMessageMonitor messagingMonitor, + MiddlewareMap middlewareMap, + ILoggerFactory loggerFactory) : this( + serializationRegister, + messagingMonitor, + middlewareMap, + null, + loggerFactory) + { + } + public async Task DispatchMessageAsync( IQueueMessageContext messageContext, CancellationToken cancellationToken) diff --git a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs index 6445b43e4..1a275dcb7 100644 --- a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs +++ b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs @@ -13,7 +13,7 @@ public sealed class MessageCompressionRegistry : IMessageCompressionRegistry /// A list of available compression methods. public MessageCompressionRegistry(IList compressions) { - _compressions = compressions; + _compressions = compressions ?? throw new ArgumentNullException(nameof(compressions)); } /// From d1dd0607853db35b7e804b61755227d4a7044352 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 15:24:11 +0100 Subject: [PATCH 10/41] Work on public api --- .../StaticPublicationConfiguration.cs | 2 +- .../QueueAddressPublicationBuilder`1.cs | 10 +++- .../TopicAddressPublicationBuilder`1.cs | 10 +++- .../Fluent/TopicPublicationBuilder`1.cs | 2 + src/JustSaying/IMessagingConfig.cs | 2 + src/JustSaying/JustSaying.csproj | 1 - .../PublicAPI/net461/PublicAPI.Shipped.txt | 1 - .../PublicAPI/net461/PublicAPI.Unshipped.txt | 51 +++++++++++++++---- .../PublicAPI/net8.0/PublicAPI.Shipped.txt | 1 - .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 51 +++++++++++++++---- .../netstandard2.0/PublicAPI.Shipped.txt | 1 - .../netstandard2.0/PublicAPI.Unshipped.txt | 51 +++++++++++++++---- 12 files changed, 147 insertions(+), 36 deletions(-) diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index d8666325a..b6b234f8b 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -38,7 +38,7 @@ public static StaticPublicationConfiguration Build( { MessageResponseLogger = bus.Config.MessageResponseLogger, CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = writeConfiguration.CompressionOptions, + CompressionOptions = writeConfiguration.CompressionOptions ?? bus.Config.CompressionOptions }; var snsTopic = new SnsTopicByName( diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index 2c35a6aff..2d1a40119 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -27,9 +27,15 @@ internal QueueAddressPublicationBuilder(QueueAddress queueAddress) _queueAddress = queueAddress; } + /// + /// Sets the compression options for publishing messages. + /// + /// The compression options to use when publishing messages. + /// The current instance of for method chaining. + /// Thrown when is null. public QueueAddressPublicationBuilder WithCompression(PublishCompressionOptions compressionOptions) { - _compressionOptions = compressionOptions; + _compressionOptions = compressionOptions ?? throw new ArgumentNullException(nameof(compressionOptions)); return this; } @@ -51,7 +57,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa { MessageResponseLogger = config.MessageResponseLogger, CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = _compressionOptions + CompressionOptions = _compressionOptions ?? bus.Config.CompressionOptions }; bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 1b3646390..948c719bf 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -44,9 +44,15 @@ public TopicAddressPublicationBuilder WithExceptionHandler(Func + /// Sets the compression options for publishing messages. + /// + /// The compression options to use when publishing messages. + /// The current instance of for method chaining. + /// Thrown when is null. public TopicAddressPublicationBuilder WithCompression(PublishCompressionOptions compressionOptions) { - _compressionOptions = compressionOptions; + _compressionOptions = compressionOptions ?? throw new ArgumentNullException(nameof(compressionOptions)); return this; } @@ -72,7 +78,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa { MessageResponseLogger = config.MessageResponseLogger, CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = _compressionOptions + CompressionOptions = _compressionOptions ?? bus.Config.CompressionOptions }; bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs index cb3cd2bda..a02830a59 100644 --- a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs @@ -171,6 +171,8 @@ void IPublicationBuilder.Configure( var writeConfiguration = new SnsWriteConfiguration(); ConfigureWrites?.Invoke(writeConfiguration); + writeConfiguration.CompressionOptions ??= bus.Config.CompressionOptions; + if (writeConfiguration.CompressionOptions?.CompressionEncoding is { } compressionEncoding) { if (bus.CompressionRegistry.GetCompression(compressionEncoding) is null) diff --git a/src/JustSaying/IMessagingConfig.cs b/src/JustSaying/IMessagingConfig.cs index ea029a05f..38914523b 100644 --- a/src/JustSaying/IMessagingConfig.cs +++ b/src/JustSaying/IMessagingConfig.cs @@ -1,3 +1,4 @@ +using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Naming; @@ -9,5 +10,6 @@ public interface IMessagingConfig : IPublishConfiguration IMessageSubjectProvider MessageSubjectProvider { get; set; } ITopicNamingConvention TopicNamingConvention { get; set; } IQueueNamingConvention QueueNamingConvention { get; set; } + PublishCompressionOptions CompressionOptions { get; set; } void Validate(); } diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index 362b1479e..edbd7e93b 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -2,7 +2,6 @@ true netstandard2.0;net461;net8.0 - $(NoWarn);RS0016;RS0017 diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt index aa86cc180..6506eb396 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt @@ -91,7 +91,6 @@ JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collection JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index 42e65c708..bbcf3bd1d 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -1,9 +1,42 @@ -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string -JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry -JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList decompressors) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void \ No newline at end of file +const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.set -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.IMessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.CompressionOptions.set -> void +JustSaying.Messaging.Compression.ContentEncodings +JustSaying.Messaging.Compression.GzipMessageBodyCompression +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void +JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry +JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void +JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.CompressionOptions.set -> void \ No newline at end of file diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt index a8755e383..c087cf93b 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -90,7 +90,6 @@ JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collection JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 42e65c708..bbcf3bd1d 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -1,9 +1,42 @@ -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string -JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry -JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList decompressors) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void \ No newline at end of file +const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.set -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.IMessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.CompressionOptions.set -> void +JustSaying.Messaging.Compression.ContentEncodings +JustSaying.Messaging.Compression.GzipMessageBodyCompression +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void +JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry +JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void +JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.CompressionOptions.set -> void \ No newline at end of file diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index aa86cc180..6506eb396 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -91,7 +91,6 @@ JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collection JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index a3c5eeb62..17544a82b 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,9 +1,42 @@ -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string -JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string -JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry -JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor -JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList decompressors) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.set -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.IMessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.CompressionOptions.set -> void +JustSaying.Messaging.Compression.ContentEncodings +JustSaying.Messaging.Compression.GzipMessageBodyCompression +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void +JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageCompressionRegistry +JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry +JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void +JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.CompressionOptions.set -> void From fff650626f69f6537f28f598e3b9579d1050946b Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 15:26:41 +0100 Subject: [PATCH 11/41] Add back API which was made private --- src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs | 2 +- src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt | 1 + src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt | 1 + src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index af820dd1f..f1b8f705f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -113,7 +113,7 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad return request; } - private string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); + public string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) { diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index bbcf3bd1d..2e72ac90e 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -15,6 +15,7 @@ JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get - JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index bbcf3bd1d..2e72ac90e 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -15,6 +15,7 @@ JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get - JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 17544a82b..6f7887fdb 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -15,6 +15,7 @@ JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get - JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions From aa326ce6d6e24b33fa4a3dc64bbd5b59f93690a9 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 15:34:24 +0100 Subject: [PATCH 12/41] Fix up API files --- src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt | 2 ++ src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt | 4 +--- src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt | 2 ++ src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt | 4 +--- src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt | 2 ++ .../PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt | 2 -- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt index 6506eb396..ac3e28b2f 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt @@ -34,6 +34,7 @@ JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool @@ -91,6 +92,7 @@ JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collection JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index 2e72ac90e..6570f617b 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -1,6 +1,5 @@ const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void @@ -15,7 +14,6 @@ JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get - JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions @@ -40,4 +38,4 @@ JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.CompressionOptions.set -> void \ No newline at end of file +JustSaying.MessagingConfig.CompressionOptions.set -> void diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt index c087cf93b..a1c0546c3 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -34,6 +34,7 @@ JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool @@ -90,6 +91,7 @@ JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collection JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 2e72ac90e..6570f617b 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -1,6 +1,5 @@ const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void @@ -15,7 +14,6 @@ JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get - JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions @@ -40,4 +38,4 @@ JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.CompressionOptions.set -> void \ No newline at end of file +JustSaying.MessagingConfig.CompressionOptions.set -> void diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index 6506eb396..ac3e28b2f 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -34,6 +34,7 @@ JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool @@ -91,6 +92,7 @@ JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collection JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 6f7887fdb..6570f617b 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,6 +1,5 @@ const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void @@ -15,7 +14,6 @@ JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get - JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions From c9ec0f9739fe5cb4d4cb7747269e66a5bcfac62f Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 15:53:18 +0100 Subject: [PATCH 13/41] Add tests and fixes --- .../Compression/MessageCompressionUtility.cs | 23 ++-- src/JustSaying/Messaging/PublishMetadata.cs | 2 +- .../MessageCompressionUtilityTests.cs | 119 ++++++++++++++++++ 3 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index 282cac3fb..0ef84f50f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -44,19 +44,24 @@ public static (string compressedMessage, string contentEncoding) CompressMessage private static int CalculateTotalMessageSize(string message, PublishMetadata metadata) { var messageSize = Encoding.UTF8.GetByteCount(message); - foreach (var attribute in metadata.MessageAttributes) + if (metadata?.MessageAttributes != null) { - messageSize += Encoding.UTF8.GetByteCount(attribute.Key); - messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); - if (attribute.Value.StringValue is not null) + foreach (var attribute in metadata.MessageAttributes) { - messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); - } - if (attribute.Value.BinaryValue is not null) - { - messageSize += attribute.Value.BinaryValue.Count; + messageSize += Encoding.UTF8.GetByteCount(attribute.Key); + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); + if (attribute.Value.StringValue is not null) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); + } + + if (attribute.Value.BinaryValue is not null) + { + messageSize += attribute.Value.BinaryValue.Count; + } } } + return messageSize; } diff --git a/src/JustSaying/Messaging/PublishMetadata.cs b/src/JustSaying/Messaging/PublishMetadata.cs index cde53e33a..b1b499fbf 100644 --- a/src/JustSaying/Messaging/PublishMetadata.cs +++ b/src/JustSaying/Messaging/PublishMetadata.cs @@ -16,7 +16,7 @@ public PublishMetadata AddMessageAttribute(string key, IReadOnlyCollection DataType = "Binary" }; - MessageAttributes[key] = mav; + AddMessageAttribute(key, mav); return this; } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs new file mode 100644 index 000000000..33b346e40 --- /dev/null +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs @@ -0,0 +1,119 @@ +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.AwsTools.MessageHandling; + +public class MessageCompressionUtilityTests +{ + private readonly IMessageCompressionRegistry _compressionRegistry; + + public MessageCompressionUtilityTests() + { + _compressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); + } + + [Fact] + public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() + { + // Arrange + var message = "Test message"; + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions(); + + // Act + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + + // Assert + Assert.Null(result.compressedMessage); + Assert.Null(result.contentEncoding); + } + + [Fact] + public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMessage() + { + // Arrange + var message = "Short message"; + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 1000 + }; + + // Act + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + + // Assert + Assert.Null(result.compressedMessage); + Assert.Null(result.contentEncoding); + } + + [Fact] + public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMessage() + { + // Arrange + var message = new string('a', 1000); + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 500 + }; + + // Act + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } + + [Fact] + public void CompressMessageIfNeeded_UnregisteredCompression_ThrowsPublishException() + { + // Arrange + var message = new string('a', 1000); + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = "unknown", + MessageLengthThreshold = 500 + }; + + // Act & Assert + Assert.Throws(() => + MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry)); + } + + [Fact] + public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() + { + // Arrange + var message = "Test message"; + var metadata = new PublishMetadata(); + metadata.AddMessageAttribute("Key1", new MessageAttributeValue { StringValue = "Value1", DataType = "String" }); + metadata.AddMessageAttribute("Key2", new MessageAttributeValue { BinaryValue = new byte[100], DataType = "Binary" }); + + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 50 + }; + + // Act + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } +} From a4ef78c36b742145d5a62822418cc68415a544ff Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 16:16:24 +0100 Subject: [PATCH 14/41] Move missing encoding check --- .../Compression/MessageCompressionUtility.cs | 5 ----- .../Dispatch/MessageDispatcher.cs | 6 +++++- .../MessageCompressionUtilityTests.cs | 17 ----------------- 3 files changed, 5 insertions(+), 23 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index 0ef84f50f..f14ed577f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -71,14 +71,9 @@ private static int CalculateTotalMessageSize(string message, PublishMetadata met /// The encoding of the desired compression algorithm. /// The registry containing available compression algorithms. /// The compression algorithm corresponding to the specified encoding. - /// Thrown when the specified compression encoding is not registered. private static IMessageBodyCompression GetCompressionAlgorithm(string compressionEncoding, IMessageCompressionRegistry compressionRegistry) { var compression = compressionRegistry.GetCompression(compressionEncoding); - if (compression is null) - { - throw new PublishException($"Compression encoding '{compressionEncoding}' is not registered."); - } return compression; } } diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index dfb87507e..3e2859b0b 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -100,7 +100,11 @@ await middleware.RunAsync(handleContext, null, cancellationToken) if (contentEncoding is not null) { var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); - // TODO What to do when decompressor not found? + if (decompressor is null) + { + throw new PublishException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + } + var decompressedBody = decompressor.Decompress(messageContext.Message.Body); messageContext.Message.Body = decompressedBody; } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs index 33b346e40..fd58c0cb0 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs @@ -72,23 +72,6 @@ public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMes Assert.Equal(message, decompressedMessage); } - [Fact] - public void CompressMessageIfNeeded_UnregisteredCompression_ThrowsPublishException() - { - // Arrange - var message = new string('a', 1000); - var metadata = new PublishMetadata(); - var compressionOptions = new PublishCompressionOptions - { - CompressionEncoding = "unknown", - MessageLengthThreshold = 500 - }; - - // Act & Assert - Assert.Throws(() => - MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry)); - } - [Fact] public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() { From 619b1993a2474066570492e2bb76807abd0f1b20 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 18:22:13 +0100 Subject: [PATCH 15/41] Add extra validation --- .../Dispatch/MessageDispatcher.cs | 2 +- .../QueueCreation/SqsBasicConfiguration.cs | 1 + .../Fluent/CompressionEncodingValidator.cs | 18 ++++++++++++++++++ .../Fluent/QueueAddressConfiguration.cs | 1 + .../Fluent/QueueAddressPublicationBuilder`1.cs | 1 + .../Fluent/TopicAddressPublicationBuilder`1.cs | 2 ++ .../Fluent/TopicPublicationBuilder`1.cs | 9 +-------- 7 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/JustSaying/Fluent/CompressionEncodingValidator.cs diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 3e2859b0b..09d412db2 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -102,7 +102,7 @@ await middleware.RunAsync(handleContext, null, cancellationToken) var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); if (decompressor is null) { - throw new PublishException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); } var decompressedBody = decompressor.Decompress(messageContext.Message.Body); diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs index 9fc565263..fc1a4a5c2 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs @@ -1,4 +1,5 @@ using JustSaying.AwsTools.MessageHandling; +using JustSaying.Fluent; using JustSaying.Naming; namespace JustSaying.AwsTools.QueueCreation; diff --git a/src/JustSaying/Fluent/CompressionEncodingValidator.cs b/src/JustSaying/Fluent/CompressionEncodingValidator.cs new file mode 100644 index 000000000..70ddd4a89 --- /dev/null +++ b/src/JustSaying/Fluent/CompressionEncodingValidator.cs @@ -0,0 +1,18 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; + +namespace JustSaying.Fluent; + +internal static class CompressionEncodingValidator +{ + public static void ValidateEncoding(IMessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions) + { + if (compressionOptions?.CompressionEncoding is { } compressionEncoding) + { + if (compressionRegistry.GetCompression(compressionEncoding) is null) + { + throw new InvalidOperationException($"Compression encoding '{compressionEncoding}' is not registered with the bus."); + } + } + } +} diff --git a/src/JustSaying/Fluent/QueueAddressConfiguration.cs b/src/JustSaying/Fluent/QueueAddressConfiguration.cs index b0a4d28d7..fe15e0a86 100644 --- a/src/JustSaying/Fluent/QueueAddressConfiguration.cs +++ b/src/JustSaying/Fluent/QueueAddressConfiguration.cs @@ -5,6 +5,7 @@ namespace JustSaying.Fluent; public sealed class QueueAddressConfiguration { public string SubscriptionGroupName { get; set; } + public Action MiddlewareConfiguration { get; set; } public void Validate() diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index 2d1a40119..45a6cb51b 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -59,6 +59,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa CompressionRegistry = bus.CompressionRegistry, CompressionOptions = _compressionOptions ?? bus.Config.CompressionOptions }; + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 948c719bf..64a51117c 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -80,6 +80,8 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa CompressionRegistry = bus.CompressionRegistry, CompressionOptions = _compressionOptions ?? bus.Config.CompressionOptions }; + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); + bus.AddMessagePublisher(eventPublisher); logger.LogInformation( diff --git a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs index a02830a59..44585674c 100644 --- a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs @@ -172,14 +172,7 @@ void IPublicationBuilder.Configure( var writeConfiguration = new SnsWriteConfiguration(); ConfigureWrites?.Invoke(writeConfiguration); writeConfiguration.CompressionOptions ??= bus.Config.CompressionOptions; - - if (writeConfiguration.CompressionOptions?.CompressionEncoding is { } compressionEncoding) - { - if (bus.CompressionRegistry.GetCompression(compressionEncoding) is null) - { - throw new InvalidOperationException($"Compression encoding '{compressionEncoding}' is not registered with the bus."); - } - } + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, writeConfiguration.CompressionOptions); var client = proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(region)); From ce4b6d4a620a345b782a56668d9d1346fbf9da6e Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 18:26:49 +0100 Subject: [PATCH 16/41] Add unit tests --- .../CompressionEncodingValidatorTests.cs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs diff --git a/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs b/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs new file mode 100644 index 000000000..09ba02287 --- /dev/null +++ b/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs @@ -0,0 +1,55 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Fluent; +using JustSaying.Messaging.Compression; + +namespace JustSaying.UnitTests.Fluent; + +public class CompressionEncodingValidatorTests +{ + [Fact] + public void ValidateEncoding_WithNullCompressionOptions_DoesNotThrow() + { + // Arrange + var registry = new MessageCompressionRegistry([]); + + // Act & Assert + CompressionEncodingValidator.ValidateEncoding(registry, null); + } + + [Fact] + public void ValidateEncoding_WithNullCompressionEncoding_DoesNotThrow() + { + // Arrange + var registry = new MessageCompressionRegistry([]); + var options = new PublishCompressionOptions { CompressionEncoding = null }; + + // Act & Assert + CompressionEncodingValidator.ValidateEncoding(registry, options); + } + + [Fact] + public void ValidateEncoding_WithRegisteredEncoding_DoesNotThrow() + { + // Arrange + var gzipCompression = new GzipMessageBodyCompression(); + var registry = new MessageCompressionRegistry([gzipCompression]); + var options = new PublishCompressionOptions { CompressionEncoding = ContentEncodings.GzipBase64 }; + + // Act & Assert + CompressionEncodingValidator.ValidateEncoding(registry, options); + } + + [Fact] + public void ValidateEncoding_WithUnregisteredEncoding_ThrowsInvalidOperationException() + { + // Arrange + var registry = new MessageCompressionRegistry([]); + var options = new PublishCompressionOptions { CompressionEncoding = "unknown" }; + + // Act & Assert + var exception = Assert.Throws(() => + CompressionEncodingValidator.ValidateEncoding(registry, options)); + + Assert.Equal("Compression encoding 'unknown' is not registered with the bus.", exception.Message); + } +} From b3e52226abd283893faccc232f5aeda13d7041d8 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 8 Jul 2024 18:36:29 +0100 Subject: [PATCH 17/41] Rename DefaultCompressionOptions --- .../PublishConfig/StaticPublicationConfiguration.cs | 2 +- src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs | 2 +- src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs | 2 +- src/JustSaying/Fluent/TopicPublicationBuilder`1.cs | 2 +- src/JustSaying/IMessagingConfig.cs | 2 +- src/JustSaying/MessagingConfig.cs | 4 ++-- src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt | 8 ++++---- src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt | 8 ++++---- .../PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt | 8 ++++---- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index b6b234f8b..eea93e30f 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -38,7 +38,7 @@ public static StaticPublicationConfiguration Build( { MessageResponseLogger = bus.Config.MessageResponseLogger, CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = writeConfiguration.CompressionOptions ?? bus.Config.CompressionOptions + CompressionOptions = writeConfiguration.CompressionOptions ?? bus.Config.DefaultCompressionOptions }; var snsTopic = new SnsTopicByName( diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index 45a6cb51b..bff1bab00 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -57,7 +57,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa { MessageResponseLogger = config.MessageResponseLogger, CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = _compressionOptions ?? bus.Config.CompressionOptions + CompressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions }; CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 64a51117c..505dcdb08 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -78,7 +78,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa { MessageResponseLogger = config.MessageResponseLogger, CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = _compressionOptions ?? bus.Config.CompressionOptions + CompressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions }; CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); diff --git a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs index 44585674c..893f05dbc 100644 --- a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs @@ -171,7 +171,7 @@ void IPublicationBuilder.Configure( var writeConfiguration = new SnsWriteConfiguration(); ConfigureWrites?.Invoke(writeConfiguration); - writeConfiguration.CompressionOptions ??= bus.Config.CompressionOptions; + writeConfiguration.CompressionOptions ??= bus.Config.DefaultCompressionOptions; CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, writeConfiguration.CompressionOptions); var client = proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(region)); diff --git a/src/JustSaying/IMessagingConfig.cs b/src/JustSaying/IMessagingConfig.cs index 38914523b..e6e559209 100644 --- a/src/JustSaying/IMessagingConfig.cs +++ b/src/JustSaying/IMessagingConfig.cs @@ -10,6 +10,6 @@ public interface IMessagingConfig : IPublishConfiguration IMessageSubjectProvider MessageSubjectProvider { get; set; } ITopicNamingConvention TopicNamingConvention { get; set; } IQueueNamingConvention QueueNamingConvention { get; set; } - PublishCompressionOptions CompressionOptions { get; set; } + PublishCompressionOptions DefaultCompressionOptions { get; set; } void Validate(); } diff --git a/src/JustSaying/MessagingConfig.cs b/src/JustSaying/MessagingConfig.cs index d55a45370..41395e257 100644 --- a/src/JustSaying/MessagingConfig.cs +++ b/src/JustSaying/MessagingConfig.cs @@ -16,7 +16,7 @@ public MessagingConfig() MessageSubjectProvider = new NonGenericMessageSubjectProvider(); TopicNamingConvention = new DefaultNamingConventions(); QueueNamingConvention = new DefaultNamingConventions(); - CompressionOptions = new PublishCompressionOptions(); + DefaultCompressionOptions = new PublishCompressionOptions(); } public int PublishFailureReAttempts { get; set; } @@ -27,7 +27,7 @@ public MessagingConfig() public IMessageSubjectProvider MessageSubjectProvider { get; set; } public ITopicNamingConvention TopicNamingConvention { get; set; } public IQueueNamingConvention QueueNamingConvention { get; set; } - public PublishCompressionOptions CompressionOptions { get; set; } + public PublishCompressionOptions DefaultCompressionOptions { get; set; } public virtual void Validate() { diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index 6570f617b..d1d604a14 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -20,8 +20,8 @@ JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get - JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IMessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.IMessagingConfig.CompressionOptions.set -> void +JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void JustSaying.Messaging.Compression.ContentEncodings JustSaying.Messaging.Compression.GzipMessageBodyCompression JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string @@ -37,5 +37,5 @@ JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(stri JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void -JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.CompressionOptions.set -> void +JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 6570f617b..d1d604a14 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -20,8 +20,8 @@ JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get - JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IMessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.IMessagingConfig.CompressionOptions.set -> void +JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void JustSaying.Messaging.Compression.ContentEncodings JustSaying.Messaging.Compression.GzipMessageBodyCompression JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string @@ -37,5 +37,5 @@ JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(stri JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void -JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.CompressionOptions.set -> void +JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 6570f617b..d1d604a14 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -20,8 +20,8 @@ JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get - JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IMessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.IMessagingConfig.CompressionOptions.set -> void +JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void JustSaying.Messaging.Compression.ContentEncodings JustSaying.Messaging.Compression.GzipMessageBodyCompression JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string @@ -37,5 +37,5 @@ JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(stri JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void -JustSaying.MessagingConfig.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.CompressionOptions.set -> void +JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void From 82a0bca63815a9da0a4f7967db32ec4b6348a1c9 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Tue, 9 Jul 2024 02:23:13 +0100 Subject: [PATCH 18/41] More work --- .../IServiceCollectionExtensions.cs | 5 +- .../JustSayingRegistry.cs | 5 +- .../AwsTools/MessageAttributeKeys.cs | 12 ++++ .../Dispatch/MessageDispatcher.cs | 12 ---- .../MessageHandling/SnsMessagePublisher.cs | 2 +- .../MessageHandling/SqsMessagePublisher.cs | 2 +- .../ServiceResolver/DefaultServiceResolver.cs | 10 ++- src/JustSaying/JustSaying.csproj | 1 + .../Channels/Receive/MessageReceiveBuffer.cs | 4 +- .../MessageSerializationRegister.cs | 66 +++++++++++++++++-- .../SystemTextJsonSerializer.cs | 1 - .../PublicAPI/net461/PublicAPI.Unshipped.txt | 2 +- .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 2 +- .../netstandard2.0/PublicAPI.Unshipped.txt | 2 +- .../MessagingBusBuilderTestExtensions.cs | 14 +++- ...henAMessageIsPublishedWithCompressioncs.cs | 61 +++++++++++++++++ .../AwsFactAttribute.cs | 2 +- .../TestEnvironment.cs | 18 ++--- .../WhenDispatchingCompressedMessage.cs | 10 +-- .../JustSayingBus/WhenPublishingMessages.cs | 2 +- 20 files changed, 188 insertions(+), 45 deletions(-) create mode 100644 src/JustSaying/AwsTools/MessageAttributeKeys.cs create mode 100644 tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index 47b6ebbc6..f9e6dc5c8 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -4,6 +4,7 @@ using JustSaying.AwsTools.QueueCreation; using JustSaying.Fluent; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware.Logging; @@ -138,12 +139,14 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); + services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); services.TryAddSingleton( (p) => { var config = p.GetRequiredService(); var serializerFactory = p.GetRequiredService(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); + var compressionRegistry = p.GetRequiredService(); + return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory, compressionRegistry); }); services.TryAddSingleton(); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index f075905a9..d13e9afef 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -2,6 +2,7 @@ using JustSaying.AwsTools.QueueCreation; using JustSaying.Fluent; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware.Logging; @@ -42,6 +43,7 @@ public JustSayingRegistry() For().Transient(); For().Transient(); + For().Use((p) => new MessageCompressionRegistry(new List { new GzipMessageBodyCompression() })).Singleton(); For() .Use( nameof(IMessageSerializationRegister), @@ -49,7 +51,8 @@ public JustSayingRegistry() { var config = p.GetInstance(); var serializerFactory = p.GetInstance(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); + var compressionRegistry = p.GetInstance(); + return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory, compressionRegistry); }) .Singleton(); diff --git a/src/JustSaying/AwsTools/MessageAttributeKeys.cs b/src/JustSaying/AwsTools/MessageAttributeKeys.cs new file mode 100644 index 000000000..1370f7218 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageAttributeKeys.cs @@ -0,0 +1,12 @@ +namespace JustSaying.AwsTools; + +/// +/// Contains constant key values for message attributes. +/// +internal static class MessageAttributeKeys +{ + /// + /// Represents the key for the Content-Encoding attribute. + /// + public const string ContentEncoding = "Content-Encoding"; +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 09d412db2..89ff46f2b 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -96,18 +96,6 @@ await middleware.RunAsync(handleContext, null, cancellationToken) _logger.LogDebug("Attempting to deserialize message with serialization register {Type}", _serializationRegister.GetType().FullName); - messageContext.Message.MessageAttributes.TryGetValue("Content-Encoding", out var contentEncoding); - if (contentEncoding is not null) - { - var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); - if (decompressor is null) - { - throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); - } - - var decompressedBody = decompressor.Decompress(messageContext.Message.Body); - messageContext.Message.Body = decompressedBody; - } var messageWithAttributes = _serializationRegister.DeserializeMessage(messageContext.Message.Body); return (true, messageWithAttributes.Message, messageWithAttributes.MessageAttributes); } diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 32622634a..1eacf8504 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -116,7 +116,7 @@ private PublishRequest BuildPublishRequest(Message message, PublishMetadata meta if (contentEncoding is not null) { - request.MessageAttributes.Add("Content-Encoding", new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + request.MessageAttributes.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); } return request; diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index f1b8f705f..895411ac6 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -102,7 +102,7 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad if (contentEncoding is not null) { - request.MessageAttributes.Add("Content-Encoding", new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + request.MessageAttributes.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); } if (metadata?.Delay != null) diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index 5b1e8c8d6..4dd522d53 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -1,4 +1,5 @@ using JustSaying.AwsTools; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.Naming; @@ -46,11 +47,16 @@ private object TryResolveService(Type desiredType) { return new NewtonsoftSerializationFactory(); } + else if (desiredType == typeof(IMessageCompressionRegistry)) + { + return new MessageCompressionRegistry([new GzipMessageBodyCompression()]); + } else if (desiredType == typeof(IMessageSerializationRegister)) { return new MessageSerializationRegister( ResolveService(), - ResolveService()); + ResolveService(), + ResolveService()); } else if (desiredType == typeof(IMessageSubjectProvider)) { @@ -63,4 +69,4 @@ private object TryResolveService(Type desiredType) return null; } -} \ No newline at end of file +} diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index edbd7e93b..a9989526b 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -2,6 +2,7 @@ true netstandard2.0;net461;net8.0 + $(NoWarn);RS0016 diff --git a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs index 5d53c24ea..36a325955 100644 --- a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs +++ b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs @@ -1,6 +1,7 @@ using System.Threading.Channels; using Amazon.SQS; using Amazon.SQS.Model; +using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Channels.Context; using JustSaying.Messaging.Interrogation; @@ -57,6 +58,7 @@ public MessageReceiveBuffer( _channel = Channel.CreateBounded(bufferSize); _requestMessageAttributeNames.Add(MessageSystemAttributeName.ApproximateReceiveCount); + _requestMessageAttributeNames.Add(MessageAttributeKeys.ContentEncoding); } /// @@ -142,8 +144,6 @@ private async Task> GetMessagesAsync(int count, CancellationToken RegionName = _sqsQueueReader.RegionSystemName, }; - _requestMessageAttributeNames.Add("content"); - messages = await _sqsMiddleware.RunAsync(context, async ct => await _sqsQueueReader diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs index 3fa3fb4b9..51595272d 100644 --- a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs +++ b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs @@ -1,17 +1,33 @@ using System.Collections.Concurrent; +using System.Text; +using System.Text.Json; +using JustSaying.AwsTools; +using JustSaying.Messaging.Compression; using JustSaying.Models; namespace JustSaying.Messaging.MessageSerialization; -public class MessageSerializationRegister( - IMessageSubjectProvider messageSubjectProvider, - IMessageSerializationFactory serializationFactory) : IMessageSerializationRegister +public class MessageSerializationRegister : IMessageSerializationRegister { - private readonly IMessageSubjectProvider _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); - private readonly IMessageSerializationFactory _serializationFactory = serializationFactory; + private readonly IMessageSubjectProvider _messageSubjectProvider; + private readonly IMessageSerializationFactory _serializationFactory; + private readonly IMessageCompressionRegistry _compressionRegistry; private readonly ConcurrentDictionary> _typeSerializersBySubject = new(StringComparer.OrdinalIgnoreCase); private readonly HashSet _messageSerializers = new(); + public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, + IMessageSerializationFactory serializationFactory) : this(messageSubjectProvider, serializationFactory, null) + { + } + + public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, + IMessageSerializationFactory serializationFactory, IMessageCompressionRegistry compressionRegistry) + { + _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); + _serializationFactory = serializationFactory; + _compressionRegistry = compressionRegistry; + } + public void AddSerializer() where T : Message { string key = _messageSubjectProvider.GetSubjectForType(typeof(T)); @@ -44,6 +60,46 @@ public MessageWithAttributes DeserializeMessage(string body) TypeSerializer typeSerializer = lazyTypeSerializer.Value; var attributes = typeSerializer.Serializer.GetMessageAttributes(body); + // TODO This is bad and needs designing around... + var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); + if (contentEncoding is not null) + { + var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); + if (decompressor is null) + { + throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + } + + using var document = JsonDocument.Parse(body); + JsonElement element = document.RootElement.GetProperty("Message"); + string json = element.ToString(); + + var decompressedBody = decompressor.Decompress(json); + + using var memoryStream = new MemoryStream(); + using (var jsonWriter = new Utf8JsonWriter(memoryStream)) + { + jsonWriter.WriteStartObject(); + foreach (var property in document.RootElement.EnumerateObject()) + { + if (property.Name == "Message") + { + jsonWriter.WritePropertyName("Message"); + jsonWriter.WriteStringValue(decompressedBody); + } + else + { + property.WriteTo(jsonWriter); + } + } + jsonWriter.WriteEndObject(); + } + + // Update body with the new document string + body = Encoding.UTF8.GetString(memoryStream.ToArray()); + + } + var message = typeSerializer.Serializer.Deserialize(body, typeSerializer.Type); return new MessageWithAttributes(message, attributes); } diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs index 9d124fcba..1443c4f80 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs @@ -90,7 +90,6 @@ public Message Deserialize(string message, Type type) using var document = JsonDocument.Parse(message); JsonElement element = document.RootElement.GetProperty("Message"); string json = element.ToString(); - return (Message)JsonSerializer.Deserialize(json, type, _options); } diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index d1d604a14..b0477dac3 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -1,5 +1,4 @@ const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void @@ -37,5 +36,6 @@ JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(stri JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry) -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index d1d604a14..b0477dac3 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -1,5 +1,4 @@ const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void @@ -37,5 +36,6 @@ JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(stri JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry) -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index d1d604a14..b0477dac3 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,5 +1,4 @@ const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void @@ -37,5 +36,6 @@ JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(stri JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry) -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs index 9363a4b85..7a114a291 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs @@ -30,4 +30,16 @@ public static MessagingBusBuilder WithLoopbackTopic(this MessagingBusBuilder configure?.Invoke(subscriptionBuilder); })); } -} \ No newline at end of file + + public static MessagingBusBuilder WithLoopbackTopicAndPublicationOptions(this MessagingBusBuilder builder, string name, + Action> configure = null) + where T : Message + { + return builder + .Publications((options) => options.WithTopic(configure)) + .Subscriptions((options) => options.ForTopic(subscriptionBuilder => + { + subscriptionBuilder.WithQueueName(name); + })); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs new file mode 100644 index 000000000..1c99f17ce --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs @@ -0,0 +1,61 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedWithCompression(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder.WithLoopbackTopicAndPublicationOptions(UniqueName, + c => + { + c.WithWriteConfiguration(writeConfiguration => + { + writeConfiguration.CompressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 100 + }; + }); + })) + .AddSingleton() + .AddSingleton>(handler); + + var message = new SimpleMessage + { + // Content longer than 100 bytes + Content = + """ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + """ + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(message.Content); + }); + }); + } +} diff --git a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs index 6d3646f0a..d7d2e0a32 100644 --- a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs +++ b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs @@ -13,4 +13,4 @@ public AwsFactAttribute() Skip = "This test requires either an AWS simulator URL or AWS credentials to be configured."; } } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/TestEnvironment.cs b/tests/JustSaying.TestingFramework/TestEnvironment.cs index 0aac57823..41de48542 100644 --- a/tests/JustSaying.TestingFramework/TestEnvironment.cs +++ b/tests/JustSaying.TestingFramework/TestEnvironment.cs @@ -45,13 +45,15 @@ public static Uri SimulatorUrl { get { - var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); - if (string.IsNullOrWhiteSpace(awsEnv)) - { - return null; - } - - return new Uri(awsEnv, UriKind.Absolute); + // TODO Undo this change + return new Uri("http://localhost:4566", UriKind.Absolute); + // var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); + // if (string.IsNullOrWhiteSpace(awsEnv)) + // { + // return null; + // } + // + // return new Uri(awsEnv, UriKind.Absolute); } } @@ -111,4 +113,4 @@ public static RegionEndpoint SecondaryRegion private static string RegionName => Environment.GetEnvironmentVariable("AWS_REGION"); private static string SecondaryRegionName => Environment.GetEnvironmentVariable("AWS_REGION_SECONDARY"); -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 40a16bc30..7436c46ae 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -19,13 +19,16 @@ public async Task ShouldDecompressMessage() { // Arrange var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; + var decompressorRegistry = + new MessageCompressionRegistry([new GzipMessageBodyCompression()]); var messageSerializer = new MessageSerializationRegister( new NonGenericMessageSubjectProvider(), - new SystemTextJsonSerializationFactory()); + new SystemTextJsonSerializationFactory(), + decompressorRegistry); messageSerializer.AddSerializer(); - var payload = messageSerializer.Serialize(originalMessage, false); + var payload = messageSerializer.Serialize(originalMessage, true); var memoryStream = new MemoryStream(); await using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) @@ -44,9 +47,6 @@ public async Task ShouldDecompressMessage() } }; - var decompressorRegistry = - new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty())); var queueReader = new SqsQueueReader(queue); var messageContext = queueReader.ToMessageContext(sqsMessage); diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs index 1ae0e0b1a..7d9deea82 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs @@ -30,4 +30,4 @@ public void PublishMessageTimeStatsSent() { Monitor.PublishMessageTimes.ShouldHaveSingleItem(); } -} \ No newline at end of file +} From cd4f61b65516360c7d118a5ddce36d26b34db659 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Tue, 9 Jul 2024 02:27:51 +0100 Subject: [PATCH 19/41] WIP --- .../MessageDispatcherTests/WhenDispatchingCompressedMessage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 7436c46ae..7104506f3 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -14,7 +14,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; public class WhenDispatchingCompressedMessage { - [Fact] + [Fact(Skip = "for now")] public async Task ShouldDecompressMessage() { // Arrange From 7c18a0d13fd65d3e63ca0a7e80308d63b2630c9d Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 12 Jul 2024 00:21:15 +0100 Subject: [PATCH 20/41] More compression refactoring --- Directory.Packages.props | 4 +- .../IServiceCollectionExtensions.cs | 5 +- .../JustSayingRegistry.cs | 5 +- .../Compression/MessageCompressionUtility.cs | 41 ++++++--- .../Dispatch/MessageDispatcher.cs | 85 ++++++++++++++++++- .../AwsTools/MessageHandling/ISqsQueue.cs | 2 +- .../MessageHandling/PublishDestinationType.cs | 7 ++ .../MessageHandling/SnsMessagePublisher.cs | 4 +- .../MessageHandling/SqsMessagePublisher.cs | 4 +- .../Extensions/AmazonSqsClientExtensions.cs | 3 +- .../Fluent/CompressionEncodingValidator.cs | 2 +- .../ServiceResolver/DefaultServiceResolver.cs | 5 +- src/JustSaying/JustSaying.csproj | 2 +- src/JustSaying/JustSayingBus.cs | 2 +- .../Channels/Receive/MessageReceiveBuffer.cs | 1 - .../IMessageCompressionRegistry.cs | 14 --- .../Compression/MessageCompressionRegistry.cs | 2 +- .../MessageHandling/MessageAttributes.cs | 7 ++ .../IMessageSerialisationRegister.cs | 2 +- .../MessageSerializationRegister.cs | 53 +----------- .../SystemTextJsonSerializer.cs | 6 +- .../MessagingBusBuilderTestExtensions.cs | 18 +++- ...essageIsPublishedToAQueueWithAttributes.cs | 72 ++++++++++++++++ ...ssageIsPublishedToAQueueWithCompression.cs | 63 ++++++++++++++ ...essageIsPublishedToATopicWithAttributes.cs | 50 +++++++++++ ...geIsPublishedToATopicWithSystemTextJson.cs | 2 +- ...WhenAMessageIsPublishedWithCompression.cs} | 5 +- .../MessageCompressionUtilityTests.cs | 10 +-- .../WhenDispatchingCompressedMessage.cs | 26 ++++-- 29 files changed, 370 insertions(+), 132 deletions(-) create mode 100644 src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs delete mode 100644 src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs create mode 100644 tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs create mode 100644 tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs create mode 100644 tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs rename tests/JustSaying.IntegrationTests/Fluent/Publishing/{WhenAMessageIsPublishedWithCompressioncs.cs => WhenAMessageIsPublishedWithCompression.cs} (83%) diff --git a/Directory.Packages.props b/Directory.Packages.props index aaf13941d..3e5478ef0 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,7 +3,7 @@ - + @@ -11,7 +11,7 @@ - + diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index f9e6dc5c8..119fccc42 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -139,14 +139,13 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); - services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); + services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); services.TryAddSingleton( (p) => { var config = p.GetRequiredService(); var serializerFactory = p.GetRequiredService(); - var compressionRegistry = p.GetRequiredService(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory, compressionRegistry); + return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); }); services.TryAddSingleton(); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index d13e9afef..ccaadc0d8 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -43,7 +43,7 @@ public JustSayingRegistry() For().Transient(); For().Transient(); - For().Use((p) => new MessageCompressionRegistry(new List { new GzipMessageBodyCompression() })).Singleton(); + For().Use((p) => new MessageCompressionRegistry(new List { new GzipMessageBodyCompression() })).Singleton(); For() .Use( nameof(IMessageSerializationRegister), @@ -51,8 +51,7 @@ public JustSayingRegistry() { var config = p.GetInstance(); var serializerFactory = p.GetInstance(); - var compressionRegistry = p.GetInstance(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory, compressionRegistry); + return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); }) .Singleton(); diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index f14ed577f..441a28a3f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -1,4 +1,5 @@ using System.Text; +using System.Text.Json.Nodes; using JustSaying.Messaging; using JustSaying.Messaging.Compression; @@ -14,10 +15,11 @@ internal static class MessageCompressionUtility /// /// The original message to potentially compress. /// Metadata associated with the message. + /// The type of destination ( or ) for the message. /// Options specifying when and how to compress. /// Registry of available compression algorithms. /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). - public static (string compressedMessage, string contentEncoding) CompressMessageIfNeeded(string message, PublishMetadata metadata, PublishCompressionOptions compressionOptions, IMessageCompressionRegistry compressionRegistry) + public static (string compressedMessage, string contentEncoding) CompressMessageIfNeeded(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) { string contentEncoding = null; string compressedMessage = null; @@ -26,9 +28,32 @@ public static (string compressedMessage, string contentEncoding) CompressMessage var messageSize = CalculateTotalMessageSize(message, metadata); if (messageSize > compressionOptions.MessageLengthThreshold) { - var compression = GetCompressionAlgorithm(compressionEncoding, compressionRegistry); + var compression = compressionRegistry.GetCompression(compressionEncoding); + if (compression is null) + { + throw new InvalidOperationException($"No compression algorithm registered for encoding '{compressionEncoding}'."); + } + + JsonNode jsonNode = null; + if (destinationType == PublishDestinationType.Queue) + { + jsonNode = JsonNode.Parse(message); + if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) + { + message = messageNode!.GetValue(); + } + } compressedMessage = compression.Compress(message); contentEncoding = compressionEncoding; + + if (destinationType == PublishDestinationType.Queue) + { + if (jsonNode is JsonObject jsonObject) + { + jsonObject["Message"] = compressedMessage; + compressedMessage = jsonObject.ToJsonString(); + } + } } } @@ -64,16 +89,4 @@ private static int CalculateTotalMessageSize(string message, PublishMetadata met return messageSize; } - - /// - /// Retrieves the compression algorithm for the specified encoding from the compression registry. - /// - /// The encoding of the desired compression algorithm. - /// The registry containing available compression algorithms. - /// The compression algorithm corresponding to the specified encoding. - private static IMessageBodyCompression GetCompressionAlgorithm(string compressionEncoding, IMessageCompressionRegistry compressionRegistry) - { - var compression = compressionRegistry.GetCompression(compressionEncoding); - return compression; - } } diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 89ff46f2b..0dea312fb 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -1,3 +1,6 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Context; using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; @@ -14,7 +17,9 @@ public class MessageDispatcher : IMessageDispatcher private readonly IMessageSerializationRegister _serializationRegister; private readonly IMessageMonitor _messagingMonitor; private readonly MiddlewareMap _middlewareMap; - private readonly IMessageCompressionRegistry _compressionRegistry; + private readonly MessageCompressionRegistry _compressionRegistry; + // Temporary until we can remove the `IMessageSerializer` interface in favour of a cleaner design + private readonly SystemTextJsonSerializer _jsonSerializer = new(); private static ILogger _logger; @@ -22,7 +27,7 @@ public MessageDispatcher( IMessageSerializationRegister serializationRegister, IMessageMonitor messagingMonitor, MiddlewareMap middlewareMap, - IMessageCompressionRegistry compressionRegistry, + MessageCompressionRegistry compressionRegistry, ILoggerFactory loggerFactory) { _serializationRegister = serializationRegister; @@ -96,8 +101,12 @@ await middleware.RunAsync(handleContext, null, cancellationToken) _logger.LogDebug("Attempting to deserialize message with serialization register {Type}", _serializationRegister.GetType().FullName); - var messageWithAttributes = _serializationRegister.DeserializeMessage(messageContext.Message.Body); - return (true, messageWithAttributes.Message, messageWithAttributes.MessageAttributes); + var body = messageContext.Message.Body; + + var attributes = MessageAttributes(messageContext, ref body); + + var messageWithAttributes = _serializationRegister.DeserializeMessage(body); + return (true, messageWithAttributes.Message, attributes); } catch (MessageFormatNotSupportedException ex) { @@ -124,4 +133,72 @@ await middleware.RunAsync(handleContext, null, cancellationToken) return (false, null, null); } } + + private MessageAttributes MessageAttributes(IQueueMessageContext messageContext, ref string body) + { + bool isRawMessage = IsRawMessage(body); + var attributes = isRawMessage ? GetRawMessageAttributes(messageContext) : _jsonSerializer.GetMessageAttributes(body); + + var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); + if (contentEncoding is not null) + { + var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); + if (decompressor is null) + { + throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + } + + var jsonNode = JsonNode.Parse(body)!; + var messageNode = jsonNode["Message"]!; + string json = messageNode.ToString(); + + var decompressedBody = decompressor.Decompress(json); + + jsonNode["Message"] = JsonValue.Create(decompressedBody); + body = jsonNode.ToJsonString(); + } + + return attributes; + } + + private static bool IsRawMessage(string body) + { + bool isRawMessage = true; + using var jsonDocument = JsonDocument.Parse(body); + if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) + { + var messageType = typeElement.GetString(); + if (messageType is "Notification") + { + isRawMessage = false; + } + } + + return isRawMessage; + } + + private static MessageAttributes GetRawMessageAttributes(IQueueMessageContext messageContext) + { + Dictionary rawAttributes = new (); + if (messageContext.Message.MessageAttributes is null) + { + return new MessageAttributes(); + } + + foreach (var messageMessageAttribute in messageContext.Message.MessageAttributes) + { + var dataType = messageMessageAttribute.Value.DataType; + var dataValue = messageMessageAttribute.Value.StringValue; + var isString = dataType == "String"; + var messageAttributeValue = new MessageAttributeValue + { + DataType = dataType, + StringValue = isString ? dataValue : null, + BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null + }; + rawAttributes.Add(messageMessageAttribute.Key, messageAttributeValue); + } + + return new MessageAttributes(rawAttributes); + } } diff --git a/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs b/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs index 97bf4dc6d..01b033001 100644 --- a/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs +++ b/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs @@ -76,4 +76,4 @@ Task ChangeMessageVisibilityAsync( int visibilityTimeoutInSeconds, CancellationToken cancellationToken); -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs b/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs new file mode 100644 index 000000000..40502f8c3 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs @@ -0,0 +1,7 @@ +namespace JustSaying.AwsTools.MessageHandling; + +internal enum PublishDestinationType +{ + Topic = 1, + Queue = 2 +} diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 1eacf8504..c546095ca 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -23,7 +23,7 @@ public class SnsMessagePublisher( private readonly Func _handleException = handleException; public Action MessageResponseLogger { get; set; } public PublishCompressionOptions CompressionOptions { get; set; } - public IMessageCompressionRegistry CompressionRegistry { get; set; } + internal MessageCompressionRegistry CompressionRegistry { get; set; } public string Arn { get; internal set; } protected IAmazonSimpleNotificationService Client { get; } = client; private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); @@ -97,7 +97,7 @@ private PublishRequest BuildPublishRequest(Message message, PublishMetadata meta { var messageToSend = _serializationRegister.Serialize(message, serializeForSnsPublishing: true); - (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageToSend, metadata, CompressionOptions, CompressionRegistry); + (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageToSend, metadata, PublishDestinationType.Topic, CompressionOptions, CompressionRegistry); if (compressedMessage is not null) { messageToSend = compressedMessage; diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index 895411ac6..03dc06a03 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -17,9 +17,9 @@ public class SqsMessagePublisher( ILoggerFactory loggerFactory) : IMessagePublisher { private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); + internal MessageCompressionRegistry CompressionRegistry { get; set; } public Action MessageResponseLogger { get; set; } public PublishCompressionOptions CompressionOptions { get; set; } - public IMessageCompressionRegistry CompressionRegistry { get; set; } public Uri QueueUrl { get; internal set; } @@ -86,7 +86,7 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad { var messageBody = GetMessageInContext(message); - (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageBody, metadata, CompressionOptions, CompressionRegistry); + (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageBody, metadata, PublishDestinationType.Queue, CompressionOptions, CompressionRegistry); if (compressedMessage is not null) { messageBody = compressedMessage; diff --git a/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs b/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs index c9a086227..8aed32648 100644 --- a/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs +++ b/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs @@ -25,7 +25,8 @@ public static async Task> ReceiveMessagesAsync(this IAmazonSQS cl { AttributeNames = [.. attributesToLoad], WaitTimeSeconds = secondsWaitTime, - MaxNumberOfMessages = maxNumOfMessages + MaxNumberOfMessages = maxNumOfMessages, + MessageAttributeNames = ["All"] }, cancellationToken).ConfigureAwait(false); diff --git a/src/JustSaying/Fluent/CompressionEncodingValidator.cs b/src/JustSaying/Fluent/CompressionEncodingValidator.cs index 70ddd4a89..357852418 100644 --- a/src/JustSaying/Fluent/CompressionEncodingValidator.cs +++ b/src/JustSaying/Fluent/CompressionEncodingValidator.cs @@ -5,7 +5,7 @@ namespace JustSaying.Fluent; internal static class CompressionEncodingValidator { - public static void ValidateEncoding(IMessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions) + public static void ValidateEncoding(MessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions) { if (compressionOptions?.CompressionEncoding is { } compressionEncoding) { diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index 4dd522d53..42ac8f5f0 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -47,7 +47,7 @@ private object TryResolveService(Type desiredType) { return new NewtonsoftSerializationFactory(); } - else if (desiredType == typeof(IMessageCompressionRegistry)) + else if (desiredType == typeof(MessageCompressionRegistry)) { return new MessageCompressionRegistry([new GzipMessageBodyCompression()]); } @@ -55,8 +55,7 @@ private object TryResolveService(Type desiredType) { return new MessageSerializationRegister( ResolveService(), - ResolveService(), - ResolveService()); + ResolveService()); } else if (desiredType == typeof(IMessageSubjectProvider)) { diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index a9989526b..163078b42 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -2,7 +2,7 @@ true netstandard2.0;net461;net8.0 - $(NoWarn);RS0016 + $(NoWarn);RS0016;RS0017;RS0026 diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 07cb336cf..7406add0d 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -38,7 +38,7 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl public IMessageSerializationRegister SerializationRegister { get; } internal MiddlewareMap MiddlewareMap { get; } - internal IMessageCompressionRegistry CompressionRegistry { get; } + internal MessageCompressionRegistry CompressionRegistry { get; } public Task Completion { get; private set; } diff --git a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs index 36a325955..8aa9b057c 100644 --- a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs +++ b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs @@ -58,7 +58,6 @@ public MessageReceiveBuffer( _channel = Channel.CreateBounded(bufferSize); _requestMessageAttributeNames.Add(MessageSystemAttributeName.ApproximateReceiveCount); - _requestMessageAttributeNames.Add(MessageAttributeKeys.ContentEncoding); } /// diff --git a/src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs deleted file mode 100644 index 7c224ac40..000000000 --- a/src/JustSaying/Messaging/Compression/IMessageCompressionRegistry.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace JustSaying.Messaging.Compression; - -/// -/// Defines the contract for a registry of message compression methods. -/// -public interface IMessageCompressionRegistry -{ - /// - /// Retrieves the appropriate compression method based on the content encoding. - /// - /// The content encoding identifier. - /// An instance for the specified encoding, or null if not found. - IMessageBodyCompression GetCompression(string contentEncoding); -} diff --git a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs index 1a275dcb7..f0adad317 100644 --- a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs +++ b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs @@ -3,7 +3,7 @@ namespace JustSaying.Messaging.Compression; /// /// Implements a registry for message compression methods. /// -public sealed class MessageCompressionRegistry : IMessageCompressionRegistry +public sealed class MessageCompressionRegistry { private readonly IList _compressions; diff --git a/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs b/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs index aea001e35..784470d51 100644 --- a/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs +++ b/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs @@ -16,4 +16,11 @@ public MessageAttributes() public MessageAttributeValue Get(string value) => _attributes.TryGetValue(value, out MessageAttributeValue result) ? result : null; + + /// + /// Gets all available attribute keys. + /// + /// An IReadOnlyCollection of strings representing all attribute keys. + public IReadOnlyCollection GetKeys() + => _attributes.Keys; } diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs index f20f2dd7e..c772369c0 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs @@ -30,4 +30,4 @@ public interface IMessageSerializationRegister /// /// The type to register a serializer for. void AddSerializer() where T : Message; -} \ No newline at end of file +} diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs index 51595272d..243b11039 100644 --- a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs +++ b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs @@ -1,8 +1,4 @@ using System.Collections.Concurrent; -using System.Text; -using System.Text.Json; -using JustSaying.AwsTools; -using JustSaying.Messaging.Compression; using JustSaying.Models; namespace JustSaying.Messaging.MessageSerialization; @@ -11,21 +7,13 @@ public class MessageSerializationRegister : IMessageSerializationRegister { private readonly IMessageSubjectProvider _messageSubjectProvider; private readonly IMessageSerializationFactory _serializationFactory; - private readonly IMessageCompressionRegistry _compressionRegistry; private readonly ConcurrentDictionary> _typeSerializersBySubject = new(StringComparer.OrdinalIgnoreCase); private readonly HashSet _messageSerializers = new(); - public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, - IMessageSerializationFactory serializationFactory) : this(messageSubjectProvider, serializationFactory, null) - { - } - - public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, - IMessageSerializationFactory serializationFactory, IMessageCompressionRegistry compressionRegistry) + public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, IMessageSerializationFactory serializationFactory) { _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); _serializationFactory = serializationFactory; - _compressionRegistry = compressionRegistry; } public void AddSerializer() where T : Message @@ -60,45 +48,6 @@ public MessageWithAttributes DeserializeMessage(string body) TypeSerializer typeSerializer = lazyTypeSerializer.Value; var attributes = typeSerializer.Serializer.GetMessageAttributes(body); - // TODO This is bad and needs designing around... - var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); - if (contentEncoding is not null) - { - var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); - if (decompressor is null) - { - throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); - } - - using var document = JsonDocument.Parse(body); - JsonElement element = document.RootElement.GetProperty("Message"); - string json = element.ToString(); - - var decompressedBody = decompressor.Decompress(json); - - using var memoryStream = new MemoryStream(); - using (var jsonWriter = new Utf8JsonWriter(memoryStream)) - { - jsonWriter.WriteStartObject(); - foreach (var property in document.RootElement.EnumerateObject()) - { - if (property.Name == "Message") - { - jsonWriter.WritePropertyName("Message"); - jsonWriter.WriteStringValue(decompressedBody); - } - else - { - property.WriteTo(jsonWriter); - } - } - jsonWriter.WriteEndObject(); - } - - // Update body with the new document string - body = Encoding.UTF8.GetString(memoryStream.ToArray()); - - } var message = typeSerializer.Serializer.Deserialize(body, typeSerializer.Type); return new MessageWithAttributes(message, attributes); diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs index 1443c4f80..302e54ffd 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs @@ -12,11 +12,7 @@ public class SystemTextJsonSerializer : IMessageSerializer { private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() { -#if NET8_0_OR_GREATER DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, -#else - IgnoreNullValues = true, -#endif Converters = { new JsonStringEnumConverter(), @@ -58,7 +54,7 @@ public string GetMessageSubject(string sqsMessage) public MessageAttributes GetMessageAttributes(string message) { - var jsonDocument = JsonDocument.Parse(message); + using var jsonDocument = JsonDocument.Parse(message); if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) { diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs index 7a114a291..fb33f9695 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs @@ -31,8 +31,24 @@ public static MessagingBusBuilder WithLoopbackTopic(this MessagingBusBuilder })); } + public static MessagingBusBuilder WithLoopbackQueueAndPublicationOptions(this MessagingBusBuilder builder, string name, + Action> configure) + where T : Message + { + return builder + .Publications((options) => options.WithQueue(o => + { + o.WithName(name); + configure.Invoke(o); + })) + .Subscriptions((options) => options.ForQueue(subscriptionBuilder => + { + subscriptionBuilder.WithQueueName(name); + })); + } + public static MessagingBusBuilder WithLoopbackTopicAndPublicationOptions(this MessagingBusBuilder builder, string name, - Action> configure = null) + Action> configure) where T : Message { return builder diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs new file mode 100644 index 000000000..43c954a26 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs @@ -0,0 +1,72 @@ +using JustSaying.AwsTools.QueueCreation; +using JustSaying.Fluent.Subscribing.Newtonsoft; +using JustSaying.Messaging; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToAQueueWithAttribute(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + public class SimpleMessageWithStringAttributesHandler(IMessageContextAccessor contextAccessor) : IHandlerAsync + { + private readonly IMessageContextAccessor _contextAccessor = contextAccessor; + + public Task Handle(SimpleMessage message) + { + HandledMessages.Add((_contextAccessor.MessageContext, message)); + return Task.FromResult(true); + } + + public List<(MessageContext context, SimpleMessage message)> HandledMessages { get; } = new List<(MessageContext, SimpleMessage)>(); + } + + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new SimpleMessageWithStringAttributesHandler(new MessageContextAccessor()); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName, + c => + { + c.WithWriteConfiguration((SqsWriteConfiguration writeConfiguration) => + { + writeConfiguration.QueueName = UniqueName; + }); + })) + .AddSingleton() + .AddSingleton>(handler); + + var message = new SimpleMessage + { + // Content longer than 100 bytes + Content = Guid.NewGuid().ToString() + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); + + // Act + await publisher.PublishAsync(message, publishMetadata, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.HandledMessages.ShouldHaveSingleItem().message.Content.ShouldBe(message.Content); + handler.HandledMessages.ShouldHaveSingleItem().context.MessageAttributes.GetKeys().ShouldContain("Hello"); + }); + }); + } + +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs new file mode 100644 index 000000000..5c85935e8 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs @@ -0,0 +1,63 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToAQueueWithCompression(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName, + c => + { + c.WithWriteConfiguration((SqsWriteConfiguration writeConfiguration) => + { + writeConfiguration.CompressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 100 + }; + writeConfiguration.QueueName = UniqueName; + }); + })) + .AddSingleton() + .AddSingleton>(handler); + + var message = new SimpleMessage + { + // Content longer than 100 bytes + Content = new string('a', 500) + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); + + // Act + await publisher.PublishAsync(message, publishMetadata, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(message.Content); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs new file mode 100644 index 000000000..ebb81b64a --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs @@ -0,0 +1,50 @@ +using JustSaying.Messaging; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToATopicWithAttributes(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + + var services = GivenJustSaying() + .ConfigureJustSaying( + (builder) => builder.WithLoopbackTopic(UniqueName)) + .AddSingleton() + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage() + { + Content = content + }; + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, publishMetadata, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs index 6e4e2aeb0..590ae6eb5 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs @@ -44,4 +44,4 @@ await Patiently.AssertThatAsync(OutputHelper, }); }); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs similarity index 83% rename from tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs rename to tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs index 1c99f17ce..89eac719e 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompressioncs.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs @@ -34,10 +34,7 @@ public async Task Then_The_Message_Is_Handled() var message = new SimpleMessage { // Content longer than 100 bytes - Content = - """ - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. - """ + Content = new string('a', 500) }; await WhenAsync( diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs index fd58c0cb0..11a013091 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs @@ -4,7 +4,7 @@ public class MessageCompressionUtilityTests { - private readonly IMessageCompressionRegistry _compressionRegistry; + private readonly MessageCompressionRegistry _compressionRegistry; public MessageCompressionUtilityTests() { @@ -20,7 +20,7 @@ public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() var compressionOptions = new PublishCompressionOptions(); // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.Null(result.compressedMessage); @@ -40,7 +40,7 @@ public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMe }; // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.Null(result.compressedMessage); @@ -60,7 +60,7 @@ public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMes }; // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.NotNull(result.compressedMessage); @@ -88,7 +88,7 @@ public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() }; // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.NotNull(result.compressedMessage); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 7104506f3..6065b156c 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -1,5 +1,7 @@ using System.IO.Compression; using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; @@ -14,21 +16,26 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; public class WhenDispatchingCompressedMessage { - [Fact(Skip = "for now")] + [Fact] public async Task ShouldDecompressMessage() { // Arrange var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; var decompressorRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - var messageSerializer = new MessageSerializationRegister( + var messageSerializerRegistry = new MessageSerializationRegister( new NonGenericMessageSubjectProvider(), - new SystemTextJsonSerializationFactory(), - decompressorRegistry); + new SystemTextJsonSerializationFactory()); + messageSerializerRegistry.AddSerializer(); - messageSerializer.AddSerializer(); - - var payload = messageSerializer.Serialize(originalMessage, true); + string payload = JsonSerializer.Serialize(originalMessage, originalMessage.GetType(), new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonStringEnumConverter(), + }, + }); var memoryStream = new MemoryStream(); await using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) @@ -37,10 +44,11 @@ public async Task ShouldDecompressMessage() } var compressedPayload = Convert.ToBase64String(memoryStream.ToArray()); + var fullMessagePayload = JsonSerializer.Serialize(new { Subject = nameof(SimpleMessage), Message = compressedPayload }); var sqsMessage = new Message { - Body = compressedPayload, + Body = fullMessagePayload, MessageAttributes = { ["Content-Encoding"] = new MessageAttributeValue { DataType = "String", StringValue = ContentEncodings.GzipBase64 } @@ -53,7 +61,7 @@ public async Task ShouldDecompressMessage() var middlewareMap = new MiddlewareMap(); var inspectableMiddleware = new InspectableMiddleware(); middlewareMap.Add("fake-queue-name", inspectableMiddleware); - var messageDispatcher = new MessageDispatcher(messageSerializer, new NullOpMessageMonitor(), middlewareMap, decompressorRegistry, new LoggerFactory()); + var messageDispatcher = new MessageDispatcher(messageSerializerRegistry, new NullOpMessageMonitor(), middlewareMap, decompressorRegistry, new LoggerFactory()); // Act await messageDispatcher.DispatchMessageAsync(messageContext, CancellationToken.None); From df43e02a4d702683c26b381d987073670bdeeb62 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 12 Jul 2024 15:45:16 +0100 Subject: [PATCH 21/41] Tidy up --- .../Dispatch/MessageDispatcher.cs | 29 ++++++++++++++----- .../MessagingBusBuilderTestExtensions.cs | 4 +-- ...essageIsPublishedToAQueueWithAttributes.cs | 18 ++++-------- ...ssageIsPublishedToAQueueWithCompression.cs | 3 +- .../BaseSubscriptionGroupTests.cs | 2 +- .../WhenListeningStartsAndStops.cs | 6 ++-- .../WhenMessageHandlingSucceeds.cs | 9 +++++- 7 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 0dea312fb..0bff87d50 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -1,3 +1,4 @@ +using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using JustSaying.Messaging; @@ -163,18 +164,30 @@ private MessageAttributes MessageAttributes(IQueueMessageContext messageContext, private static bool IsRawMessage(string body) { - bool isRawMessage = true; - using var jsonDocument = JsonDocument.Parse(body); - if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) + if (body is null) { - var messageType = typeElement.GetString(); - if (messageType is "Notification") + return true; + } + + try + { + bool isRawMessage = true; + using var jsonDocument = JsonDocument.Parse(body); + if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) { - isRawMessage = false; + var messageType = typeElement.GetString(); + if (messageType is "Notification") + { + isRawMessage = false; + } } - } - return isRawMessage; + return isRawMessage; + } + catch + { + return true; + } } private static MessageAttributes GetRawMessageAttributes(IQueueMessageContext messageContext) diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs index fb33f9695..3d047f641 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs @@ -32,14 +32,14 @@ public static MessagingBusBuilder WithLoopbackTopic(this MessagingBusBuilder } public static MessagingBusBuilder WithLoopbackQueueAndPublicationOptions(this MessagingBusBuilder builder, string name, - Action> configure) + Action> configure = null) where T : Message { return builder .Publications((options) => options.WithQueue(o => { + configure?.Invoke(o); o.WithName(name); - configure.Invoke(o); })) .Subscriptions((options) => options.ForQueue(subscriptionBuilder => { diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs index 43c954a26..44fe7b7c2 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs @@ -30,14 +30,7 @@ public async Task Then_The_Message_Is_Handled() var handler = new SimpleMessageWithStringAttributesHandler(new MessageContextAccessor()); var services = GivenJustSaying() - .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName, - c => - { - c.WithWriteConfiguration((SqsWriteConfiguration writeConfiguration) => - { - writeConfiguration.QueueName = UniqueName; - }); - })) + .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName)) .AddSingleton() .AddSingleton>(handler); @@ -46,6 +39,8 @@ public async Task Then_The_Message_Is_Handled() // Content longer than 100 bytes Content = Guid.NewGuid().ToString() }; + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); await WhenAsync( services, @@ -53,8 +48,6 @@ await WhenAsync( { await listener.StartAsync(cancellationToken); await publisher.StartAsync(cancellationToken); - var publishMetadata = new PublishMetadata(); - publishMetadata.AddMessageAttribute("Hello", "World"); // Act await publisher.PublishAsync(message, publishMetadata, cancellationToken); @@ -63,8 +56,9 @@ await WhenAsync( await Patiently.AssertThatAsync(OutputHelper, () => { - handler.HandledMessages.ShouldHaveSingleItem().message.Content.ShouldBe(message.Content); - handler.HandledMessages.ShouldHaveSingleItem().context.MessageAttributes.GetKeys().ShouldContain("Hello"); + var (actualMessageContext, actualMessage) = handler.HandledMessages.ShouldHaveSingleItem(); + actualMessage.Content.ShouldBe(message.Content); + actualMessageContext.MessageAttributes.GetKeys().ShouldContain("Hello"); }); }); } diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs index 5c85935e8..6c7a88873 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs @@ -21,14 +21,13 @@ public async Task Then_The_Message_Is_Handled() .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName, c => { - c.WithWriteConfiguration((SqsWriteConfiguration writeConfiguration) => + c.WithWriteConfiguration(writeConfiguration => { writeConfiguration.CompressionOptions = new PublishCompressionOptions { CompressionEncoding = ContentEncodings.GzipBase64, MessageLengthThreshold = 100 }; - writeConfiguration.QueueName = UniqueName; }); })) .AddSingleton() diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 6aee49b92..2a9d1487c 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -87,7 +87,7 @@ protected virtual async Task WhenAsync() await Patiently.AssertThatAsync(OutputHelper, () => Until() || cts.IsCancellationRequested); - cts.Cancel(); + await cts.CancelAsync(); await completion.HandleCancellation(); } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs index f28137d11..a6bae46c6 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs @@ -6,8 +6,8 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenListeningStartsAndStops(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private const string AttributeMessageContentsRunning = @"Message Contents Running"; - private const string AttributeMessageContentsAfterStop = @"Message Contents After Stop"; + private const string AttributeMessageContentsRunning = """{ "Subject": "SimpleMessage", "Message": "Message Contents Running" }"""; + private const string AttributeMessageContentsAfterStop = """{ "Subject": "SimpleMessage", "Message": "Message Contents After Stop" }"""; private int _expectedMaxMessageCount; private bool _running; @@ -63,4 +63,4 @@ public void MessageIsProcessed() SerializationRegister.ReceivedDeserializationRequests.ShouldContain(AttributeMessageContentsRunning); SerializationRegister.ReceivedDeserializationRequests.ShouldNotContain(AttributeMessageContentsAfterStop); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs index b7b466c35..42de3f984 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs @@ -1,10 +1,17 @@ +using System.Diagnostics.CodeAnalysis; using Amazon.SQS.Model; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenMessageHandlingSucceeds(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private const string MessageBody = "Expected Message Body"; + [StringSyntax(StringSyntaxAttribute.Json)] + private const string MessageBody = """ + { + "Subject": "TestMessage", + "Message": "Expected Message Body" + } + """; private FakeSqsQueue _queue; protected override void Given() From 8c23f2f4190626f4b097ba8bd53e040264fb81c0 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 12 Jul 2024 15:54:15 +0100 Subject: [PATCH 22/41] Fix CI --- .../TestEnvironment.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/JustSaying.TestingFramework/TestEnvironment.cs b/tests/JustSaying.TestingFramework/TestEnvironment.cs index 41de48542..4586ebb0b 100644 --- a/tests/JustSaying.TestingFramework/TestEnvironment.cs +++ b/tests/JustSaying.TestingFramework/TestEnvironment.cs @@ -46,14 +46,14 @@ public static Uri SimulatorUrl get { // TODO Undo this change - return new Uri("http://localhost:4566", UriKind.Absolute); - // var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); - // if (string.IsNullOrWhiteSpace(awsEnv)) - // { - // return null; - // } - // - // return new Uri(awsEnv, UriKind.Absolute); + //return new Uri("http://localhost:4566", UriKind.Absolute); + var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); + if (string.IsNullOrWhiteSpace(awsEnv)) + { + return null; + } + + return new Uri(awsEnv, UriKind.Absolute); } } From b0ea0ef4b24dd6f09b5580742fd754427ab48a7f Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 23 Aug 2024 00:24:58 +0100 Subject: [PATCH 23/41] Compression WIP --- Directory.Build.props | 6 +- Directory.Packages.props | 8 +- JustSaying.sln | 7 + .../IServiceCollectionExtensions.cs | 7 - .../JustSayingRegistry.cs | 12 - .../Compression/MessageCompressionUtility.cs | 78 ------ .../Dispatch/IMessageDispatcher.cs | 4 +- .../Dispatch/MessageDispatcher.cs | 119 +------- .../MessageHandling/IMessageConverter.cs | 11 + .../MessageHandling/MessageConverter.cs | 265 ++++++++++++++++++ .../MessageHandling/PublishDestinationType.cs | 2 +- .../MessageHandling/SnsMessagePublisher.cs | 36 +-- .../MessageHandling/SqsMessagePublisher.cs | 33 +-- .../MessageHandling/SqsQueueReader.cs | 9 +- .../QueueCreation/SqsReadConfiguration.cs | 5 +- .../Extensions/AmazonSqsClientExtensions.cs | 2 +- .../StaticPublicationConfiguration.cs | 8 +- .../Fluent/QueueAddressConfiguration.cs | 4 - .../QueueAddressPublicationBuilder`1.cs | 7 +- .../QueueAddressSubscriptionBuilder`1.cs | 18 +- .../Fluent/QueuePublicationBuilder`1.cs | 7 +- .../Fluent/QueueSubscriptionBuilder`1.cs | 5 +- .../ServiceResolver/DefaultServiceResolver.cs | 6 - .../ServiceBuilderServiceResolver.cs | 7 +- src/JustSaying/Fluent/ServicesBuilder.cs | 7 +- .../TopicAddressPublicationBuilder`1.cs | 9 +- .../Fluent/TopicAddressPublisher.cs | 5 +- .../Fluent/TopicPublicationBuilder`1.cs | 2 - .../Fluent/TopicSubscriptionBuilder`1.cs | 11 +- src/JustSaying/JustSaying.csproj | 2 + src/JustSaying/JustSayingBus.cs | 15 +- .../Channels/Context/IQueueMessageContext.cs | 5 +- .../Channels/Context/QueueMessageContext.cs | 9 +- .../Channels/Receive/MessageReceiveBuffer.cs | 7 +- .../SubscriptionGroupConfigBuilder.cs | 12 +- .../SubscriptionGroupFactory.cs | 6 +- .../SubscriptionGroupSettings.cs | 12 +- .../GenericMessageSubjectProvider.cs | 2 +- .../IMessageSerialisationRegister.cs | 56 ++-- .../IMessageSerialiser.cs | 25 +- .../IMessageSerializationFactory.cs | 2 +- .../MessageSerializationRegister.cs | 147 +++++----- .../MessageWithAttributes.cs | 20 -- .../NewtonsoftSerializer.cs | 24 ++ .../MessageSerialization/ReceivedMessage.cs | 47 ++++ .../SystemTextJsonSerializer.cs | 29 ++ .../MessageSerialization/TypeSerializer.cs | 1 + src/JustSaying/MessagingBusBuilder.cs | 3 +- .../Naming/DefaultNamingConventions.cs | 2 +- .../Fluent/ActionRunnerTest.cs | 76 ++--- .../Fluent/IntegrationTestBase.cs | 37 ++- .../Fluent/MessagingBusBuilderTests.cs | 24 +- ...WhenAMessageIsPublishedToATenantedTopic.cs | 5 + .../Subscribing/WhenReceivingIsThrottled.cs | 16 +- .../Subscribing/WhenUsingResourceAddresses.cs | 7 +- .../JustSaying.IntegrationTests.csproj | 7 +- .../JustSaying.IntegrationTests.sln | 25 ++ .../TestSettings.cs | 2 +- .../docker-compose.yml | 5 +- .../xunit.runner.json | 4 +- .../InspectableHandler.cs | 9 +- .../InspectableHandlerExtensions.cs | 32 +++ .../LocalAwsClientFactory.cs | 56 ++-- .../TestEnvironment.cs | 16 +- .../MessageCompressionUtilityTests.cs | 10 +- .../WhenDispatchingCompressedMessage.cs | 11 +- .../WhenDispatchingMessage.cs | 22 +- .../Sns/TopicByName/WhenPublishing.cs | 6 +- .../Sns/TopicByName/WhenPublishingAsync.cs | 7 +- ...henPublishingAsyncExceptionCanBeHandled.cs | 5 +- ...WhenPublishingAsyncExceptionCanBeThrown.cs | 5 +- ...enPublishingAsyncResponseLoggerIsCalled.cs | 5 +- ...gAsyncWithGenericMessageSubjectProvider.cs | 6 +- .../MessageHandling/Sqs/WhenPublishing.cs | 10 +- .../Sqs/WhenPublishingAsync.cs | 10 +- ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 10 +- .../Sqs/WhenPublishingDelayedMessage.cs | 5 +- .../Sqs/WhenPublishingDelayedMessageAsync.cs | 5 +- .../WhenPublishEndpointIsNotProvided.cs | 2 +- .../Fluent/WhenUsingDefaultServiceResolver.cs | 8 +- .../JustSaying.UnitTests.csproj | 4 +- .../JustSayingBus/GivenAServiceBus.cs | 2 - .../GivenAServiceBusWithoutMonitoring.cs | 2 +- .../WhenRegisteringSubscribers.cs | 18 +- .../Messaging/Channels/ChannelsTests.cs | 16 +- .../Fakes/FakeSerializationRegister.cs | 62 ++-- .../SubscriptionGroupCollectionTests.cs | 33 ++- .../BaseSubscriptionGroupTests.cs | 9 +- .../WhenExactlyOnceIsAppliedToHandler.cs | 10 +- ...sAppliedToHandlerWithoutExplicitTimeout.cs | 10 +- .../WhenListeningStartsAndStops.cs | 4 +- .../WhenMessageHandlingSucceeds.cs | 10 +- ...enThereAreExceptionsInMessageProcessing.cs | 6 +- .../WhenThereAreExceptionsInSqsCalling.cs | 5 +- .../WhenUsingSqsQueueByName.cs | 21 +- .../SerializationRegister/CustomMessage.cs | 7 - .../WhenAddingASerializerTwice.cs | 29 -- .../WhenDeserializingMessage.cs | 28 -- tests/JustSaying.UnitTests/XBehaviourTest.cs | 2 +- 99 files changed, 1057 insertions(+), 795 deletions(-) create mode 100644 src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs delete mode 100644 src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs create mode 100644 src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs create mode 100644 tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln create mode 100644 tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs delete mode 100644 tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs delete mode 100644 tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs delete mode 100644 tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs diff --git a/Directory.Build.props b/Directory.Build.props index 1bfa55399..f3cd972b4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -43,7 +43,7 @@ latest enable $(PackageProjectUrl).git - true + true snupkg true true @@ -60,6 +60,10 @@ cobertura,json [*.Benchmarks]*,[*Sample*]*,[*Test*]*,[xunit.*]* + + + 0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7 + diff --git a/Directory.Packages.props b/Directory.Packages.props index 3e5478ef0..9b198fc9b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,8 +1,8 @@ - - - + + + @@ -32,7 +32,7 @@ - + diff --git a/JustSaying.sln b/JustSaying.sln index 2c647d2fc..0fa5015b2 100644 --- a/JustSaying.sln +++ b/JustSaying.sln @@ -81,6 +81,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JustSaying.Extensions.Aws", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JustSaying.Extensions.Aws.Tests", "tests\JustSaying.Extensions.Aws.Tests\JustSaying.Extensions.Aws.Tests.csproj", "{1B99B357-5D76-4540-B28E-B6CD3F6F1963}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalAwsMessaging", "..\..\..\RiderProjects\ConsoleApp9\src\LocalAwsMessaging\LocalAwsMessaging.csproj", "{52311A75-232B-4466-B429-71C256710566}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -151,6 +153,10 @@ Global {1B99B357-5D76-4540-B28E-B6CD3F6F1963}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B99B357-5D76-4540-B28E-B6CD3F6F1963}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B99B357-5D76-4540-B28E-B6CD3F6F1963}.Release|Any CPU.Build.0 = Release|Any CPU + {52311A75-232B-4466-B429-71C256710566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52311A75-232B-4466-B429-71C256710566}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52311A75-232B-4466-B429-71C256710566}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52311A75-232B-4466-B429-71C256710566}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -176,6 +182,7 @@ Global {38DAC394-0A6E-4BB6-BCFC-8C21D2C64B3A} = {77C93C37-DE5B-448F-9A23-6C9D0C8465CA} {4EFC48D7-4B45-4EBC-9237-4B84FE8239E0} = {A94633F2-29F2-48C6-840A-C5370B300AE2} {1B99B357-5D76-4540-B28E-B6CD3F6F1963} = {E22A50F2-9952-4483-8AD1-09BE354FB3E4} + {52311A75-232B-4466-B429-71C256710566} = {A94633F2-29F2-48C6-840A-C5370B300AE2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {18FBDF85-C124-4444-9F03-D0D4F2B3A612} diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index 119fccc42..6c8a6ecee 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -140,13 +140,6 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); - services.TryAddSingleton( - (p) => - { - var config = p.GetRequiredService(); - var serializerFactory = p.GetRequiredService(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); - }); services.TryAddSingleton(); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index ccaadc0d8..a418ec9c3 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -42,19 +42,7 @@ public JustSayingRegistry() For().Transient(); For().Transient(); - For().Use((p) => new MessageCompressionRegistry(new List { new GzipMessageBodyCompression() })).Singleton(); - For() - .Use( - nameof(IMessageSerializationRegister), - (p) => - { - var config = p.GetInstance(); - var serializerFactory = p.GetInstance(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); - }) - .Singleton(); - For().Use().Singleton(); For().Singleton(); diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs index 441a28a3f..a7dd6dd38 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs @@ -10,83 +10,5 @@ namespace JustSaying.AwsTools.MessageHandling; /// internal static class MessageCompressionUtility { - /// - /// Compresses a message if it meets the specified compression criteria. - /// - /// The original message to potentially compress. - /// Metadata associated with the message. - /// The type of destination ( or ) for the message. - /// Options specifying when and how to compress. - /// Registry of available compression algorithms. - /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). - public static (string compressedMessage, string contentEncoding) CompressMessageIfNeeded(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) - { - string contentEncoding = null; - string compressedMessage = null; - if (compressionOptions?.CompressionEncoding is { } compressionEncoding && compressionRegistry is not null) - { - var messageSize = CalculateTotalMessageSize(message, metadata); - if (messageSize > compressionOptions.MessageLengthThreshold) - { - var compression = compressionRegistry.GetCompression(compressionEncoding); - if (compression is null) - { - throw new InvalidOperationException($"No compression algorithm registered for encoding '{compressionEncoding}'."); - } - JsonNode jsonNode = null; - if (destinationType == PublishDestinationType.Queue) - { - jsonNode = JsonNode.Parse(message); - if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) - { - message = messageNode!.GetValue(); - } - } - compressedMessage = compression.Compress(message); - contentEncoding = compressionEncoding; - - if (destinationType == PublishDestinationType.Queue) - { - if (jsonNode is JsonObject jsonObject) - { - jsonObject["Message"] = compressedMessage; - compressedMessage = jsonObject.ToJsonString(); - } - } - } - } - - return (compressedMessage, contentEncoding); - } - - /// - /// Calculates the total size of a message, including its metadata. - /// - /// The message content. - /// Metadata associated with the message. - /// The total size of the message in bytes. - private static int CalculateTotalMessageSize(string message, PublishMetadata metadata) - { - var messageSize = Encoding.UTF8.GetByteCount(message); - if (metadata?.MessageAttributes != null) - { - foreach (var attribute in metadata.MessageAttributes) - { - messageSize += Encoding.UTF8.GetByteCount(attribute.Key); - messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); - if (attribute.Value.StringValue is not null) - { - messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); - } - - if (attribute.Value.BinaryValue is not null) - { - messageSize += attribute.Value.BinaryValue.Count; - } - } - } - - return messageSize; - } } diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs index bb48f7f1b..f4353e422 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs @@ -5,7 +5,7 @@ namespace JustSaying.AwsTools.MessageHandling.Dispatch; /// /// Dispatches messages to the queue. /// -public interface IMessageDispatcher +internal interface IMessageDispatcher { /// /// Dispatches the message in to the queue in the context. @@ -14,4 +14,4 @@ public interface IMessageDispatcher /// A to stop processing the message dispatch. /// A that completes once the message has been dispatched. Task DispatchMessageAsync(IQueueMessageContext messageContext, CancellationToken cancellationToken); -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 0bff87d50..b46126cb0 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -1,9 +1,4 @@ -using System.Text; -using System.Text.Json; -using System.Text.Json.Nodes; -using JustSaying.Messaging; using JustSaying.Messaging.Channels.Context; -using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; @@ -13,44 +8,23 @@ namespace JustSaying.AwsTools.MessageHandling.Dispatch; -public class MessageDispatcher : IMessageDispatcher +internal class MessageDispatcher : IMessageDispatcher { - private readonly IMessageSerializationRegister _serializationRegister; private readonly IMessageMonitor _messagingMonitor; private readonly MiddlewareMap _middlewareMap; - private readonly MessageCompressionRegistry _compressionRegistry; - // Temporary until we can remove the `IMessageSerializer` interface in favour of a cleaner design - private readonly SystemTextJsonSerializer _jsonSerializer = new(); private static ILogger _logger; public MessageDispatcher( - IMessageSerializationRegister serializationRegister, IMessageMonitor messagingMonitor, MiddlewareMap middlewareMap, - MessageCompressionRegistry compressionRegistry, ILoggerFactory loggerFactory) { - _serializationRegister = serializationRegister; _messagingMonitor = messagingMonitor; _middlewareMap = middlewareMap; - _compressionRegistry = compressionRegistry; _logger = loggerFactory.CreateLogger("JustSaying"); } - public MessageDispatcher( - IMessageSerializationRegister serializationRegister, - IMessageMonitor messagingMonitor, - MiddlewareMap middlewareMap, - ILoggerFactory loggerFactory) : this( - serializationRegister, - messagingMonitor, - middlewareMap, - null, - loggerFactory) - { - } - public async Task DispatchMessageAsync( IQueueMessageContext messageContext, CancellationToken cancellationToken) @@ -91,7 +65,6 @@ public async Task DispatchMessageAsync( await middleware.RunAsync(handleContext, null, cancellationToken) .ConfigureAwait(false); - } private async Task<(bool success, Message typedMessage, MessageAttributes attributes)> @@ -99,15 +72,11 @@ await middleware.RunAsync(handleContext, null, cancellationToken) { try { - _logger.LogDebug("Attempting to deserialize message with serialization register {Type}", - _serializationRegister.GetType().FullName); - - var body = messageContext.Message.Body; + _logger.LogDebug("Attempting to deserialize message."); - var attributes = MessageAttributes(messageContext, ref body); + var (message, attributes) = messageContext.MessageConverter.ConvertForReceive(messageContext.Message); - var messageWithAttributes = _serializationRegister.DeserializeMessage(body); - return (true, messageWithAttributes.Message, attributes); + return (true, message, attributes); } catch (MessageFormatNotSupportedException ex) { @@ -134,84 +103,4 @@ await middleware.RunAsync(handleContext, null, cancellationToken) return (false, null, null); } } - - private MessageAttributes MessageAttributes(IQueueMessageContext messageContext, ref string body) - { - bool isRawMessage = IsRawMessage(body); - var attributes = isRawMessage ? GetRawMessageAttributes(messageContext) : _jsonSerializer.GetMessageAttributes(body); - - var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); - if (contentEncoding is not null) - { - var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); - if (decompressor is null) - { - throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); - } - - var jsonNode = JsonNode.Parse(body)!; - var messageNode = jsonNode["Message"]!; - string json = messageNode.ToString(); - - var decompressedBody = decompressor.Decompress(json); - - jsonNode["Message"] = JsonValue.Create(decompressedBody); - body = jsonNode.ToJsonString(); - } - - return attributes; - } - - private static bool IsRawMessage(string body) - { - if (body is null) - { - return true; - } - - try - { - bool isRawMessage = true; - using var jsonDocument = JsonDocument.Parse(body); - if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) - { - var messageType = typeElement.GetString(); - if (messageType is "Notification") - { - isRawMessage = false; - } - } - - return isRawMessage; - } - catch - { - return true; - } - } - - private static MessageAttributes GetRawMessageAttributes(IQueueMessageContext messageContext) - { - Dictionary rawAttributes = new (); - if (messageContext.Message.MessageAttributes is null) - { - return new MessageAttributes(); - } - - foreach (var messageMessageAttribute in messageContext.Message.MessageAttributes) - { - var dataType = messageMessageAttribute.Value.DataType; - var dataValue = messageMessageAttribute.Value.StringValue; - var isString = dataType == "String"; - var messageAttributeValue = new MessageAttributeValue - { - DataType = dataType, - StringValue = isString ? dataValue : null, - BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null - }; - rawAttributes.Add(messageMessageAttribute.Key, messageAttributeValue); - } - - return new MessageAttributes(rawAttributes); - } } diff --git a/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs new file mode 100644 index 000000000..e522e13aa --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs @@ -0,0 +1,11 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Models; + +namespace JustSaying.Messaging; + +public interface IMessageConverter +{ + ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message); + MessageForPublishing ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs new file mode 100644 index 000000000..6eb365a49 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs @@ -0,0 +1,265 @@ +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using JustSaying.AwsTools; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Models; + +namespace JustSaying.Messaging; + +internal sealed class MessageConverter : IMessageConverter +{ + private readonly IMessageBodySerializer _bodySerializer; + private readonly MessageCompressionRegistry _compressionRegistry; + + public MessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry) + { + _bodySerializer = bodySerializer; + _compressionRegistry = compressionRegistry; + } + + public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) + { + string body = message.Body; + var attributes = GetMessageAttributes(message, body); + bool isRawMessage = IsRawMessage(body); + if (!isRawMessage) + { + var jsonNode = JsonNode.Parse(body); + if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) + { + body = messageNode!.GetValue(); + } + } + body = ApplyBodyDecompression(body, attributes); + var result = _bodySerializer.Deserialize(body); + return new ReceivedMessage(result, attributes); + } + + public MessageForPublishing ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType) + { + var messageBody = _bodySerializer.Serialize(message); + + Dictionary attributeValues = new(); + AddMessageAttributes(attributeValues, publishMetadata); + + (string compressedMessage, string contentEncoding) = CompressMessageBody(messageBody, publishMetadata, PublishDestinationType.Queue, new PublishCompressionOptions() /* TODO */, _compressionRegistry); + if (compressedMessage is not null) + { + messageBody = compressedMessage; + attributeValues.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + } + + string subject = null; + if (destinationType == PublishDestinationType.Topic) + { + // TODO + subject = null; + } + + return new MessageForPublishing(messageBody, attributeValues, subject); + } + + private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) + { + if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + { + return; + } + + foreach (var attribute in metadata.MessageAttributes) + { + requestMessageAttributes.Add(attribute.Key, attribute.Value); + } + } + + + private static bool IsRawMessage(string body) + { + if (body is null) + { + return true; + } + + try + { + var isRawMessage = true; + using var jsonDocument = JsonDocument.Parse(body); + if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) + { + string messageType = typeElement.GetString(); + if (messageType is "Notification") + { + isRawMessage = false; + } + } + + return isRawMessage; + } + catch + { + return true; + } + } + + private string ApplyBodyDecompression(string body, MessageAttributes attributes) + { + var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); + if (contentEncoding is not null) + { + var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); + if (decompressor is null) + { + throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + } + + body = decompressor.Decompress(body); + } + + return body; + } + + private static MessageAttributes GetMessageAttributes(Amazon.SQS.Model.Message message, string body) + { + bool isRawMessage = IsRawMessage(body); + var attributes = isRawMessage ? GetRawMessageAttributes(message) : GetMessageAttributes(body); + + return attributes; + } + + private static MessageAttributes GetMessageAttributes(string message) + { + using var jsonDocument = JsonDocument.Parse(message); + + if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) + { + return new MessageAttributes(); + } + + Dictionary attributes = new(); + foreach(var obj in attributesElement.EnumerateObject()) + { + var dataType = obj.Value.GetProperty("Type").GetString(); + var dataValue = obj.Value.GetProperty("Value").GetString(); + + var isString = dataType == "String"; + + attributes.Add(obj.Name, new MessageAttributeValue() + { + DataType = dataType, + StringValue = isString ? dataValue : null, + BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null + }); + } + + return new MessageAttributes(attributes); + } + + private static MessageAttributes GetRawMessageAttributes(Amazon.SQS.Model.Message message) + { + Dictionary rawAttributes = new (); + if (message.MessageAttributes is null) + { + return new MessageAttributes(); + } + + foreach (var messageMessageAttribute in message.MessageAttributes) + { + var dataType = messageMessageAttribute.Value.DataType; + var dataValue = messageMessageAttribute.Value.StringValue; + var isString = dataType == "String"; + var messageAttributeValue = new MessageAttributeValue + { + DataType = dataType, + StringValue = isString ? dataValue : null, + BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null + }; + rawAttributes.Add(messageMessageAttribute.Key, messageAttributeValue); + } + + return new MessageAttributes(rawAttributes); + } + + /// + /// Compresses a message if it meets the specified compression criteria. + /// + /// The original message to potentially compress. + /// Metadata associated with the message. + /// The type of destination ( or ) for the message. + /// Options specifying when and how to compress. + /// Registry of available compression algorithms. + /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). + public static (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) + { + string contentEncoding = null; + string compressedMessage = null; + if (compressionOptions?.CompressionEncoding is { } compressionEncoding && compressionRegistry is not null) + { + var messageSize = CalculateTotalMessageSize(message, metadata); + if (messageSize > compressionOptions.MessageLengthThreshold) + { + var compression = compressionRegistry.GetCompression(compressionEncoding); + if (compression is null) + { + throw new InvalidOperationException($"No compression algorithm registered for encoding '{compressionEncoding}'."); + } + + JsonNode jsonNode = null; + if (destinationType == PublishDestinationType.Queue) + { + jsonNode = JsonNode.Parse(message); + if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) + { + message = messageNode!.GetValue(); + } + } + compressedMessage = compression.Compress(message); + contentEncoding = compressionEncoding; + + if (destinationType == PublishDestinationType.Queue) + { + if (jsonNode is JsonObject jsonObject) + { + jsonObject["Message"] = compressedMessage; + compressedMessage = jsonObject.ToJsonString(); + } + } + } + } + + return (compressedMessage, contentEncoding); + } + + /// + /// Calculates the total size of a message, including its metadata. + /// + /// The message content. + /// Metadata associated with the message. + /// The total size of the message in bytes. + private static int CalculateTotalMessageSize(string message, PublishMetadata metadata) + { + var messageSize = Encoding.UTF8.GetByteCount(message); + if (metadata?.MessageAttributes != null) + { + foreach (var attribute in metadata.MessageAttributes) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Key); + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); + if (attribute.Value.StringValue is not null) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); + } + + if (attribute.Value.BinaryValue is not null) + { + messageSize += attribute.Value.BinaryValue.Count; + } + } + } + + return messageSize; + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs b/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs index 40502f8c3..8c2ed1f02 100644 --- a/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs +++ b/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs @@ -1,6 +1,6 @@ namespace JustSaying.AwsTools.MessageHandling; -internal enum PublishDestinationType +public enum PublishDestinationType { Topic = 1, Queue = 2 diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index c546095ca..5c537e6bb 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -11,14 +11,14 @@ namespace JustSaying.AwsTools.MessageHandling; -public class SnsMessagePublisher( +internal class SnsMessagePublisher( IAmazonSimpleNotificationService client, - IMessageSerializationRegister serializationRegister, + IMessageConverter messageConverter, ILoggerFactory loggerFactory, IMessageSubjectProvider messageSubjectProvider, Func handleException = null) : IMessagePublisher, IInterrogable { - private readonly IMessageSerializationRegister _serializationRegister = serializationRegister; + private readonly IMessageConverter _messageConverter = messageConverter; private readonly IMessageSubjectProvider _messageSubjectProvider = messageSubjectProvider; private readonly Func _handleException = handleException; public Action MessageResponseLogger { get; set; } @@ -31,11 +31,11 @@ public class SnsMessagePublisher( public SnsMessagePublisher( string topicArn, IAmazonSimpleNotificationService client, - IMessageSerializationRegister serializationRegister, + IMessageConverter messageConverter, ILoggerFactory loggerFactory, IMessageSubjectProvider messageSubjectProvider, Func handleException = null) - : this(client, serializationRegister, loggerFactory, messageSubjectProvider, handleException) + : this(client, messageConverter, loggerFactory, messageSubjectProvider, handleException) { Arn = topicArn; } @@ -95,41 +95,31 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel private PublishRequest BuildPublishRequest(Message message, PublishMetadata metadata) { - var messageToSend = _serializationRegister.Serialize(message, serializeForSnsPublishing: true); + var (messageToSend, attributes, subject) = _messageConverter.ConvertForPublish(message, metadata, PublishDestinationType.Topic); - (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageToSend, metadata, PublishDestinationType.Topic, CompressionOptions, CompressionRegistry); - if (compressedMessage is not null) - { - messageToSend = compressedMessage; - } - - var messageType = _messageSubjectProvider.GetSubjectForType(message.GetType()); + // TODO + //var messageType = _messageSubjectProvider.GetSubjectForType(message.GetType()); var request = new PublishRequest { TopicArn = Arn, - Subject = messageType, + Subject = subject, Message = messageToSend, }; - AddMessageAttributes(request.MessageAttributes, metadata); - - if (contentEncoding is not null) - { - request.MessageAttributes.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); - } + AddMessageAttributes(request.MessageAttributes, attributes); return request; } - private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) + private static void AddMessageAttributes(Dictionary requestMessageAttributes, Dictionary attributes) { - if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + if (attributes == null || attributes.Count == 0) { return; } - foreach (var attribute in metadata.MessageAttributes) + foreach (var attribute in attributes) { requestMessageAttributes.Add(attribute.Key, BuildMessageAttributeValue(attribute.Value)); } diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index 03dc06a03..f9c68d36a 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -4,16 +4,16 @@ using JustSaying.Messaging; using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; -using JustSaying.Messaging.MessageSerialization; +using JustSaying.Messaging.MessageHandling; using Microsoft.Extensions.Logging; using Message = JustSaying.Models.Message; using MessageAttributeValue = Amazon.SQS.Model.MessageAttributeValue; namespace JustSaying.AwsTools.MessageHandling; -public class SqsMessagePublisher( +internal class SqsMessagePublisher( IAmazonSQS client, - IMessageSerializationRegister serializationRegister, + MessageConverter messageConverter, ILoggerFactory loggerFactory) : IMessagePublisher { private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); @@ -26,8 +26,8 @@ public class SqsMessagePublisher( public SqsMessagePublisher( Uri queueUrl, IAmazonSQS client, - IMessageSerializationRegister serializationRegister, - ILoggerFactory loggerFactory) : this(client, serializationRegister, loggerFactory) + MessageConverter messageConverter, + ILoggerFactory loggerFactory) : this(client, messageConverter, loggerFactory) { QueueUrl = queueUrl; } @@ -84,13 +84,7 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetadata metadata) { - var messageBody = GetMessageInContext(message); - - (string compressedMessage, string contentEncoding) = MessageCompressionUtility.CompressMessageIfNeeded(messageBody, metadata, PublishDestinationType.Queue, CompressionOptions, CompressionRegistry); - if (compressedMessage is not null) - { - messageBody = compressedMessage; - } + var (messageBody, attributes, _) = messageConverter.ConvertForPublish(message, metadata, PublishDestinationType.Queue); var request = new SendMessageRequest { @@ -98,12 +92,7 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad QueueUrl = QueueUrl.AbsoluteUri }; - AddMessageAttributes(request.MessageAttributes, metadata); - - if (contentEncoding is not null) - { - request.MessageAttributes.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); - } + AddMessageAttributes(request.MessageAttributes, attributes); if (metadata?.Delay != null) { @@ -113,16 +102,14 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad return request; } - public string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); - - private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) + private static void AddMessageAttributes(Dictionary requestMessageAttributes, Dictionary messageAttributes) { - if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + if (messageAttributes == null || messageAttributes.Count == 0) { return; } - foreach (var attribute in metadata.MessageAttributes) + foreach (var attribute in messageAttributes) { requestMessageAttributes.Add(attribute.Key, BuildMessageAttributeValue(attribute.Value)); } diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs b/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs index 0a33a5410..b3ab35181 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs @@ -1,4 +1,5 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Context; namespace JustSaying.AwsTools.MessageHandling; @@ -6,10 +7,12 @@ namespace JustSaying.AwsTools.MessageHandling; internal class SqsQueueReader { private readonly ISqsQueue _sqsQueue; + private readonly IMessageConverter _messageConverter; - internal SqsQueueReader(ISqsQueue sqsQueue) + internal SqsQueueReader(ISqsQueue sqsQueue, IMessageConverter messageConverter) { _sqsQueue = sqsQueue; + _messageConverter = messageConverter; } internal string QueueName => _sqsQueue.QueueName; @@ -20,7 +23,7 @@ internal SqsQueueReader(ISqsQueue sqsQueue) internal IQueueMessageContext ToMessageContext(Message message) { - return new QueueMessageContext(message, this); + return new QueueMessageContext(message, this, _messageConverter); } internal async Task> GetMessagesAsync( @@ -57,4 +60,4 @@ await _sqsQueue.ChangeMessageVisibilityAsync( (int)timeout.TotalSeconds, cancellationToken).ConfigureAwait(false); } -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs index 67ccfe989..3746713c7 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs @@ -1,3 +1,4 @@ +using JustSaying.Models; using JustSaying.Naming; namespace JustSaying.AwsTools.QueueCreation; @@ -22,7 +23,7 @@ public SqsReadConfiguration(SubscriptionType subscriptionType) public string FilterPolicy { get; set; } public string SubscriptionGroupName { get; set; } - public void ApplyTopicNamingConvention(ITopicNamingConvention namingConvention) + public void ApplyTopicNamingConvention(ITopicNamingConvention namingConvention) where T: Message { TopicName = namingConvention.Apply(TopicName); } @@ -48,4 +49,4 @@ protected override void OnValidating() throw new ConfigurationErrorsException("You must provide a name for the subscription group"); } } -} \ No newline at end of file +} diff --git a/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs b/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs index 8aed32648..0eba033bc 100644 --- a/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs +++ b/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs @@ -23,7 +23,7 @@ public static async Task> ReceiveMessagesAsync(this IAmazonSQS cl var result = await client.ReceiveMessageAsync(new ReceiveMessageRequest(queueUrl) { - AttributeNames = [.. attributesToLoad], + MessageSystemAttributeNames = [.. attributesToLoad], WaitTimeSeconds = secondsWaitTime, MaxNumberOfMessages = maxNumOfMessages, MessageAttributeNames = ["All"] diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index eea93e30f..7318bf89e 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -2,6 +2,9 @@ using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Models; using Microsoft.Extensions.Logging; #pragma warning disable CS0618 @@ -21,7 +24,7 @@ public static StaticPublicationConfiguration Build( SnsWriteConfiguration writeConfiguration, IAmazonSimpleNotificationService snsClient, ILoggerFactory loggerFactory, - JustSayingBus bus) + JustSayingBus bus) where T : Message { var readConfiguration = new SqsReadConfiguration(SubscriptionType.ToTopic) { @@ -32,7 +35,8 @@ public static StaticPublicationConfiguration Build( var eventPublisher = new SnsMessagePublisher( snsClient, - bus.SerializationRegister, + // TODO fix this properly + new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), loggerFactory, bus.Config.MessageSubjectProvider) { diff --git a/src/JustSaying/Fluent/QueueAddressConfiguration.cs b/src/JustSaying/Fluent/QueueAddressConfiguration.cs index fe15e0a86..1902538ef 100644 --- a/src/JustSaying/Fluent/QueueAddressConfiguration.cs +++ b/src/JustSaying/Fluent/QueueAddressConfiguration.cs @@ -1,13 +1,9 @@ -using JustSaying.Messaging.Middleware; - namespace JustSaying.Fluent; public sealed class QueueAddressConfiguration { public string SubscriptionGroupName { get; set; } - public Action MiddlewareConfiguration { get; set; } - public void Validate() { // TODO diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index bff1bab00..30c4fe2f6 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -1,6 +1,9 @@ using Amazon; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -47,12 +50,12 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa logger.LogInformation("Adding SQS publisher for message type '{MessageType}'", typeof(T)); var config = bus.Config; - bus.SerializationRegister.AddSerializer(); + //bus.SerializationRegister.AddSerializer(); var eventPublisher = new SqsMessagePublisher( _queueAddress.QueueUrl, proxy.GetAwsClientFactory().GetSqsClient(RegionEndpoint.GetBySystemName(_queueAddress.RegionName)), - bus.SerializationRegister, + new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), loggerFactory) { MessageResponseLogger = config.MessageResponseLogger, diff --git a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs index 2e266accc..50637d375 100644 --- a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs @@ -1,7 +1,12 @@ using Amazon; using Amazon.SQS; using JustSaying.AwsTools; +using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -32,6 +37,7 @@ internal QueueAddressSubscriptionBuilder(QueueAddress queueAddress) private Action MiddlewareConfiguration { get; set; } + private IMessageBodySerializer MessageBodySerializer { get; set; } /// /// Configures the SQS read configuration. @@ -56,6 +62,14 @@ public ISubscriptionBuilder WithMiddlewareConfiguration(Action WithMessageBodySerializer(IMessageBodySerializer messageBodySerializer) + { + MessageBodySerializer = messageBodySerializer; + return this; + } + + + /// void ISubscriptionBuilder.Configure( JustSayingBus bus, @@ -80,7 +94,9 @@ void ISubscriptionBuilder.Configure( attachedQueueConfig.SubscriptionGroupName ??= queue.QueueName; attachedQueueConfig.Validate(); - bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, queue); + var sqsSource = new SqsSource { SqsQueue = queue, MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])) }; + + bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, sqsSource); logger.LogInformation( "Created SQS queue subscription for '{MessageType}' on '{QueueName}'", diff --git a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs index d69ee30b0..e37728085 100644 --- a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs @@ -2,6 +2,9 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -99,14 +102,12 @@ void IPublicationBuilder.Configure( ConfigureWrites?.Invoke(writeConfiguration); writeConfiguration.ApplyQueueNamingConvention(config.QueueNamingConvention); - bus.SerializationRegister.AddSerializer(); - var regionEndpoint = RegionEndpoint.GetBySystemName(region); var sqsClient = proxy.GetAwsClientFactory().GetSqsClient(regionEndpoint); var eventPublisher = new SqsMessagePublisher( sqsClient, - bus.SerializationRegister, + new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), loggerFactory) { MessageResponseLogger = config.MessageResponseLogger, diff --git a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs index 84cb978e6..cf5fdb1f8 100644 --- a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs @@ -1,5 +1,8 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Models; using JustSaying.Naming; @@ -184,7 +187,7 @@ void ISubscriptionBuilder.Configure( var queue = creator.EnsureQueueExists(region, subscriptionConfig); bus.AddStartupTask(queue.StartupTask); - bus.AddQueue(subscriptionConfig.SubscriptionGroupName, queue.Queue); + bus.AddQueue(subscriptionConfig.SubscriptionGroupName, new SqsSource { MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), null), SqsQueue = queue.Queue }); logger.LogInformation( "Created SQS subscriber for message type '{MessageType}' on queue '{QueueName}'.", diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index 42ac8f5f0..15bdea060 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -51,12 +51,6 @@ private object TryResolveService(Type desiredType) { return new MessageCompressionRegistry([new GzipMessageBodyCompression()]); } - else if (desiredType == typeof(IMessageSerializationRegister)) - { - return new MessageSerializationRegister( - ResolveService(), - ResolveService()); - } else if (desiredType == typeof(IMessageSubjectProvider)) { return new NonGenericMessageSubjectProvider(); diff --git a/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs index df06550f2..e4e283ba2 100644 --- a/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs @@ -41,12 +41,7 @@ private void Build() { _serviceLookup[typeof(IMessageMonitor)] = builder.MessageMonitoring(); } - - if (builder.SerializationRegister != null) - { - _serviceLookup[typeof(IMessageSerializationRegister)] = builder.SerializationRegister(); - } - + if (builder.MessageContextAccessor != null) { _serviceLookup[typeof(IMessageContextAccessor)] = builder.MessageContextAccessor(); diff --git a/src/JustSaying/Fluent/ServicesBuilder.cs b/src/JustSaying/Fluent/ServicesBuilder.cs index 03bfc4cb2..49d85f110 100644 --- a/src/JustSaying/Fluent/ServicesBuilder.cs +++ b/src/JustSaying/Fluent/ServicesBuilder.cs @@ -36,11 +36,6 @@ internal ServicesBuilder(MessagingBusBuilder busBuilder) /// internal Func MessageMonitoring { get; private set; } - /// - /// Gets or sets a delegate to a method to create the to use. - /// - internal Func SerializationRegister { get; private set; } - /// /// Gets or sets a delegate to a method to create the to use. /// @@ -149,4 +144,4 @@ public ServicesBuilder WithMessageContextAccessor(Func MessageContextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor)); return this; } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 505dcdb08..f6b67537f 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -1,6 +1,9 @@ using Amazon; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -66,13 +69,11 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa var config = bus.Config; var arn = Arn.Parse(_topicAddress.TopicArn); - bus.SerializationRegister.AddSerializer(); - var eventPublisher = new TopicAddressPublisher( proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(arn.Region)), loggerFactory, config.MessageSubjectProvider, - bus.SerializationRegister, + new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), _exceptionHandler, _topicAddress) { @@ -81,7 +82,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa CompressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions }; CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); - + bus.AddMessagePublisher(eventPublisher); logger.LogInformation( diff --git a/src/JustSaying/Fluent/TopicAddressPublisher.cs b/src/JustSaying/Fluent/TopicAddressPublisher.cs index f7b393dbe..b4454a701 100644 --- a/src/JustSaying/Fluent/TopicAddressPublisher.cs +++ b/src/JustSaying/Fluent/TopicAddressPublisher.cs @@ -1,5 +1,6 @@ using Amazon.SimpleNotificationService; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -13,8 +14,8 @@ internal sealed class TopicAddressPublisher( IAmazonSimpleNotificationService snsClient, ILoggerFactory loggerFactory, IMessageSubjectProvider subjectProvider, - IMessageSerializationRegister serializationRegister, + IMessageConverter messageConverter, Func handleException, - TopicAddress topicAddress) : SnsMessagePublisher(topicAddress.TopicArn, snsClient, serializationRegister, loggerFactory, subjectProvider, handleException) + TopicAddress topicAddress) : SnsMessagePublisher(topicAddress.TopicArn, snsClient, messageConverter, loggerFactory, subjectProvider, handleException) { } diff --git a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs index 893f05dbc..2b5edcb0b 100644 --- a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs @@ -190,7 +190,5 @@ StaticPublicationConfiguration BuildConfiguration(string topicName) bus.AddStartupTask(config.StartupTask); bus.AddMessagePublisher(config.Publisher); - - bus.SerializationRegister.AddSerializer(); } } diff --git a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs index 977828070..86cfb7d74 100644 --- a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs @@ -1,5 +1,9 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Models; using JustSaying.Naming; @@ -203,7 +207,12 @@ void ISubscriptionBuilder.Configure( subscriptionConfig); bus.AddStartupTask(queueWithStartup.StartupTask); - bus.AddQueue(subscriptionConfig.SubscriptionGroupName, queueWithStartup.Queue); + var sqsSource = new SqsSource + { + SqsQueue = queueWithStartup.Queue, + MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])) + }; + bus.AddQueue(subscriptionConfig.SubscriptionGroupName, sqsSource); logger.LogInformation( "Created SQS topic subscription on topic '{TopicName}' and queue '{QueueName}'.", diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index 163078b42..bae498f67 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -11,6 +11,8 @@ + + diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 7406add0d..4ee108bb1 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -35,16 +35,14 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl private readonly IMessageMonitor _monitor; private ISubscriptionGroup SubscriptionGroups { get; set; } - public IMessageSerializationRegister SerializationRegister { get; } internal MiddlewareMap MiddlewareMap { get; } internal MessageCompressionRegistry CompressionRegistry { get; } public Task Completion { get; private set; } - public JustSayingBus( + internal JustSayingBus( IMessagingConfig config, - IMessageSerializationRegister serializationRegister, ILoggerFactory loggerFactory, IMessageMonitor monitor) { @@ -55,7 +53,6 @@ public JustSayingBus( _log = _loggerFactory.CreateLogger("JustSaying"); Config = config; - SerializationRegister = serializationRegister; MiddlewareMap = new MiddlewareMap(); CompressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); @@ -65,17 +62,16 @@ public JustSayingBus( _defaultSubscriptionGroupSettings = new SubscriptionGroupSettingsBuilder(); } - public JustSayingBus( + internal JustSayingBus( IMessagingConfig config, - IMessageSerializationRegister serializationRegister, IMessageReceivePauseSignal messageReceivePauseSignal, ILoggerFactory loggerFactory, - IMessageMonitor monitor) : this(config, serializationRegister, loggerFactory, monitor) + IMessageMonitor monitor) : this(config, loggerFactory, monitor) { _messageReceivePauseSignal = messageReceivePauseSignal; } - public void AddQueue(string subscriptionGroup, ISqsQueue queue) + internal void AddQueue(string subscriptionGroup, SqsSource queue) { if (string.IsNullOrWhiteSpace(subscriptionGroup)) { @@ -111,7 +107,6 @@ public void SetGroupSettings( public void AddMessageMiddleware(string queueName, HandleMessageMiddleware middleware) where T : Message { - SerializationRegister.AddSerializer(); MiddlewareMap.Add(queueName, middleware); } @@ -164,10 +159,8 @@ public async Task StartAsync(CancellationToken stoppingToken) private async Task RunImplAsync(CancellationToken stoppingToken) { var dispatcher = new MessageDispatcher( - SerializationRegister, _monitor, MiddlewareMap, - CompressionRegistry, _loggerFactory); var subscriptionGroupFactory = new SubscriptionGroupFactory( diff --git a/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs b/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs index 2a76eafc6..16845e290 100644 --- a/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs +++ b/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs @@ -1,4 +1,5 @@ using Amazon.SQS.Model; +using JustSaying.Messaging.MessageSerialization; namespace JustSaying.Messaging.Channels.Context; @@ -22,4 +23,6 @@ public interface IQueueMessageContext : IMessageVisibilityUpdater, IMessageDelet /// Gets the name of the queue that this message was received from. /// string QueueName { get; } -} \ No newline at end of file + + IMessageConverter MessageConverter { get; } +} diff --git a/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs b/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs index 71bfbdad3..1aa9a3f8a 100644 --- a/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs +++ b/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.MessageSerialization; namespace JustSaying.Messaging.Channels.Context; @@ -13,10 +14,12 @@ public sealed class QueueMessageContext : IQueueMessageContext /// /// The to be handled. /// The the message was read from. - internal QueueMessageContext(Message message, SqsQueueReader queueReader) + /// + internal QueueMessageContext(Message message, SqsQueueReader queueReader, IMessageConverter messageConverter) { Message = message ?? throw new ArgumentNullException(nameof(message)); _queueReader = queueReader ?? throw new ArgumentNullException(nameof(queueReader)); + MessageConverter = messageConverter; } /// @@ -28,6 +31,8 @@ internal QueueMessageContext(Message message, SqsQueueReader queueReader) /// public string QueueName => _queueReader.QueueName; + public IMessageConverter MessageConverter { get; } + /// public async Task UpdateMessageVisibilityTimeout(TimeSpan visibilityTimeout, CancellationToken cancellationToken) { @@ -39,4 +44,4 @@ public async Task DeleteMessage(CancellationToken cancellationToken) { await _queueReader.DeleteMessageAsync(Message.ReceiptHandle, cancellationToken).ConfigureAwait(false); } -} \ No newline at end of file +} diff --git a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs index 8aa9b057c..eba4a9a62 100644 --- a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs +++ b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs @@ -4,6 +4,7 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Channels.Context; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; @@ -38,7 +39,7 @@ public MessageReceiveBuffer( int bufferSize, TimeSpan readTimeout, TimeSpan sqsWaitTime, - ISqsQueue sqsQueue, + SqsSource sqsSource, MiddlewareBase> sqsMiddleware, IMessageReceivePauseSignal messageReceivePauseSignal, IMessageMonitor monitor, @@ -48,8 +49,8 @@ public MessageReceiveBuffer( _bufferSize = bufferSize; _readTimeout = readTimeout; _sqsWaitTime = sqsWaitTime; - if (sqsQueue == null) throw new ArgumentNullException(nameof(sqsQueue)); - _sqsQueueReader = new SqsQueueReader(sqsQueue); + if (sqsSource == null) throw new ArgumentNullException(nameof(sqsSource)); + _sqsQueueReader = new SqsQueueReader(sqsSource.SqsQueue, sqsSource.MessageConverter); _sqsMiddleware = sqsMiddleware ?? throw new ArgumentNullException(nameof(sqsMiddleware)); _messageReceivePauseSignal = messageReceivePauseSignal; _monitor = monitor ?? throw new ArgumentNullException(nameof(monitor)); diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs index 0107620c4..b906288ee 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs @@ -15,7 +15,7 @@ namespace JustSaying.Messaging.Channels.SubscriptionGroups; /// The name of the subscription group. public class SubscriptionGroupConfigBuilder(string groupName) { - private readonly List _sqsQueues = []; + private readonly List _sqsSources = []; private readonly string _groupName = groupName ?? throw new ArgumentNullException(nameof(groupName)); private int? _bufferSize; @@ -30,10 +30,10 @@ public class SubscriptionGroupConfigBuilder(string groupName) /// /// The queue to be consumed, assumed to already be created and ready. /// This builder object. - public SubscriptionGroupConfigBuilder AddQueue(ISqsQueue sqsQueue) + internal SubscriptionGroupConfigBuilder AddQueue(SqsSource sqsQueue) { if (sqsQueue == null) throw new ArgumentNullException(nameof(sqsQueue)); - _sqsQueues.Add(sqsQueue); + _sqsSources.Add(sqsQueue); return this; } @@ -42,10 +42,10 @@ public SubscriptionGroupConfigBuilder AddQueue(ISqsQueue sqsQueue) /// /// The queues to be consumed, assumed to already be created and ready. /// This builder object. - public SubscriptionGroupConfigBuilder AddQueues(IEnumerable sqsQueues) + internal SubscriptionGroupConfigBuilder AddQueues(IEnumerable sqsQueues) { if (sqsQueues == null) throw new ArgumentNullException(nameof(sqsQueues)); - _sqsQueues.AddRange(sqsQueues); + _sqsSources.AddRange(sqsQueues); return this; } @@ -138,7 +138,7 @@ public SubscriptionGroupSettings Build(SubscriptionGroupSettingsBuilder defaults _receiveMessagesWaitTime ?? defaults.ReceiveMessagesWaitTime, _multiplexerCapacity ?? defaults.MultiplexerCapacity, _prefetch ?? defaults.Prefetch, - _sqsQueues); + _sqsSources); settings.Validate(); diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs index bb3dcc5c3..8007d3874 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs @@ -15,7 +15,7 @@ namespace JustSaying.Messaging.Channels.SubscriptionGroups; /// /// Builds 's from the various components required. /// -public class SubscriptionGroupFactory : ISubscriptionGroupFactory +internal class SubscriptionGroupFactory : ISubscriptionGroupFactory { private readonly IMessageDispatcher _messageDispatcher; private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; @@ -29,7 +29,7 @@ public class SubscriptionGroupFactory : ISubscriptionGroupFactory /// The to use to dispatch messages. /// The used by the . /// The to use. - public SubscriptionGroupFactory( + private SubscriptionGroupFactory( IMessageDispatcher messageDispatcher, IMessageMonitor monitor, ILoggerFactory loggerFactory) @@ -111,7 +111,7 @@ private List CreateBuffers( var logger = _loggerFactory.CreateLogger(); - foreach (ISqsQueue queue in subscriptionGroupSettings.Queues) + foreach (SqsSource queue in subscriptionGroupSettings.QueueSources) { var buffer = new MessageReceiveBuffer( subscriptionGroupSettings.Prefetch, diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs index 7e7bfc5cc..c46288991 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs @@ -16,7 +16,7 @@ internal SubscriptionGroupSettings( TimeSpan receiveMessagesWaitTime, int multiplexerCapacity, int prefetch, - IReadOnlyCollection queues) + IReadOnlyCollection queueSources) { ConcurrencyLimit = concurrencyLimit; BufferSize = bufferSize; @@ -24,7 +24,7 @@ internal SubscriptionGroupSettings( ReceiveMessagesWaitTime = receiveMessagesWaitTime; MultiplexerCapacity = multiplexerCapacity; Prefetch = prefetch; - Queues = queues; + QueueSources = queueSources; Name = name; } @@ -67,5 +67,11 @@ internal SubscriptionGroupSettings( /// /// A collection of to read messages from. /// - public IReadOnlyCollection Queues { get; } + public IReadOnlyCollection QueueSources { get; } +} + +public sealed class SqsSource +{ + public ISqsQueue SqsQueue { get; set; } + public IMessageConverter MessageConverter { get; set; } } diff --git a/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs b/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs index 0be4d9174..7d575efff 100644 --- a/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs +++ b/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs @@ -15,7 +15,7 @@ public class GenericMessageSubjectProvider : IMessageSubjectProvider private static IEnumerable Flatten(Type type) { yield return type; - foreach (var inner in type.GetTypeInfo().GetGenericArguments().SelectMany(Flatten)) + foreach (var inner in type.GetGenericArguments().SelectMany(Flatten)) { yield return inner; } diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs index c772369c0..1c0660d27 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs @@ -3,31 +3,31 @@ namespace JustSaying.Messaging.MessageSerialization; -public interface IMessageSerializationRegister -{ - /// - /// Deserializes a message. - /// - /// Message must always have Subject and Message properties - /// The and - /// returned from the body of the SQS message. - MessageWithAttributes DeserializeMessage(string body); - - /// - /// Serializes a message for publishing - /// - /// - /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: - /// new { Subject = message.GetType().Name, Message = serializedMessage }; - /// - /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties - /// - /// The serialized message for publishing. - string Serialize(Message message, bool serializeForSnsPublishing); - - /// - /// Register a serializer for the given type, if one does not already exist. - /// - /// The type to register a serializer for. - void AddSerializer() where T : Message; -} +// internal interface IMessageSerializationRegister +// { +// /// +// /// Deserializes a message. +// /// +// /// Message must always have Subject and Message properties +// /// The and +// /// returned from the body of the SQS message. +// Message DeserializeMessage(string body); +// +// /// +// /// Serializes a message for publishing +// /// +// /// +// /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: +// /// new { Subject = message.GetType().Name, Message = serializedMessage }; +// /// +// /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties +// /// +// /// The serialized message for publishing. +// string Serialize(Message message, bool serializeForSnsPublishing); +// +// /// +// /// Register a serializer for the given type, if one does not already exist. +// /// +// /// The type to register a serializer for. +// void AddSerializer() where T : Message; +// } diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs index d0f7b10a2..2dff9a9f5 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs @@ -7,8 +7,6 @@ public interface IMessageSerializer { string GetMessageSubject(string sqsMessage); - MessageAttributes GetMessageAttributes(string message); - Message Deserialize(string message, Type type); /// @@ -22,4 +20,25 @@ public interface IMessageSerializer /// /// string Serialize(Message message, bool serializeForSnsPublishing, string subject); -} \ No newline at end of file +} + +public interface IMessageBodySerializer +{ + string Serialize(Message message); + Message Deserialize(string message); +} + + +// public sealed class MessageEnvelopeWrapper : IMessageEnvelopeWrapper +// { +// public string Serialize(string messageBody, string typeIdentifier) +// { +// return messageBody; +// } +// +// public string Deserialize(string message) +// { +// return message; +// } +// } +// diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs index cad232cea..c12b156fa 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs @@ -5,4 +5,4 @@ namespace JustSaying.Messaging.MessageSerialization; public interface IMessageSerializationFactory { IMessageSerializer GetSerializer() where T : Message; -} \ No newline at end of file +} diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs index 243b11039..6bfe0135a 100644 --- a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs +++ b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs @@ -3,77 +3,76 @@ namespace JustSaying.Messaging.MessageSerialization; -public class MessageSerializationRegister : IMessageSerializationRegister -{ - private readonly IMessageSubjectProvider _messageSubjectProvider; - private readonly IMessageSerializationFactory _serializationFactory; - private readonly ConcurrentDictionary> _typeSerializersBySubject = new(StringComparer.OrdinalIgnoreCase); - private readonly HashSet _messageSerializers = new(); - - public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, IMessageSerializationFactory serializationFactory) - { - _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); - _serializationFactory = serializationFactory; - } - - public void AddSerializer() where T : Message - { - string key = _messageSubjectProvider.GetSubjectForType(typeof(T)); - - var typeSerializer = _typeSerializersBySubject.GetOrAdd(key, - _ => new Lazy( - () => new TypeSerializer(typeof(T), _serializationFactory.GetSerializer()) - ) - ).Value; - - _messageSerializers.Add(typeSerializer.Serializer); - } - - public MessageWithAttributes DeserializeMessage(string body) - { - // TODO Can we remove this loop rather than try each serializer? - foreach (var messageSerializer in _messageSerializers) - { - string messageSubject = messageSerializer.GetMessageSubject(body); // Custom serializer pulls this from cloud event type - - if (string.IsNullOrWhiteSpace(messageSubject)) - { - continue; - } - - if (!_typeSerializersBySubject.TryGetValue(messageSubject, out var lazyTypeSerializer)) - { - continue; - } - - TypeSerializer typeSerializer = lazyTypeSerializer.Value; - var attributes = typeSerializer.Serializer.GetMessageAttributes(body); - - var message = typeSerializer.Serializer.Deserialize(body, typeSerializer.Type); - return new MessageWithAttributes(message, attributes); - } - - var exception = new MessageFormatNotSupportedException("Message can not be handled - type undetermined."); - - // Put the message's body into the exception data so anyone catching - // it can inspect it for other purposes, such as for logging. - exception.Data["MessageBody"] = body; - - throw exception; - } - - public string Serialize(Message message, bool serializeForSnsPublishing) - { - var messageType = message.GetType(); - string subject = _messageSubjectProvider.GetSubjectForType(messageType); - - if (!_typeSerializersBySubject.TryGetValue(subject, out var lazyTypeSerializer)) - { - throw new MessageFormatNotSupportedException($"Failed to serialize message of type {messageType} because it is not registered for serialization."); - } - - var typeSerializer = lazyTypeSerializer.Value; - IMessageSerializer messageSerializer = typeSerializer.Serializer; - return messageSerializer.Serialize(message, serializeForSnsPublishing, subject); - } -} +// internal class MessageSerializationRegister : IMessageSerializationRegister +// { +// private readonly IMessageSubjectProvider _messageSubjectProvider; +// private readonly IMessageSerializationFactory _serializationFactory; +// private readonly ConcurrentDictionary> _typeSerializersBySubject = new(StringComparer.OrdinalIgnoreCase); +// private readonly HashSet _messageSerializers = new(); +// +// public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, IMessageSerializationFactory serializationFactory) +// { +// _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); +// _serializationFactory = serializationFactory; +// } +// +// public void AddSerializer() where T : Message +// { +// string key = _messageSubjectProvider.GetSubjectForType(typeof(T)); +// +// var typeSerializer = _typeSerializersBySubject.GetOrAdd(key, +// _ => new Lazy( +// () => new TypeSerializer(typeof(T), _serializationFactory.GetSerializer()) +// ) +// ).Value; +// +// _messageSerializers.Add(typeSerializer.Serializer); +// } +// +// public Message DeserializeMessage(string body) +// { +// // TODO Can we remove this loop rather than try each serializer? +// foreach (var messageSerializer in _messageSerializers) +// { +// string messageSubject = messageSerializer.GetMessageSubject(body); // Custom serializer pulls this from cloud event type +// +// if (string.IsNullOrWhiteSpace(messageSubject)) +// { +// continue; +// } +// +// if (!_typeSerializersBySubject.TryGetValue(messageSubject, out var lazyTypeSerializer)) +// { +// continue; +// } +// +// TypeSerializer typeSerializer = lazyTypeSerializer.Value; +// +// var message = typeSerializer.Serializer.Deserialize(body, typeSerializer.Type); +// return message; +// } +// +// var exception = new MessageFormatNotSupportedException("Message can not be handled - type undetermined."); +// +// // Put the message's body into the exception data so anyone catching +// // it can inspect it for other purposes, such as for logging. +// exception.Data["MessageBody"] = body; +// +// throw exception; +// } +// +// public string Serialize(Message message, bool serializeForSnsPublishing) +// { +// var messageType = message.GetType(); +// string subject = _messageSubjectProvider.GetSubjectForType(messageType); +// +// if (!_typeSerializersBySubject.TryGetValue(subject, out var lazyTypeSerializer)) +// { +// throw new MessageFormatNotSupportedException($"Failed to serialize message of type {messageType} because it is not registered for serialization."); +// } +// +// var typeSerializer = lazyTypeSerializer.Value; +// IMessageSerializer messageSerializer = typeSerializer.Serializer; +// return messageSerializer.Serialize(message, serializeForSnsPublishing, subject); +// } +// } diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs b/src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs deleted file mode 100644 index d57fdaac1..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs +++ /dev/null @@ -1,20 +0,0 @@ -using JustSaying.Messaging.MessageHandling; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -/// -/// Represents a deserialized message with attributes. -/// -public class MessageWithAttributes(Message message, MessageAttributes messageAttributes) -{ - /// - /// Gets the message that was extracted from a message body. - /// - public Message Message { get; } = message; - - /// - /// Gets the attributes that were extracted from a message body. - /// - public MessageAttributes MessageAttributes { get; } = messageAttributes; -} diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs index 68c5b5d25..d1281e9e0 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs @@ -89,3 +89,27 @@ public string GetMessageSubject(string sqsMessage) return body.Value("Subject") ?? string.Empty; } } + +public class NewtonsoftMessageBodySerializer : IMessageBodySerializer where T: Message +{ + private readonly JsonSerializerSettings _settings; + + public NewtonsoftMessageBodySerializer(JsonSerializerSettings settings = null) + { + _settings = settings ?? new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Converters = [new Newtonsoft.Json.Converters.StringEnumConverter()] + }; + } + + public string Serialize(Message message) + { + return JsonConvert.SerializeObject(message, _settings); + } + + public Message Deserialize(string message) + { + return JsonConvert.DeserializeObject(message, _settings); + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs b/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs new file mode 100644 index 000000000..4aecf6c05 --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs @@ -0,0 +1,47 @@ +using JustSaying.Messaging.MessageHandling; +using JustSaying.Models; + +namespace JustSaying.Messaging.MessageSerialization; + +/// +/// Represents a deserialized message with attributes. +/// +public sealed class ReceivedMessage(Message message, MessageAttributes messageAttributes) +{ + /// + /// Gets the message that was extracted from a message body. + /// + public Message Message { get; } = message; + + /// + /// Gets the attributes that were extracted from a message body. + /// + public MessageAttributes MessageAttributes { get; } = messageAttributes; + + public void Deconstruct(out Message message, out MessageAttributes attributes) + { + message = Message; + attributes = MessageAttributes; + } +} + +public sealed class MessageForPublishing +{ + public MessageForPublishing(string body, Dictionary messageAttributes, string subject) + { + Body = body; + MessageAttributes = messageAttributes; + Subject = subject; + } + + public string Body { get; } + public Dictionary MessageAttributes { get; } + public string Subject { get; } + + public void Deconstruct(out string body, out Dictionary attributes, out string subject) + { + body = Body; + attributes = MessageAttributes; + subject = Subject; + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs index 302e54ffd..ed445d31a 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs @@ -106,3 +106,32 @@ public string Serialize(Message message, bool serializeForSnsPublishing, string return JsonSerializer.Serialize(context, _options); } } + +public class SystemTextJsonMessageBodySerializer : IMessageBodySerializer where T: Message +{ + private readonly JsonSerializerOptions _options; + + private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonStringEnumConverter(), + }, + }; + + public SystemTextJsonMessageBodySerializer(JsonSerializerOptions options) + { + _options = options ?? DefaultJsonSerializerOptions; + } + + public string Serialize(Message message) + { + return JsonSerializer.Serialize(message, message.GetType(), _options); + } + + public Message Deserialize(string messageBody) + { + return JsonSerializer.Deserialize(messageBody, _options); + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs index 6f116d7b9..ec48e0ba8 100644 --- a/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs @@ -4,4 +4,5 @@ public class TypeSerializer(Type type, IMessageSerializer serializer) { public Type Type { get; private set; } = type; public IMessageSerializer Serializer { get; private set; } = serializer; + //public IMessageEnvelopeWrapper EnvelopeWrapper { get; private set; } = envelopeWrapper; } diff --git a/src/JustSaying/MessagingBusBuilder.cs b/src/JustSaying/MessagingBusBuilder.cs index b7b77c52e..027593fcf 100644 --- a/src/JustSaying/MessagingBusBuilder.cs +++ b/src/JustSaying/MessagingBusBuilder.cs @@ -254,11 +254,10 @@ public IMessagingBus BuildSubscribers() private JustSayingBus CreateBus(IMessagingConfig config, ILoggerFactory loggerFactory) { - IMessageSerializationRegister register = ServiceResolver.ResolveService(); IMessageReceivePauseSignal messageReceivePauseSignal = ServiceResolver.ResolveService(); IMessageMonitor monitor = ServiceResolver.ResolveOptionalService() ?? new NullOpMessageMonitor(); - var bus = new JustSayingBus(config, register, messageReceivePauseSignal, loggerFactory, monitor); + var bus = new JustSayingBus(config, messageReceivePauseSignal, loggerFactory, monitor); return bus; } diff --git a/src/JustSaying/Naming/DefaultNamingConventions.cs b/src/JustSaying/Naming/DefaultNamingConventions.cs index 8eb9fbd89..e89245021 100644 --- a/src/JustSaying/Naming/DefaultNamingConventions.cs +++ b/src/JustSaying/Naming/DefaultNamingConventions.cs @@ -51,7 +51,7 @@ private static string GetTypeFriendlyName(Type type) return friendlyName; } - if (type.GetTypeInfo().IsGenericType) + if (type.IsGenericType) { var indexOfBacktick = friendlyName.IndexOf('`'); diff --git a/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs b/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs index 71456f9e1..397729732 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs @@ -1,38 +1,38 @@ -namespace JustSaying.IntegrationTests.Fluent; - -public class ActionRunnerTest(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) -{ - protected override TimeSpan Timeout => TimeSpan.FromSeconds(2); - - [Fact] - public async Task TestRunnerWillSucceedOnSuccessfulTask() - { - static async Task SuccessTask(CancellationToken ctx) => - await Task.Delay(100, ctx); - - await RunActionWithTimeout(SuccessTask); - } - - [Fact] - public async Task TestRunnerWillThrowOnTimeout() - { - async Task TimeoutTask(CancellationToken ctx) => - await Task.Delay(Timeout.Add(Timeout), ctx); - - await Assert.ThrowsAsync( - () => RunActionWithTimeout(TimeoutTask)); - } - - [Fact] - public async Task TestRunnerWillThrowOnFailure() - { - static async Task ThrowingTask(CancellationToken ctx) - { - await Task.Delay(100, ctx); - throw new InvalidOperationException(); - } - - await Assert.ThrowsAsync( - () => RunActionWithTimeout(ThrowingTask)); - } -} +// namespace JustSaying.IntegrationTests.Fluent; +// +// public class ActionRunnerTest(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +// { +// protected override TimeSpan Timeout => TimeSpan.FromSeconds(2); +// +// [Fact] +// public async Task TestRunnerWillSucceedOnSuccessfulTask() +// { +// static async Task SuccessTask(CancellationToken ctx) => +// await Task.Delay(100, ctx); +// +// await RunActionWithTimeout(SuccessTask); +// } +// +// [Fact] +// public async Task TestRunnerWillThrowOnTimeout() +// { +// async Task TimeoutTask(CancellationToken ctx) => +// await Task.Delay(Timeout.Add(Timeout), ctx); +// +// await Assert.ThrowsAsync( +// () => RunActionWithTimeout(TimeoutTask)); +// } +// +// [Fact] +// public async Task TestRunnerWillThrowOnFailure() +// { +// static async Task ThrowingTask(CancellationToken ctx) +// { +// await Task.Delay(100, ctx); +// throw new InvalidOperationException(); +// } +// +// await Assert.ThrowsAsync( +// () => RunActionWithTimeout(ThrowingTask)); +// } +// } diff --git a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs index 6fdd0f6fa..719eb5326 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs @@ -1,10 +1,14 @@ using System.Diagnostics; +using Amazon; using Amazon.Runtime; +using Amazon.SimpleNotificationService; +using Amazon.SQS; using JustSaying.AwsTools; using JustSaying.Messaging; using JustSaying.Messaging.MessageHandling; using JustSaying.Models; using JustSaying.TestingFramework; +using LocalAwsMessaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NSubstitute; @@ -31,7 +35,9 @@ public abstract class IntegrationTestBase(ITestOutputHelper outputHelper) protected virtual bool IsSimulator => TestEnvironment.IsSimulatorConfigured; - protected virtual TimeSpan Timeout => TimeSpan.FromSeconds(Debugger.IsAttached ? 60 : 20); + protected virtual InMemoryAwsBus Bus { get; } = new InMemoryAwsBus(); + + protected virtual TimeSpan Timeout => TimeSpan.FromSeconds(Debugger.IsAttached ? 300 : 10); protected virtual string UniqueName { get; } = $"{Guid.NewGuid():N}-integration-tests"; @@ -62,8 +68,9 @@ protected IServiceCollection Given( builder.Messaging((options) => options.WithRegion(RegionName)) .Client((options) => { - options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) - .WithServiceUri(ServiceUri); + options.WithClientFactory(() => new LocalAwsClientFactory(Bus)); + // options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) + // .WithServiceUri(ServiceUri); }); builder.Subscriptions(sub => sub.WithDefaults(x => x.WithDefaultConcurrencyLimit(10))); @@ -73,8 +80,9 @@ protected IServiceCollection Given( protected virtual IAwsClientFactory CreateClientFactory() { - var credentials = new SessionAWSCredentials(AccessKeyId, SecretAccessKey, SessionToken); - return new DefaultAwsClientFactory(credentials) { ServiceUri = ServiceUri }; + return new LocalAwsClientFactory(Bus); + // var credentials = new SessionAWSCredentials(AccessKeyId, SecretAccessKey, SessionToken); + // return new DefaultAwsClientFactory(credentials) { ServiceUri = ServiceUri }; } protected IHandlerAsync CreateHandler(TaskCompletionSource completionSource) @@ -131,3 +139,22 @@ protected async Task RunActionWithTimeout(Func action) await actionTask; } } + +public sealed class LocalAwsClientFactory : IAwsClientFactory +{ + private readonly InMemoryAwsBus _bus; + + public LocalAwsClientFactory(InMemoryAwsBus bus) + { + _bus = bus; + } + public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) + { + return _bus.CreateSnsClient(); + } + + public IAmazonSQS GetSqsClient(RegionEndpoint region) + { + return _bus.CreateSqsClient(); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs index f75649baa..031b6354b 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs @@ -1,8 +1,10 @@ using JustSaying.Fluent; +using JustSaying.IntegrationTests.Fluent; using JustSaying.Messaging; using JustSaying.Messaging.Monitoring; using JustSaying.Models; using JustSaying.TestingFramework; +using LocalAwsMessaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -22,14 +24,17 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue() var queueName = Guid.NewGuid().ToString(); // Arrange + var bus = new InMemoryAwsBus(); var services = new ServiceCollection() .AddLogging((p) => p.AddXUnit(OutputHelper)) .AddJustSaying( (builder) => { builder.Client((options) => - options.WithBasicCredentials("accessKey", "secretKey") - .WithServiceUri(TestEnvironment.SimulatorUrl)) + options.WithClientFactory(() => new LocalAwsClientFactory(bus)) + // options.WithBasicCredentials("accessKey", "secretKey") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ) .Messaging((options) => options.WithRegion("eu-west-1")) .Publications((options) => options.WithQueue(o => o.WithName(queueName))) .Subscriptions((options) => options.ForQueue(o => o.WithQueueName(queueName))) @@ -66,6 +71,7 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Topic() var topicName = Guid.NewGuid().ToString(); // Arrange + var bus = new InMemoryAwsBus(); var services = new ServiceCollection() .AddLogging((p) => p.AddXUnit(OutputHelper)) .AddJustSaying( @@ -73,8 +79,10 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Topic() { builder .Client((options) => - options.WithBasicCredentials("accessKey", "secretKey") - .WithServiceUri(TestEnvironment.SimulatorUrl)) + options.WithClientFactory(() => new LocalAwsClientFactory(bus)) + // options.WithBasicCredentials("accessKey", "secretKey") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ) .Messaging((options) => options.WithRegion("eu-west-1")) .Publications((options) => options.WithTopic()) .Subscriptions((options) => options.ForTopic(cfg => cfg.WithQueueName(topicName))); @@ -169,9 +177,13 @@ private sealed class AwsContributor : IMessageBusConfigurationContributor { public void Configure(MessagingBusBuilder builder) { + var bus = new InMemoryAwsBus(); builder.Client( - (options) => options.WithSessionCredentials("accessKeyId", "secretKeyId", "token") - .WithServiceUri(TestEnvironment.SimulatorUrl)); + (options) => + options.WithClientFactory(() => new LocalAwsClientFactory(bus)) + // options.WithSessionCredentials("accessKeyId", "secretKeyId", "token") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ); } } diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs index a2fb59f3b..cd17a1c2b 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs @@ -42,6 +42,8 @@ await WhenAsync( services, async (publisher, listener, cancellationToken) => { + var waitForSixMessages = handler.WaitForMessageCountAsync(6, cancellationToken); + await listener.StartAsync(cancellationToken); await publisher.StartAsync(cancellationToken); @@ -57,11 +59,14 @@ await WhenAsync( json = publisherJson.Replace(UniqueName, "integrationTestQueueName", StringComparison.Ordinal); + await waitForSixMessages; + // Assert await Patiently.AssertThatAsync(OutputHelper, () => { var received = handler.ReceivedMessages; + received.Count.ShouldBe(6); received.ShouldContain(x => x.Content == testId && x.Tenant == "uk", 2); received.ShouldContain(x => x.Content == testId && x.Tenant == "it", 2); received.ShouldContain(x => x.Content == testId && x.Tenant == "es", 2); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs index 2f49d461e..e1bdb47b5 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs @@ -16,8 +16,8 @@ public sealed class WhenReceivingIsThrottled(ITestOutputHelper outputHelper) : I [AwsFact] public async Task Then_The_Messages_Are_Handled_With_Throttle() { - // First handler takes ages all the others take 50 ms - int waitOthers = 50; + // First handler takes ages all the others take 10 ms + int waitOthers = 10; int waitOne = 3_600_000; var messagesToSend = Enumerable.Range(0, 30) @@ -41,19 +41,21 @@ public async Task Then_The_Messages_Are_Handled_With_Throttle() c.WithSubscriptionGroup("group"))))) .AddSingleton>(handler); - var baseSleep = TimeSpan.FromMilliseconds(500); + var baseSleep = TimeSpan.FromMilliseconds(50); await WhenAsync( services, async (publisher, listener, cancellationToken) => { + var waitForElevenMessages = handler.WaitForMessageCountAsync(11, cancellationToken); + await listener.StartAsync(cancellationToken); await publisher.StartAsync(cancellationToken); - // Publish the message with a long running handler + // Publish the message with a long-running handler await publisher.PublishAsync(messagesToSend.First(), cancellationToken); - // Give some time to AWS to schedule the first long running message + // Give some time to AWS to schedule the first long-running message await Task.Delay(baseSleep, cancellationToken); foreach (var msg in messagesToSend.Skip(1).SkipLast(1)) @@ -65,8 +67,8 @@ await WhenAsync( await Task.Delay(baseSleep, cancellationToken); await publisher.PublishAsync(messagesToSend.Last(), cancellationToken); - // Wait for a reasonble time before asserting whether the last message has been scheduled. - await Task.Delay(baseSleep * 2, cancellationToken); + // Wait for more than 10 messages. + await waitForElevenMessages; handler.ReceivedMessages.Count.ShouldBeGreaterThan(10); handler.ReceivedMessages.ShouldBeInOrder(SortDirection.Ascending); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs index 71000d989..71c634fae 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs @@ -166,8 +166,9 @@ public async Task CanPublishUsingTopicArnWithoutStartingBusAndWithNoRegion() { builder.Client((options) => { - options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) - .WithServiceUri(ServiceUri); + options.WithClientFactory(() => clientFactory); + // options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) + // .WithServiceUri(ServiceUri); }); }) .ConfigureJustSaying(builder => @@ -192,4 +193,4 @@ await WhenAsync( await publisher.PublishAsync(message, cancellationToken); }); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj index fb965627b..f35b60279 100644 --- a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj +++ b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj @@ -9,17 +9,18 @@ + - - + + - + diff --git a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln new file mode 100644 index 000000000..5181f1dca --- /dev/null +++ b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JustSaying.IntegrationTests", "JustSaying.IntegrationTests.csproj", "{7B078B88-5CAE-423B-B6BB-18392F7C54BD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E3F85F97-D917-4B57-9EC0-DB84F3917969} + EndGlobalSection +EndGlobal diff --git a/tests/JustSaying.IntegrationTests/TestSettings.cs b/tests/JustSaying.IntegrationTests/TestSettings.cs index e5cc5d402..929e22c3f 100644 --- a/tests/JustSaying.IntegrationTests/TestSettings.cs +++ b/tests/JustSaying.IntegrationTests/TestSettings.cs @@ -1 +1 @@ -[assembly: CollectionBehavior(DisableTestParallelization = true)] +// [assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/JustSaying.IntegrationTests/docker-compose.yml b/tests/JustSaying.IntegrationTests/docker-compose.yml index db9abcdc9..50318c880 100644 --- a/tests/JustSaying.IntegrationTests/docker-compose.yml +++ b/tests/JustSaying.IntegrationTests/docker-compose.yml @@ -1,10 +1,9 @@ -version: "2" services: localstack: container_name: localstack restart: unless-stopped - image: localstack/localstack:3.3.0 + image: localstack/localstack:3.6.0 ports: - - 4566:4566 + - "4566:4566" environment: LS_LOG: debug diff --git a/tests/JustSaying.IntegrationTests/xunit.runner.json b/tests/JustSaying.IntegrationTests/xunit.runner.json index b1988f269..96581b86d 100644 --- a/tests/JustSaying.IntegrationTests/xunit.runner.json +++ b/tests/JustSaying.IntegrationTests/xunit.runner.json @@ -1,6 +1,4 @@ { "methodDisplay": "classAndMethod", - "methodDisplayOptions": "replaceUnderscoreWithSpace", - "parallelizeTestCollections": false, - "maxParallelThreads": 1 + "methodDisplayOptions": "replaceUnderscoreWithSpace" } diff --git a/tests/JustSaying.TestingFramework/InspectableHandler.cs b/tests/JustSaying.TestingFramework/InspectableHandler.cs index 76e16884a..0bafa1cbf 100644 --- a/tests/JustSaying.TestingFramework/InspectableHandler.cs +++ b/tests/JustSaying.TestingFramework/InspectableHandler.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using JustSaying.Messaging.MessageHandling; namespace JustSaying.TestingFramework; @@ -6,21 +7,21 @@ public class InspectableHandler : IHandlerAsync { public InspectableHandler() { - ReceivedMessages = new List(); + ReceivedMessages = []; ShouldSucceed = true; } public Action OnHandle { get; set; } - public IList ReceivedMessages { get; } + public ConcurrentQueue ReceivedMessages { get; } public bool ShouldSucceed { get; set; } public virtual Task Handle(T message) { - ReceivedMessages.Add(message); + ReceivedMessages.Enqueue(message); OnHandle?.Invoke(message); return Task.FromResult(ShouldSucceed); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs b/tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs new file mode 100644 index 000000000..89931cc6f --- /dev/null +++ b/tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs @@ -0,0 +1,32 @@ +namespace JustSaying.TestingFramework; + +public static class InspectableHandlerExtensions +{ + public static async Task WaitForMessageCountAsync(this InspectableHandler handler, int count, CancellationToken cancellationToken = default) + { + var tcs = new TaskCompletionSource(); + var messageCount = 0; + + handler.OnHandle += Handler; + + await tcs.Task; + + handler.OnHandle -= Handler; + return; + + void Handler(T _) + { + if (cancellationToken.IsCancellationRequested) + { + tcs.SetCanceled(cancellationToken); + return; + } + + Interlocked.Increment(ref messageCount); + if (messageCount >= count) + { + tcs.SetResult(true); + } + } + } +} diff --git a/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs b/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs index a400a192b..6eb37c63f 100644 --- a/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs +++ b/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs @@ -6,31 +6,31 @@ namespace JustSaying.TestingFramework; -public class LocalAwsClientFactory(Uri serviceUrl) : IAwsClientFactory -{ - private Uri ServiceUrl { get; } = serviceUrl; - - public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) - { - var credentials = new AnonymousAWSCredentials(); - var clientConfig = new AmazonSimpleNotificationServiceConfig - { - RegionEndpoint = region, - ServiceURL = ServiceUrl.ToString() - }; - - return new AmazonSimpleNotificationServiceClient(credentials, clientConfig); - } - - public IAmazonSQS GetSqsClient(RegionEndpoint region) - { - var credentials = new AnonymousAWSCredentials(); - var clientConfig = new AmazonSQSConfig - { - RegionEndpoint = region, - ServiceURL = ServiceUrl.ToString() - }; - - return new AmazonSQSClient(credentials, clientConfig); - } -} \ No newline at end of file +// public class LocalAwsClientFactory(Uri serviceUrl) : IAwsClientFactory +// { +// private Uri ServiceUrl { get; } = serviceUrl; +// +// public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) +// { +// var credentials = new AnonymousAWSCredentials(); +// var clientConfig = new AmazonSimpleNotificationServiceConfig +// { +// RegionEndpoint = region, +// ServiceURL = ServiceUrl.ToString() +// }; +// +// return new AmazonSimpleNotificationServiceClient(credentials, clientConfig); +// } +// +// public IAmazonSQS GetSqsClient(RegionEndpoint region) +// { +// var credentials = new AnonymousAWSCredentials(); +// var clientConfig = new AmazonSQSConfig +// { +// RegionEndpoint = region, +// ServiceURL = ServiceUrl.ToString() +// }; +// +// return new AmazonSQSClient(credentials, clientConfig); +// } +// } diff --git a/tests/JustSaying.TestingFramework/TestEnvironment.cs b/tests/JustSaying.TestingFramework/TestEnvironment.cs index 4586ebb0b..41de48542 100644 --- a/tests/JustSaying.TestingFramework/TestEnvironment.cs +++ b/tests/JustSaying.TestingFramework/TestEnvironment.cs @@ -46,14 +46,14 @@ public static Uri SimulatorUrl get { // TODO Undo this change - //return new Uri("http://localhost:4566", UriKind.Absolute); - var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); - if (string.IsNullOrWhiteSpace(awsEnv)) - { - return null; - } - - return new Uri(awsEnv, UriKind.Absolute); + return new Uri("http://localhost:4566", UriKind.Absolute); + // var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); + // if (string.IsNullOrWhiteSpace(awsEnv)) + // { + // return null; + // } + // + // return new Uri(awsEnv, UriKind.Absolute); } } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs index 11a013091..c2f9b5759 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs @@ -2,6 +2,8 @@ using JustSaying.Messaging.Compression; using JustSaying.AwsTools.MessageHandling; +namespace JustSaying.UnitTests.AwsTools.MessageHandling; + public class MessageCompressionUtilityTests { private readonly MessageCompressionRegistry _compressionRegistry; @@ -20,7 +22,7 @@ public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() var compressionOptions = new PublishCompressionOptions(); // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.Null(result.compressedMessage); @@ -40,7 +42,7 @@ public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMe }; // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.Null(result.compressedMessage); @@ -60,7 +62,7 @@ public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMes }; // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.NotNull(result.compressedMessage); @@ -88,7 +90,7 @@ public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() }; // Act - var result = MessageCompressionUtility.CompressMessageIfNeeded(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); // Assert Assert.NotNull(result.compressedMessage); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 6065b156c..e8976cc1c 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -5,12 +5,14 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; using Microsoft.Extensions.Logging; +using MessageAttributeValue = Amazon.SQS.Model.MessageAttributeValue; namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; @@ -23,10 +25,7 @@ public async Task ShouldDecompressMessage() var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; var decompressorRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - var messageSerializerRegistry = new MessageSerializationRegister( - new NonGenericMessageSubjectProvider(), - new SystemTextJsonSerializationFactory()); - messageSerializerRegistry.AddSerializer(); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), decompressorRegistry); string payload = JsonSerializer.Serialize(originalMessage, originalMessage.GetType(), new JsonSerializerOptions { @@ -56,12 +55,12 @@ public async Task ShouldDecompressMessage() }; var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty())); - var queueReader = new SqsQueueReader(queue); + var queueReader = new SqsQueueReader(queue, messageConverter); var messageContext = queueReader.ToMessageContext(sqsMessage); var middlewareMap = new MiddlewareMap(); var inspectableMiddleware = new InspectableMiddleware(); middlewareMap.Add("fake-queue-name", inspectableMiddleware); - var messageDispatcher = new MessageDispatcher(messageSerializerRegistry, new NullOpMessageMonitor(), middlewareMap, decompressorRegistry, new LoggerFactory()); + var messageDispatcher = new MessageDispatcher(new NullOpMessageMonitor(), middlewareMap, new LoggerFactory()); // Act await messageDispatcher.DispatchMessageAsync(messageContext, CancellationToken.None); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index a32ae5e1e..6c48a0120 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -2,6 +2,7 @@ using Amazon.SQS; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageProcessingStrategies; @@ -25,7 +26,6 @@ public class WhenDispatchingMessage : IAsyncLifetime { private const string ExpectedQueueUrl = "http://testurl.com/queue"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private readonly TrackingLoggingMonitor _messageMonitor; private readonly MiddlewareMap _middlewareMap; private readonly ILoggerFactory _loggerFactory; @@ -38,6 +38,7 @@ public class WhenDispatchingMessage : IAsyncLifetime internal MessageDispatcher SystemUnderTest { get; private set; } protected readonly IMessageBackoffStrategy MessageBackoffStrategy = Substitute.For(); + private readonly MessageConverter _messageConverter; public WhenDispatchingMessage(ITestOutputHelper outputHelper) { @@ -45,6 +46,7 @@ public WhenDispatchingMessage(ITestOutputHelper outputHelper) _loggerFactory = TestLoggerFactory.Create(lb => lb.AddXUnit(outputHelper)); _messageMonitor = new TrackingLoggingMonitor(_loggerFactory.CreateLogger()); _middlewareMap = new MiddlewareMap(); + _messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); } public virtual async Task InitializeAsync() @@ -80,23 +82,19 @@ IEnumerable GetMessages() { Uri = new Uri(ExpectedQueueUrl) }; - _serializationRegister.DeserializeMessage(Arg.Any()) - .Returns(new MessageWithAttributes(_typedMessage, new MessageAttributes())); } private async Task When() { - var queueReader = new SqsQueueReader(_queue); + var queueReader = new SqsQueueReader(_queue, _messageConverter); await SystemUnderTest.DispatchMessageAsync(queueReader.ToMessageContext(_sqsMessage), CancellationToken.None); } private MessageDispatcher CreateSystemUnderTestAsync() { var dispatcher = new MessageDispatcher( - _serializationRegister, _messageMonitor, _middlewareMap, - new MessageCompressionRegistry([]), _loggerFactory); return dispatcher; @@ -113,12 +111,6 @@ protected override void Given() _sqsMessage.Attributes.Add(MessageSystemAttributeName.ApproximateReceiveCount, ExpectedReceiveCount.ToString(CultureInfo.InvariantCulture)); } - [Fact] - public void ShouldDeserializeMessage() - { - _serializationRegister.Received(1).DeserializeMessage(Arg.Is(x => x == _sqsMessage.Body)); - } - [Fact] public void ShouldNotHandleMessage() { @@ -147,12 +139,6 @@ protected override void Given() _middlewareMap.Add(_queue.QueueName, middleware); } - [Fact] - public void ShouldDeserializeMessage() - { - _serializationRegister.Received(1).DeserializeMessage(Arg.Is(x => x == _sqsMessage.Body)); - } - [Fact] public void ShouldDeleteMessageIfHandledSuccessfully() { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs index df73de4f3..a764cf4ed 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs @@ -1,6 +1,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; @@ -12,18 +13,17 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishing : WhenPublishingTestBase { private const string Message = "the_message_in_json"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs index 6c2d3fbd7..3dfc3f032 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs @@ -1,6 +1,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; @@ -15,19 +16,17 @@ public class WhenPublishingAsync : WhenPublishingTestBase private const string MessageAttributeKey = "StringAttribute"; private const string MessageAttributeValue = "StringValue"; private const string MessageAttributeDataType = "String"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); - Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs index 364bf605b..a237f5cd1 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs @@ -1,6 +1,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging.Abstractions; @@ -11,12 +12,12 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncExceptionCanBeHandled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs index e557dbfc9..40aec298b 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs @@ -2,6 +2,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging.Abstractions; @@ -12,12 +13,12 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncExceptionCanBeThrown : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs index bfd59a2c2..401a2e55e 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs @@ -3,6 +3,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; @@ -14,7 +15,6 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private const string MessageId = "TestMessage12345"; @@ -25,7 +25,8 @@ public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For()) + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For()) { MessageResponseLogger = (r, m) => { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs index 98806ebe2..ad942a58e 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs @@ -1,6 +1,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging.Abstractions; @@ -15,18 +16,17 @@ public class MessageWithTypeParameters : Message } private const string Message = "the_message_in_json"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer>(), new MessageCompressionRegistry([])); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 73fa15b6a..7a00f1bce 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,14 +11,14 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishing : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private const string QueueName = "queuename"; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -29,8 +30,9 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(_message, false) - .Returns("serialized_contents"); + // TODO make work + // _messageConverter.Serialize(_message, false) + // .Returns("serialized_contents"); } protected override async Task WhenAsync() diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index 74bff9492..81009b914 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,14 +11,14 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsync : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private const string QueueName = "queuename"; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -29,8 +30,9 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(_message, false) - .Returns("serialized_contents"); + // TODO make work + // _serializationRegister.Serialize(_message, false) + // .Returns("serialized_contents"); } protected override async Task WhenAsync() diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index ce05f5f1a..5ed8e671a 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -3,6 +3,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -14,7 +15,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _testMessage = new() { Content = "Hello" }; private const string QueueName = "queuename"; @@ -27,7 +28,7 @@ public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTest private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()) + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()) { MessageResponseLogger = (r, m) => { @@ -46,8 +47,9 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(_testMessage, false) - .Returns("serialized_contents"); + // TODO make work + // _serializationRegister.Serialize(_testMessage, false) + // .Returns("serialized_contents"); Sqs.SendMessageAsync(Arg.Any()) .Returns(PublishResult); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index d4719cac6..8b0f27102 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessage : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); private const string Url = "https://testurl.com/" + QueueName; private readonly SimpleMessage _message = new(); @@ -23,7 +24,7 @@ public class WhenPublishingDelayedMessage : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index fbb28a4d0..eaef79855 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new(); private readonly PublishMetadata _metadata = new() @@ -21,7 +22,7 @@ public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs b/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs index e06e196b3..842f0e088 100644 --- a/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs +++ b/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs @@ -30,4 +30,4 @@ protected override SqsReadConfiguration CreateSystemUnderTest() PublishEndpoint = null }; } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs index aea392fd2..d3277a582 100644 --- a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs +++ b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs @@ -40,13 +40,7 @@ public void ShouldResolveIMessageSerializationFactoryToNewtonsoftSerializationFa { _sut.ResolveService().ShouldBeOfType(); } - - [Fact] - public void ShouldResolveIMessageSerializationRegisterToMessageSerializationRegister() - { - _sut.ResolveService().ShouldBeOfType(); - } - + [Fact] public void ShouldResolveIMessageSubjectProviderToNonGenericMessageSubjectProvider() { diff --git a/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj b/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj index d79b10b5d..2f397a91d 100644 --- a/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj +++ b/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs index e23cee990..41a3f9792 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs @@ -51,10 +51,8 @@ protected virtual void Given() private JustSaying.JustSayingBus CreateSystemUnderTest() { - var serializerRegister = new FakeSerializationRegister(); var messageReceivePauseSignal = new MessageReceivePauseSignal(); var bus = new JustSaying.JustSayingBus(Config, - serializerRegister, messageReceivePauseSignal, LoggerFactory, Monitor); diff --git a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs index d89376f0a..b3601052e 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs @@ -35,6 +35,6 @@ protected virtual void Given() private JustSaying.JustSayingBus CreateSystemUnderTest() { - return new JustSaying.JustSayingBus(Config, null, new MessageReceivePauseSignal(), LoggerFactory, null); + return new JustSaying.JustSayingBus(Config, new MessageReceivePauseSignal(), LoggerFactory, null); } } diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs index ce6ae44a2..cfadc0392 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs @@ -1,4 +1,8 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; using Newtonsoft.Json; @@ -36,8 +40,18 @@ protected override async Task WhenAsync() SystemUnderTest.AddMessageMiddleware(_queue1.QueueName, new InspectableMiddleware()); - SystemUnderTest.AddQueue("groupA", _queue1); - SystemUnderTest.AddQueue("groupB", _queue2); + var messageConverter1 = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter2 = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + SystemUnderTest.AddQueue("groupA", new SqsSource + { + SqsQueue = _queue1, + MessageConverter = messageConverter1 + }); + SystemUnderTest.AddQueue("groupB", new SqsSource + { + SqsQueue = _queue2, + MessageConverter = messageConverter2 + }); _cts = new CancellationTokenSource(); _cts.CancelAfter(TimeSpan.FromSeconds(5)); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs index 0e0766d7d..fa4d664c6 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs @@ -1,10 +1,12 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Dispatch; using JustSaying.Messaging.Channels.Multiplexer; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.Messaging.Monitoring; @@ -317,7 +319,7 @@ public void SubscriptionGroup_StartingTwice_ShouldReturnSameCompletionTask() cts.Cancel(); } - private static FakeSqsQueue TestQueue(Action spy = null) + private static SqsSource TestQueue(Action spy = null) { IEnumerable GetMessages(CancellationToken cancellationToken) { @@ -329,11 +331,17 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - return new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))); + var source = new SqsSource + { + SqsQueue =new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))), + MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer<>()) + }; + + return ; } private MessageReceiveBuffer CreateMessageReceiveBuffer( - ISqsQueue sqsQueue, + SqsSource sqsQueue, int prefetch = 10, int receiveBufferSize = 10) { @@ -356,7 +364,7 @@ private MultiplexerSubscriber CreateSubscriber(IMessageDispatcher dispatcher) } private ISubscriptionGroup CreateSubscriptionGroup( - IList queues, + IList queues, IMessageDispatcher dispatcher) { var defaults = new SubscriptionGroupSettingsBuilder(); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs index 99f1a8b12..5856cb160 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs @@ -5,34 +5,34 @@ namespace JustSaying.UnitTests.Messaging.Channels.TestHelpers; -public class FakeSerializationRegister : IMessageSerializationRegister -{ - public Func DefaultDeserializedMessage { get; set; } - - public IList ReceivedDeserializationRequests { get; } - - public FakeSerializationRegister() - { - var defaultMessage = new SimpleMessage - { - RaisingComponent = "Component", - Id = Guid.NewGuid() - }; - DefaultDeserializedMessage = () => defaultMessage; - ReceivedDeserializationRequests = new List(); - } - - public MessageWithAttributes DeserializeMessage(string body) - { - ReceivedDeserializationRequests.Add(body); - return new MessageWithAttributes(DefaultDeserializedMessage(), new MessageAttributes()); - } - - public string Serialize(Message message, bool serializeForSnsPublishing) - { - return ""; - } - - public void AddSerializer() where T : Message - { } -} \ No newline at end of file +// public class FakeSerializationRegister : IMessageSerializationRegister +// { +// public Func DefaultDeserializedMessage { get; set; } +// +// public IList ReceivedDeserializationRequests { get; } +// +// public FakeSerializationRegister() +// { +// var defaultMessage = new SimpleMessage +// { +// RaisingComponent = "Component", +// Id = Guid.NewGuid() +// }; +// DefaultDeserializedMessage = () => defaultMessage; +// ReceivedDeserializationRequests = new List(); +// } +// +// public Message DeserializeMessage(string body) +// { +// ReceivedDeserializationRequests.Add(body); +// return DefaultDeserializedMessage(); +// } +// +// public string Serialize(Message message, bool serializeForSnsPublishing) +// { +// return ""; +// } +// +// public void AddSerializer() where T : Message +// { } +// } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index 764dc8228..5b4cd2924 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -1,7 +1,9 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; @@ -40,15 +42,24 @@ public async Task Add_Different_Handler_Per_Queue() var middleware1 = new InspectableMiddleware(); var middleware2 = new InspectableMiddleware(); + var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); bus.AddMessageMiddleware(queueName1, middleware1); bus.AddMessageMiddleware(queueName2, middleware2); - ISqsQueue queue1 = TestQueue(bus.SerializationRegister, queueName1); - ISqsQueue queue2 = TestQueue(bus.SerializationRegister, queueName2); + ISqsQueue queue1 = TestQueue(queueName1); + ISqsQueue queue2 = TestQueue(queueName2); - bus.AddQueue(group1, queue1); - bus.AddQueue(group2, queue2); + bus.AddQueue(group1, new SqsSource + { + SqsQueue = queue1, + MessageConverter = messageConverter + }); + bus.AddQueue(group2, new SqsSource + { + SqsQueue = queue2, + MessageConverter = messageConverter + }); using var cts = new CancellationTokenSource(); @@ -81,11 +92,8 @@ await Patiently.AssertThatAsync(_outputHelper, private JustSaying.JustSayingBus CreateBus() { var config = Substitute.For(); - var serializationRegister = new MessageSerializationRegister( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - var bus = new JustSaying.JustSayingBus(config, serializationRegister, MessageReceivePauseSignal, LoggerFactory, MessageMonitor); + var bus = new JustSaying.JustSayingBus(config, MessageReceivePauseSignal, LoggerFactory, MessageMonitor); var defaultSubscriptionSettings = new SubscriptionGroupSettingsBuilder() .WithDefaultMultiplexerCapacity(1) @@ -98,8 +106,8 @@ private JustSaying.JustSayingBus CreateBus() return bus; } + // TODO remove redundant code private static FakeSqsQueue TestQueue( - IMessageSerializationRegister messageSerializationRegister, string queueName, Action spy = null) { @@ -110,7 +118,12 @@ private static FakeSqsQueue TestQueue( var messages = new List { - new TestMessage { Body = messageSerializationRegister.Serialize(message, false) }, + new TestMessage { Body = """ + { + "Subject": "TestJustSayingMessage", + "Message": "{\"QueueName\":\"queue1\"}" + } + """ }, }; var queue = new FakeSqsQueue(async ct => diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 2a9d1487c..2df6604a3 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.Compression; @@ -20,7 +21,6 @@ public abstract class BaseSubscriptionGroupTests : IAsyncLifetime protected IList Queues; protected MiddlewareMap MiddlewareMap; protected TrackingLoggingMonitor Monitor; - protected FakeSerializationRegister SerializationRegister; protected int ConcurrencyLimit = 8; protected ITestOutputHelper OutputHelper { get; } @@ -54,7 +54,6 @@ private void GivenInternal() Queues = new List(); Handler = new InspectableHandler(); Monitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger()); - SerializationRegister = new FakeSerializationRegister(); MiddlewareMap = new MiddlewareMap(); CompletionMiddleware = new AwaitableMiddleware(OutputHelper); @@ -99,11 +98,9 @@ protected virtual bool Until() private ISubscriptionGroup CreateSystemUnderTest() { - Logger.LogInformation("Creating MessageDispatcher with serialization register type {Type}", - SerializationRegister.GetType().FullName); + Logger.LogInformation("Creating MessageDispatcher"); var dispatcher = new MessageDispatcher( - SerializationRegister, Monitor, MiddlewareMap, new MessageCompressionRegistry([]), @@ -127,7 +124,7 @@ protected virtual Dictionary SetupBusCon { return new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(Queues) }, + ["test"] = new SubscriptionGroupConfigBuilder("test").AddQueues(Queues) }; } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs index 5565d62c6..66ea93677 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs @@ -65,7 +65,13 @@ public void ProcessingIsPassedToTheHandler() [Fact] public void MessageIsLocked() { - var messageId = SerializationRegister.DefaultDeserializedMessage().Id.ToString(); + // this should be part of setup to make work + var message = new SimpleMessage + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }; + var messageId = message.Id.ToString(); var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent); tempLockRequests.Count().ShouldBeGreaterThan(0); @@ -73,4 +79,4 @@ public void MessageIsLocked() pair.key.Contains(messageId, StringComparison.OrdinalIgnoreCase) && pair.howLong == TimeSpan.FromSeconds(_expectedTimeout)); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs index 603fd35f1..fad1b2045 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs @@ -56,7 +56,13 @@ await Patiently.AssertThatAsync(OutputHelper, [Fact] public void MessageIsLocked() { - var messageId = SerializationRegister.DefaultDeserializedMessage().Id.ToString(); + // this should be part of setup to make work + var message = new SimpleMessage + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }; + var messageId = message.Id.ToString(); var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent); tempLockRequests.ShouldNotBeEmpty(); @@ -67,4 +73,4 @@ public void MessageIsLocked() ((int)lockRequest.howLong.TotalSeconds).ShouldBe(_maximumTimeout); } } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs index a6bae46c6..5e12f67e5 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs @@ -60,7 +60,7 @@ public void TheMaxMessageAllowanceIsGrabbed() [Fact] public void MessageIsProcessed() { - SerializationRegister.ReceivedDeserializationRequests.ShouldContain(AttributeMessageContentsRunning); - SerializationRegister.ReceivedDeserializationRequests.ShouldNotContain(AttributeMessageContentsAfterStop); + // TODO + throw new NotImplementedException(); } } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs index 42de3f984..da3cdcefb 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs @@ -25,14 +25,18 @@ protected override void Given() [Fact] public void MessagesGetDeserializedByCorrectHandler() { - SerializationRegister.ReceivedDeserializationRequests.ShouldAllBe( - msg => msg == MessageBody); + // SerializationRegister.ReceivedDeserializationRequests.ShouldAllBe( + // msg => msg == MessageBody); + // TODO + throw new NotImplementedException(); } [Fact] public void ProcessingIsPassedToTheHandlerForCorrectMessage() { - Handler.ReceivedMessages.ShouldContain(SerializationRegister.DefaultDeserializedMessage()); + //Handler.ReceivedMessages.ShouldContain(SerializationRegister.DefaultDeserializedMessage()); + // TODO + throw new NotImplementedException(); } [Fact] diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs index d17b64fca..28514a11c 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs @@ -26,8 +26,8 @@ IEnumerable GetMessages(CancellationToken cancellationToken) Queues.Add(_queue); - SerializationRegister.DefaultDeserializedMessage = () => - throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + // TODO throw exception during deserialization + throw new NotImplementedException(); } protected override bool Until() @@ -41,4 +41,4 @@ public async Task TheListenerDoesNotDie() await Patiently.AssertThatAsync(OutputHelper, () => _callCount.ShouldBeGreaterThan(1)); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs index 22c59d168..3800e2b9a 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs @@ -14,8 +14,7 @@ protected override void Given() _queue = CreateSuccessfulTestQueue("TestQueue", ExceptionOnFirstCall()); Queues.Add(_queue); - SerializationRegister.DefaultDeserializedMessage = - () => throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + // setup deserializer failure } private IEnumerable ExceptionOnFirstCall() @@ -39,4 +38,4 @@ public void QueueIsPolledMoreThanOnce() { _callCount.ShouldBeGreaterThan(1); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs index 093955b68..f6cdf33f8 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs @@ -39,7 +39,11 @@ protected override void Given() [Fact] public void HandlerReceivesMessage() { - Handler.ReceivedMessages.Contains(SerializationRegister.DefaultDeserializedMessage()) + Handler.ReceivedMessages.Contains(new SimpleMessage + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }) .ShouldBeTrue(); } @@ -49,26 +53,25 @@ private static ReceiveMessageResponse GenerateResponseMessages( { return new ReceiveMessageResponse { - Messages = new List - { - new() + Messages = + [ + new Message { MessageId = messageId.ToString(), Body = SqsMessageBody(messageType) }, - new() + new Message { MessageId = messageId.ToString(), - Body = "{\"Subject\":\"SOME_UNKNOWN_MESSAGE\"," + - "\"Message\":\"SOME_RANDOM_MESSAGE\"}" + Body = """{"Subject":"SOME_UNKNOWN_MESSAGE","Message":"SOME_RANDOM_MESSAGE"}""" } - } + ] }; } private static string SqsMessageBody(string messageType) { - return "{\"Subject\":\"" + messageType + "\"," + "\"Message\":\"" + MessageBody + "\"}"; + return $$"""{"Subject":"{{messageType}}","Message":"{{MessageBody}}"}"""; } public void Dispose() diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs deleted file mode 100644 index a135206bb..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs +++ /dev/null @@ -1,7 +0,0 @@ -using JustSaying.Models; - -namespace JustSaying.UnitTests.Messaging.Serialization.SerializationRegister; - -public class CustomMessage : Message -{ -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs deleted file mode 100644 index 71266c68b..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs +++ /dev/null @@ -1,29 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; - -namespace JustSaying.UnitTests.Messaging.Serialization.SerializationRegister; - -public class WhenAddingASerializerTwice : XBehaviourTest -{ - protected override MessageSerializationRegister CreateSystemUnderTest() => - new( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - - protected override void Given() - { - RecordAnyExceptionsThrown(); - } - - protected override void WhenAction() - { - SystemUnderTest.AddSerializer(); - SystemUnderTest.AddSerializer(); - } - - [Fact] - public void ExceptionIsNotThrown() - { - ThrownException.ShouldBeNull(); - } -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs deleted file mode 100644 index 9a46693a6..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs +++ /dev/null @@ -1,28 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; - -namespace JustSaying.UnitTests.Messaging.Serialization.SerializationRegister; - -public class WhenDeserializingMessage : XBehaviourTest -{ - protected override MessageSerializationRegister CreateSystemUnderTest() => - new( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - - private string messageBody = "{'Subject':'nonexistent'}"; - protected override void Given() - { - RecordAnyExceptionsThrown(); - } - - protected override void WhenAction() - { - SystemUnderTest.AddSerializer(); - } - - [Fact] - public void ThrowsMessageFormatNotSupportedWhenMessabeBodyIsUnserializable() - { - Assert.Throws(() => SystemUnderTest.DeserializeMessage(messageBody)); - } -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/XBehaviourTest.cs b/tests/JustSaying.UnitTests/XBehaviourTest.cs index 42d8273aa..0b166f6e5 100644 --- a/tests/JustSaying.UnitTests/XBehaviourTest.cs +++ b/tests/JustSaying.UnitTests/XBehaviourTest.cs @@ -43,4 +43,4 @@ protected void RecordAnyExceptionsThrown() } protected abstract void WhenAction(); -} \ No newline at end of file +} From 4d732a0ed3236e81c687e4bbb730df10d3a70351 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 26 Aug 2024 11:01:57 +0100 Subject: [PATCH 24/41] More compression work --- .../IServiceCollectionExtensions.cs | 3 +- .../JustSayingRegistry.cs | 3 +- .../MessageHandling/IMessageConverter.cs | 8 +- ...onverter.cs => PublishMessageConverter.cs} | 156 +++++++------ .../MessageHandling/SnsMessagePublisher.cs | 12 +- .../MessageHandling/SqsMessagePublisher.cs | 6 +- .../MessageHandling/SqsQueueReader.cs | 4 +- .../QueueCreation/SqsBasicConfiguration.cs | 20 +- .../QueueCreation/SqsWriteConfiguration.cs | 10 +- .../StaticPublicationConfiguration.cs | 10 +- .../QueueAddressPublicationBuilder`1.cs | 12 +- .../QueueAddressSubscriptionBuilder`1.cs | 7 +- .../Fluent/QueuePublicationBuilder`1.cs | 11 +- .../Fluent/QueueSubscriptionBuilder`1.cs | 2 +- .../ServiceResolver/DefaultServiceResolver.cs | 9 +- .../TopicAddressPublicationBuilder`1.cs | 14 +- .../Fluent/TopicAddressPublisher.cs | 2 +- .../Fluent/TopicSubscriptionBuilder`1.cs | 5 +- src/JustSaying/JustSayingBus.cs | 2 + .../Channels/Context/IQueueMessageContext.cs | 2 +- .../Channels/Context/QueueMessageContext.cs | 4 +- .../SubscriptionGroupSettings.cs | 2 +- .../IMessageSerialiser.cs | 36 +-- .../IMessageSerializationFactory.cs | 4 +- .../MessageSerializationRegister.cs | 78 ------- .../NewtonsoftSerializationFactory.cs | 11 +- .../NewtonsoftSerializer.cs | 88 +------- .../MessageSerialization/ReceivedMessage.cs | 4 +- .../SystemTextJsonSerializationFactory.cs | 22 +- .../SystemTextJsonSerializer.cs | 202 ++++++++--------- .../MessageSerialization/TypeSerializer.cs | 8 - ...essageIsPublishedToAQueueWithAttributes.cs | 2 +- ...ssageIsPublishedToAQueueWithCompression.cs | 2 +- ...geIsPublishedToAQueueWithSystemTextJson.cs | 4 +- ...essageIsPublishedToATopicWithAttributes.cs | 2 +- ...geIsPublishedToATopicWithSystemTextJson.cs | 2 +- .../WhenAMessageIsPublishedWithCompression.cs | 2 +- ...henHandlingAMessageWithBinaryAttributes.cs | 2 +- ...henHandlingAMessageWithStringAttributes.cs | 2 +- .../AwsFactAttribute.cs | 1 - .../MessageCompressionUtilityTests.cs | 210 +++++++++--------- .../WhenDispatchingCompressedMessage.cs | 2 +- .../WhenDispatchingMessage.cs | 4 +- .../Sns/TopicByName/WhenPublishing.cs | 4 +- .../Sns/TopicByName/WhenPublishingAsync.cs | 3 +- ...henPublishingAsyncExceptionCanBeHandled.cs | 2 +- ...WhenPublishingAsyncExceptionCanBeThrown.cs | 2 +- ...enPublishingAsyncResponseLoggerIsCalled.cs | 2 +- ...gAsyncWithGenericMessageSubjectProvider.cs | 8 +- .../MessageHandling/Sqs/WhenPublishing.cs | 16 +- .../Sqs/WhenPublishingAsync.cs | 16 +- ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 4 +- .../Sqs/WhenPublishingDelayedMessage.cs | 4 +- .../Sqs/WhenPublishingDelayedMessageAsync.cs | 4 +- .../Fluent/WhenUsingDefaultServiceResolver.cs | 12 +- .../WhenRegisteringMessageHandlers.cs | 12 +- .../WhenRegisteringSubscribers.cs | 4 +- .../Messaging/Channels/ChannelsTests.cs | 22 +- .../Messaging/Channels/ErrorHandlingTests.cs | 20 +- .../Fakes/FakeSerializationRegister.cs | 44 +--- .../WhenReceivingShouldStop.cs | 16 +- .../WhenSqsIsSlow.cs | 18 +- .../WhenSubscriberIsSlow.cs | 16 +- .../WhenThereAreNoSubscribers.cs | 16 +- .../SubscriptionGroupCollectionTests.cs | 14 +- .../BaseSubscriptionGroupTests.cs | 31 ++- .../WhenExactlyOnceIsAppliedToHandler.cs | 5 +- ...sAppliedToHandlerWithoutExplicitTimeout.cs | 5 +- .../WhenListeningStartsAndStops.cs | 6 +- .../WhenListeningWithMultipleGroups.cs | 6 +- .../WhenMessageHandlingFails.cs | 9 +- .../WhenMessageHandlingSucceeds.cs | 7 +- .../WhenMessageHandlingThrows.cs | 7 +- ...enThereAreExceptionsInMessageProcessing.cs | 23 +- .../WhenThereAreExceptionsInSqsCalling.cs | 5 +- .../WhenUsingSqsQueueByName.cs | 23 +- .../Messaging/Policies/ChannelPolicyTests.cs | 13 +- ...alingWithPotentiallyMissingConversation.cs | 10 +- .../Newtonsoft/WhenAskingForANewSerializer.cs | 41 ++-- .../WhenSerializingAndDeserializing.cs | 10 +- .../Newtonsoft/WhenUsingCustomSettings.cs | 10 +- ...alingWithPotentiallyMissingConversation.cs | 8 +- .../WhenAskingForANewSerializer.cs | 40 ++-- .../WhenSerializingAndDeserializing.cs | 8 +- .../SystemTextJson/WhenUsingCustomSettings.cs | 10 +- 85 files changed, 717 insertions(+), 811 deletions(-) rename src/JustSaying/AwsTools/MessageHandling/{MessageConverter.cs => PublishMessageConverter.cs} (81%) delete mode 100644 src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs delete mode 100644 src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index 6c8a6ecee..16ce30846 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -136,7 +136,8 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService()); services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService()); - services.TryAddSingleton(); + // TODO + //services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index a418ec9c3..323e25e1e 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -32,7 +32,8 @@ public JustSayingRegistry() For().Use((p) => new AwsClientFactoryProxy(p.GetInstance)).Singleton(); For().Use().Singleton(); For().Use().Singleton(); - For().Use().Singleton(); + // TODO + //For().Use().Singleton(); For().Use().Singleton(); For().Use().Singleton(); diff --git a/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs index e522e13aa..5597d81cc 100644 --- a/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs @@ -4,8 +4,12 @@ namespace JustSaying.Messaging; -public interface IMessageConverter +public interface IPublishMessageConverter +{ + PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); +} + +public interface IReceivedMessageConverter { ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message); - MessageForPublishing ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); } diff --git a/src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs similarity index 81% rename from src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs rename to src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs index 6eb365a49..d0557d4c2 100644 --- a/src/JustSaying/AwsTools/MessageHandling/MessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs @@ -10,12 +10,12 @@ namespace JustSaying.Messaging; -internal sealed class MessageConverter : IMessageConverter +internal sealed class ReceivedMessageConverter : IReceivedMessageConverter { private readonly IMessageBodySerializer _bodySerializer; private readonly MessageCompressionRegistry _compressionRegistry; - public MessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry) + public ReceivedMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry) { _bodySerializer = bodySerializer; _compressionRegistry = compressionRegistry; @@ -25,13 +25,13 @@ public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) { string body = message.Body; var attributes = GetMessageAttributes(message, body); - bool isRawMessage = IsRawMessage(body); - if (!isRawMessage) + //bool isRawMessage = IsRawMessage(body); + if (body is not null) // TODO { var jsonNode = JsonNode.Parse(body); if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) { - body = messageNode!.GetValue(); + body = messageNode!.ToString(); } } body = ApplyBodyDecompression(body, attributes); @@ -39,72 +39,6 @@ public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) return new ReceivedMessage(result, attributes); } - public MessageForPublishing ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType) - { - var messageBody = _bodySerializer.Serialize(message); - - Dictionary attributeValues = new(); - AddMessageAttributes(attributeValues, publishMetadata); - - (string compressedMessage, string contentEncoding) = CompressMessageBody(messageBody, publishMetadata, PublishDestinationType.Queue, new PublishCompressionOptions() /* TODO */, _compressionRegistry); - if (compressedMessage is not null) - { - messageBody = compressedMessage; - attributeValues.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); - } - - string subject = null; - if (destinationType == PublishDestinationType.Topic) - { - // TODO - subject = null; - } - - return new MessageForPublishing(messageBody, attributeValues, subject); - } - - private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) - { - if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) - { - return; - } - - foreach (var attribute in metadata.MessageAttributes) - { - requestMessageAttributes.Add(attribute.Key, attribute.Value); - } - } - - - private static bool IsRawMessage(string body) - { - if (body is null) - { - return true; - } - - try - { - var isRawMessage = true; - using var jsonDocument = JsonDocument.Parse(body); - if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) - { - string messageType = typeElement.GetString(); - if (messageType is "Notification") - { - isRawMessage = false; - } - } - - return isRawMessage; - } - catch - { - return true; - } - } - private string ApplyBodyDecompression(string body, MessageAttributes attributes) { var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); @@ -124,8 +58,8 @@ private string ApplyBodyDecompression(string body, MessageAttributes attributes) private static MessageAttributes GetMessageAttributes(Amazon.SQS.Model.Message message, string body) { - bool isRawMessage = IsRawMessage(body); - var attributes = isRawMessage ? GetRawMessageAttributes(message) : GetMessageAttributes(body); + bool isSnsPayload = IsSnsPayload(body); + var attributes = isSnsPayload ? GetMessageAttributes(body) : GetRawMessageAttributes(message); return attributes; } @@ -183,6 +117,80 @@ private static MessageAttributes GetRawMessageAttributes(Amazon.SQS.Model.Messag return new MessageAttributes(rawAttributes); } + private static bool IsSnsPayload(string body) + { + if (body is null) + { + return false; + } + + try + { + var isSnsPayload = false; + using var jsonDocument = JsonDocument.Parse(body); + if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) + { + string messageType = typeElement.GetString(); + if (messageType is "Notification") + { + isSnsPayload = true; + } + } + + return isSnsPayload; + } + catch + { + return false; + } + } +} + +internal sealed class PublishMessageConverter : IPublishMessageConverter +{ + private readonly IMessageBodySerializer _bodySerializer; + private readonly MessageCompressionRegistry _compressionRegistry; + private readonly PublishCompressionOptions _compressionOptions; + private readonly string _snsSubject; + + public PublishMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions, string snsSubject) + { + _bodySerializer = bodySerializer; + _compressionRegistry = compressionRegistry; + _compressionOptions = compressionOptions; + _snsSubject = snsSubject; + } + + public PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType) + { + var messageBody = _bodySerializer.Serialize(message); + + Dictionary attributeValues = new(); + AddMessageAttributes(attributeValues, publishMetadata); + + (string compressedMessage, string contentEncoding) = CompressMessageBody(messageBody, publishMetadata, destinationType, _compressionOptions, _compressionRegistry); + if (compressedMessage is not null) + { + messageBody = compressedMessage; + attributeValues.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + } + + return new PublishMessage(messageBody, attributeValues, _snsSubject); + } + + private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) + { + if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + { + return; + } + + foreach (var attribute in metadata.MessageAttributes) + { + requestMessageAttributes.Add(attribute.Key, attribute.Value); + } + } + /// /// Compresses a message if it meets the specified compression criteria. /// @@ -192,7 +200,7 @@ private static MessageAttributes GetRawMessageAttributes(Amazon.SQS.Model.Messag /// Options specifying when and how to compress. /// Registry of available compression algorithms. /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). - public static (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) + private static (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) { string contentEncoding = null; string compressedMessage = null; diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 5c537e6bb..442a6fa34 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -2,7 +2,6 @@ using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; using JustSaying.Messaging; -using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; @@ -13,17 +12,15 @@ namespace JustSaying.AwsTools.MessageHandling; internal class SnsMessagePublisher( IAmazonSimpleNotificationService client, - IMessageConverter messageConverter, + IPublishMessageConverter messageConverter, ILoggerFactory loggerFactory, IMessageSubjectProvider messageSubjectProvider, Func handleException = null) : IMessagePublisher, IInterrogable { - private readonly IMessageConverter _messageConverter = messageConverter; + private readonly IPublishMessageConverter _messageConverter = messageConverter; private readonly IMessageSubjectProvider _messageSubjectProvider = messageSubjectProvider; private readonly Func _handleException = handleException; public Action MessageResponseLogger { get; set; } - public PublishCompressionOptions CompressionOptions { get; set; } - internal MessageCompressionRegistry CompressionRegistry { get; set; } public string Arn { get; internal set; } protected IAmazonSimpleNotificationService Client { get; } = client; private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); @@ -31,7 +28,7 @@ internal class SnsMessagePublisher( public SnsMessagePublisher( string topicArn, IAmazonSimpleNotificationService client, - IMessageConverter messageConverter, + IPublishMessageConverter messageConverter, ILoggerFactory loggerFactory, IMessageSubjectProvider messageSubjectProvider, Func handleException = null) @@ -97,9 +94,6 @@ private PublishRequest BuildPublishRequest(Message message, PublishMetadata meta { var (messageToSend, attributes, subject) = _messageConverter.ConvertForPublish(message, metadata, PublishDestinationType.Topic); - // TODO - //var messageType = _messageSubjectProvider.GetSubjectForType(message.GetType()); - var request = new PublishRequest { TopicArn = Arn, diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index f9c68d36a..dcf5c91a8 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -13,20 +13,18 @@ namespace JustSaying.AwsTools.MessageHandling; internal class SqsMessagePublisher( IAmazonSQS client, - MessageConverter messageConverter, + PublishMessageConverter messageConverter, ILoggerFactory loggerFactory) : IMessagePublisher { private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); - internal MessageCompressionRegistry CompressionRegistry { get; set; } public Action MessageResponseLogger { get; set; } - public PublishCompressionOptions CompressionOptions { get; set; } public Uri QueueUrl { get; internal set; } public SqsMessagePublisher( Uri queueUrl, IAmazonSQS client, - MessageConverter messageConverter, + PublishMessageConverter messageConverter, ILoggerFactory loggerFactory) : this(client, messageConverter, loggerFactory) { QueueUrl = queueUrl; diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs b/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs index b3ab35181..0b194ac9d 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs @@ -7,9 +7,9 @@ namespace JustSaying.AwsTools.MessageHandling; internal class SqsQueueReader { private readonly ISqsQueue _sqsQueue; - private readonly IMessageConverter _messageConverter; + private readonly IReceivedMessageConverter _messageConverter; - internal SqsQueueReader(ISqsQueue sqsQueue, IMessageConverter messageConverter) + internal SqsQueueReader(ISqsQueue sqsQueue, IReceivedMessageConverter messageConverter) { _sqsQueue = sqsQueue; _messageConverter = messageConverter; diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs index fc1a4a5c2..e776c45bd 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs @@ -6,14 +6,13 @@ namespace JustSaying.AwsTools.QueueCreation; public class SqsBasicConfiguration { - public TimeSpan MessageRetention { get; set; } - public TimeSpan ErrorQueueRetentionPeriod { get; set; } - public TimeSpan VisibilityTimeout { get; set; } - public TimeSpan DeliveryDelay { get; set; } - public int RetryCountBeforeSendingToErrorQueue { get; set; } + public TimeSpan MessageRetention { get; set; } = JustSayingConstants.DefaultRetentionPeriod; + public TimeSpan ErrorQueueRetentionPeriod { get; set; } = JustSayingConstants.MaximumRetentionPeriod; + public TimeSpan VisibilityTimeout { get; set; } = JustSayingConstants.DefaultVisibilityTimeout; + public TimeSpan DeliveryDelay { get; set; } = JustSayingConstants.MinimumDeliveryDelay; + public int RetryCountBeforeSendingToErrorQueue { get; set; } = JustSayingConstants.DefaultHandlerRetryCount; public bool ErrorQueueOptOut { get; set; } public ServerSideEncryption ServerSideEncryption { get; set; } - public PublishCompressionOptions CompressionOptions { get; set; } public string QueueName { get; set; } public void ApplyQueueNamingConvention(IQueueNamingConvention namingConvention) @@ -21,15 +20,6 @@ public void ApplyQueueNamingConvention(IQueueNamingConvention namingConventio QueueName = namingConvention.Apply(QueueName); } - public SqsBasicConfiguration() - { - MessageRetention = JustSayingConstants.DefaultRetentionPeriod; - ErrorQueueRetentionPeriod = JustSayingConstants.MaximumRetentionPeriod; - VisibilityTimeout = JustSayingConstants.DefaultVisibilityTimeout; - RetryCountBeforeSendingToErrorQueue = JustSayingConstants.DefaultHandlerRetryCount; - DeliveryDelay = JustSayingConstants.MinimumDeliveryDelay; - } - public void Validate() { if (MessageRetention < JustSayingConstants.MinimumRetentionPeriod || diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs index c3ffd0c98..cfc4d0eef 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs @@ -1,12 +1,8 @@ +using JustSaying.AwsTools.MessageHandling; + namespace JustSaying.AwsTools.QueueCreation; public class SqsWriteConfiguration : SqsBasicConfiguration { - public SqsWriteConfiguration() - { - MessageRetention = JustSayingConstants.DefaultRetentionPeriod; - ErrorQueueRetentionPeriod = JustSayingConstants.MaximumRetentionPeriod; - VisibilityTimeout = JustSayingConstants.DefaultVisibilityTimeout; - RetryCountBeforeSendingToErrorQueue = JustSayingConstants.DefaultHandlerRetryCount; - } + public PublishCompressionOptions CompressionOptions { get; set; } } diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index 7318bf89e..c6a0f1abc 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -33,16 +33,18 @@ public static StaticPublicationConfiguration Build( readConfiguration.ApplyTopicNamingConvention(bus.Config.TopicNamingConvention); + var compressionOptions = writeConfiguration.CompressionOptions ?? bus.Config.DefaultCompressionOptions; + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = subjectProvider.GetSubjectForType(typeof(T)); + var eventPublisher = new SnsMessagePublisher( snsClient, - // TODO fix this properly - new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), + new PublishMessageConverter(serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject), loggerFactory, bus.Config.MessageSubjectProvider) { MessageResponseLogger = bus.Config.MessageResponseLogger, - CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = writeConfiguration.CompressionOptions ?? bus.Config.DefaultCompressionOptions }; var snsTopic = new SnsTopicByName( diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index 30c4fe2f6..1f4b0ec3a 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -50,19 +50,19 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa logger.LogInformation("Adding SQS publisher for message type '{MessageType}'", typeof(T)); var config = bus.Config; - //bus.SerializationRegister.AddSerializer(); + var compressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions; + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = subjectProvider.GetSubjectForType(typeof(T)); var eventPublisher = new SqsMessagePublisher( _queueAddress.QueueUrl, proxy.GetAwsClientFactory().GetSqsClient(RegionEndpoint.GetBySystemName(_queueAddress.RegionName)), - new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), + new PublishMessageConverter(bus.MessageBodySerializerFactory.GetSerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject), loggerFactory) { - MessageResponseLogger = config.MessageResponseLogger, - CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions + MessageResponseLogger = config.MessageResponseLogger }; - CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, compressionOptions); bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs index 50637d375..a5e0c7d3b 100644 --- a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs @@ -1,7 +1,6 @@ using Amazon; using Amazon.SQS; using JustSaying.AwsTools; -using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; using JustSaying.Messaging; using JustSaying.Messaging.Channels.SubscriptionGroups; @@ -68,8 +67,6 @@ public ISubscriptionBuilder WithMessageBodySerializer(IMessageBodySerializer return this; } - - /// void ISubscriptionBuilder.Configure( JustSayingBus bus, @@ -94,7 +91,9 @@ void ISubscriptionBuilder.Configure( attachedQueueConfig.SubscriptionGroupName ??= queue.QueueName; attachedQueueConfig.Validate(); - var sqsSource = new SqsSource { SqsQueue = queue, MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])) }; + var serializer = MessageBodySerializer ?? bus.MessageBodySerializerFactory.GetSerializer(); + var messageConverter = new ReceivedMessageConverter(serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()])); + var sqsSource = new SqsSource { SqsQueue = queue, MessageConverter = messageConverter }; bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, sqsSource); diff --git a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs index e37728085..6854674ed 100644 --- a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs @@ -105,14 +105,17 @@ void IPublicationBuilder.Configure( var regionEndpoint = RegionEndpoint.GetBySystemName(region); var sqsClient = proxy.GetAwsClientFactory().GetSqsClient(regionEndpoint); + var compressionRegistry = bus.CompressionRegistry; + var compressionOptions = writeConfiguration.CompressionOptions; + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = subjectProvider.GetSubjectForType(typeof(T)); + var eventPublisher = new SqsMessagePublisher( sqsClient, - new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), + new PublishMessageConverter(bus.MessageBodySerializerFactory.GetSerializer(), compressionRegistry, compressionOptions, subject), loggerFactory) { - MessageResponseLogger = config.MessageResponseLogger, - CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = writeConfiguration.CompressionOptions + MessageResponseLogger = config.MessageResponseLogger }; #pragma warning disable 618 diff --git a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs index cf5fdb1f8..275c3f0f0 100644 --- a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs @@ -187,7 +187,7 @@ void ISubscriptionBuilder.Configure( var queue = creator.EnsureQueueExists(region, subscriptionConfig); bus.AddStartupTask(queue.StartupTask); - bus.AddQueue(subscriptionConfig.SubscriptionGroupName, new SqsSource { MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), null), SqsQueue = queue.Queue }); + bus.AddQueue(subscriptionConfig.SubscriptionGroupName, new SqsSource { MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), null), SqsQueue = queue.Queue }); logger.LogInformation( "Created SQS subscriber for message type '{MessageType}' on queue '{QueueName}'.", diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index 15bdea060..dc0ba41d9 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -43,10 +43,11 @@ private object TryResolveService(Type desiredType) { return new NullOpMessageMonitor(); } - else if (desiredType == typeof(IMessageSerializationFactory)) - { - return new NewtonsoftSerializationFactory(); - } + // TODO + // else if (desiredType == typeof(IMessageSerializationFactory)) + // { + // return new NewtonsoftSerializationFactory(); + // } else if (desiredType == typeof(MessageCompressionRegistry)) { return new MessageCompressionRegistry([new GzipMessageBodyCompression()]); diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index f6b67537f..4d2862b5d 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -69,19 +69,23 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa var config = bus.Config; var arn = Arn.Parse(_topicAddress.TopicArn); + var compressionRegistry = bus.CompressionRegistry; + var compressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions; + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = subjectProvider.GetSubjectForType(typeof(T)); + var eventPublisher = new TopicAddressPublisher( proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(arn.Region)), loggerFactory, config.MessageSubjectProvider, - new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])), + new PublishMessageConverter(serializer, compressionRegistry, compressionOptions, subject), _exceptionHandler, _topicAddress) { - MessageResponseLogger = config.MessageResponseLogger, - CompressionRegistry = bus.CompressionRegistry, - CompressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions + MessageResponseLogger = config.MessageResponseLogger }; - CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, eventPublisher.CompressionOptions); + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, compressionOptions); bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/TopicAddressPublisher.cs b/src/JustSaying/Fluent/TopicAddressPublisher.cs index b4454a701..dc2292a73 100644 --- a/src/JustSaying/Fluent/TopicAddressPublisher.cs +++ b/src/JustSaying/Fluent/TopicAddressPublisher.cs @@ -14,7 +14,7 @@ internal sealed class TopicAddressPublisher( IAmazonSimpleNotificationService snsClient, ILoggerFactory loggerFactory, IMessageSubjectProvider subjectProvider, - IMessageConverter messageConverter, + IPublishMessageConverter messageConverter, Func handleException, TopicAddress topicAddress) : SnsMessagePublisher(topicAddress.TopicArn, snsClient, messageConverter, loggerFactory, subjectProvider, handleException) { diff --git a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs index 86cfb7d74..79450e9ae 100644 --- a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs @@ -207,10 +207,13 @@ void ISubscriptionBuilder.Configure( subscriptionConfig); bus.AddStartupTask(queueWithStartup.StartupTask); + var compressionRegistry = bus.CompressionRegistry; + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var sqsSource = new SqsSource { SqsQueue = queueWithStartup.Queue, - MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()])) + MessageConverter = new ReceivedMessageConverter(serializer, compressionRegistry) }; bus.AddQueue(subscriptionConfig.SubscriptionGroupName, sqsSource); diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 4ee108bb1..a0167323e 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -38,6 +38,7 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl internal MiddlewareMap MiddlewareMap { get; } internal MessageCompressionRegistry CompressionRegistry { get; } + internal IMessageBodySerializationFactory MessageBodySerializerFactory { get; set; } public Task Completion { get; private set; } @@ -55,6 +56,7 @@ internal JustSayingBus( Config = config; MiddlewareMap = new MiddlewareMap(); CompressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); + MessageBodySerializerFactory = new NewtonsoftSerializationFactory(); _publishersByType = []; _subscriptionGroupSettings = diff --git a/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs b/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs index 16845e290..cbfd649dd 100644 --- a/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs +++ b/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs @@ -24,5 +24,5 @@ public interface IQueueMessageContext : IMessageVisibilityUpdater, IMessageDelet /// string QueueName { get; } - IMessageConverter MessageConverter { get; } + IReceivedMessageConverter MessageConverter { get; } } diff --git a/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs b/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs index 1aa9a3f8a..a00de5ff9 100644 --- a/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs +++ b/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs @@ -15,7 +15,7 @@ public sealed class QueueMessageContext : IQueueMessageContext /// The to be handled. /// The the message was read from. /// - internal QueueMessageContext(Message message, SqsQueueReader queueReader, IMessageConverter messageConverter) + internal QueueMessageContext(Message message, SqsQueueReader queueReader, IReceivedMessageConverter messageConverter) { Message = message ?? throw new ArgumentNullException(nameof(message)); _queueReader = queueReader ?? throw new ArgumentNullException(nameof(queueReader)); @@ -31,7 +31,7 @@ internal QueueMessageContext(Message message, SqsQueueReader queueReader, IMessa /// public string QueueName => _queueReader.QueueName; - public IMessageConverter MessageConverter { get; } + public IReceivedMessageConverter MessageConverter { get; } /// public async Task UpdateMessageVisibilityTimeout(TimeSpan visibilityTimeout, CancellationToken cancellationToken) diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs index c46288991..08ba289e6 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs @@ -73,5 +73,5 @@ internal SubscriptionGroupSettings( public sealed class SqsSource { public ISqsQueue SqsQueue { get; set; } - public IMessageConverter MessageConverter { get; set; } + public IReceivedMessageConverter MessageConverter { get; set; } } diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs index 2dff9a9f5..607b46996 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs @@ -3,24 +3,24 @@ namespace JustSaying.Messaging.MessageSerialization; -public interface IMessageSerializer -{ - string GetMessageSubject(string sqsMessage); - - Message Deserialize(string message, Type type); - - /// - /// Serializes a message for publishing - /// - /// - /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: - /// new { Subject = subject, Message = serializedMessage }; - /// - /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties - /// - /// - string Serialize(Message message, bool serializeForSnsPublishing, string subject); -} +// public interface IMessageSerializer +// { +// string GetMessageSubject(string sqsMessage); +// +// Message Deserialize(string message, Type type); +// +// /// +// /// Serializes a message for publishing +// /// +// /// +// /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: +// /// new { Subject = subject, Message = serializedMessage }; +// /// +// /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties +// /// +// /// +// string Serialize(Message message, bool serializeForSnsPublishing, string subject); +// } public interface IMessageBodySerializer { diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs index c12b156fa..2e5b8a16e 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs @@ -2,7 +2,7 @@ namespace JustSaying.Messaging.MessageSerialization; -public interface IMessageSerializationFactory +public interface IMessageBodySerializationFactory { - IMessageSerializer GetSerializer() where T : Message; + IMessageBodySerializer GetSerializer() where T : Message; } diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs deleted file mode 100644 index 6bfe0135a..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System.Collections.Concurrent; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -// internal class MessageSerializationRegister : IMessageSerializationRegister -// { -// private readonly IMessageSubjectProvider _messageSubjectProvider; -// private readonly IMessageSerializationFactory _serializationFactory; -// private readonly ConcurrentDictionary> _typeSerializersBySubject = new(StringComparer.OrdinalIgnoreCase); -// private readonly HashSet _messageSerializers = new(); -// -// public MessageSerializationRegister(IMessageSubjectProvider messageSubjectProvider, IMessageSerializationFactory serializationFactory) -// { -// _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); -// _serializationFactory = serializationFactory; -// } -// -// public void AddSerializer() where T : Message -// { -// string key = _messageSubjectProvider.GetSubjectForType(typeof(T)); -// -// var typeSerializer = _typeSerializersBySubject.GetOrAdd(key, -// _ => new Lazy( -// () => new TypeSerializer(typeof(T), _serializationFactory.GetSerializer()) -// ) -// ).Value; -// -// _messageSerializers.Add(typeSerializer.Serializer); -// } -// -// public Message DeserializeMessage(string body) -// { -// // TODO Can we remove this loop rather than try each serializer? -// foreach (var messageSerializer in _messageSerializers) -// { -// string messageSubject = messageSerializer.GetMessageSubject(body); // Custom serializer pulls this from cloud event type -// -// if (string.IsNullOrWhiteSpace(messageSubject)) -// { -// continue; -// } -// -// if (!_typeSerializersBySubject.TryGetValue(messageSubject, out var lazyTypeSerializer)) -// { -// continue; -// } -// -// TypeSerializer typeSerializer = lazyTypeSerializer.Value; -// -// var message = typeSerializer.Serializer.Deserialize(body, typeSerializer.Type); -// return message; -// } -// -// var exception = new MessageFormatNotSupportedException("Message can not be handled - type undetermined."); -// -// // Put the message's body into the exception data so anyone catching -// // it can inspect it for other purposes, such as for logging. -// exception.Data["MessageBody"] = body; -// -// throw exception; -// } -// -// public string Serialize(Message message, bool serializeForSnsPublishing) -// { -// var messageType = message.GetType(); -// string subject = _messageSubjectProvider.GetSubjectForType(messageType); -// -// if (!_typeSerializersBySubject.TryGetValue(subject, out var lazyTypeSerializer)) -// { -// throw new MessageFormatNotSupportedException($"Failed to serialize message of type {messageType} because it is not registered for serialization."); -// } -// -// var typeSerializer = lazyTypeSerializer.Value; -// IMessageSerializer messageSerializer = typeSerializer.Serializer; -// return messageSerializer.Serialize(message, serializeForSnsPublishing, subject); -// } -// } diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs index da7ebbe97..3d1239e7b 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs @@ -3,14 +3,7 @@ namespace JustSaying.Messaging.MessageSerialization; -public class NewtonsoftSerializationFactory(JsonSerializerSettings settings) : IMessageSerializationFactory +public class NewtonsoftSerializationFactory(JsonSerializerSettings settings = null) : IMessageBodySerializationFactory { - private readonly NewtonsoftSerializer _serializer = new(settings); - - public NewtonsoftSerializationFactory() - : this(null) - { - } - - public IMessageSerializer GetSerializer() where T : Message => _serializer; + public IMessageBodySerializer GetSerializer() where T : Message => new NewtonsoftMessageBodySerializer(settings); } diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs index d1281e9e0..b7e1addac 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs @@ -1,95 +1,9 @@ -using JustSaying.Messaging.MessageHandling; +using System.Text.RegularExpressions; using JustSaying.Models; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; namespace JustSaying.Messaging.MessageSerialization; -public class NewtonsoftSerializer : IMessageSerializer -{ - private readonly JsonSerializerSettings _settings; - - public NewtonsoftSerializer() - : this(null) - { - } - - public NewtonsoftSerializer(JsonSerializerSettings settings) - { - settings ??= new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - Converters = new JsonConverter[] { new Newtonsoft.Json.Converters.StringEnumConverter() } - }; - - _settings = settings; - } - - public Message Deserialize(string message, Type type) - { - var document = JObject.Parse(message); - string json = document["Message"].ToString(); - - return (Message)JsonConvert.DeserializeObject(json, type, _settings); - } - - public string Serialize(Message message, bool serializeForSnsPublishing, string subject) - { - var json = JsonConvert.SerializeObject(message, _settings); - - // AWS SNS service will add Subject and Message properties automatically, - // so just return plain message - if (serializeForSnsPublishing) - { - return json; - } - - // For direct publishing to SQS, add Subject and Message properties manually - var context = new { Subject = subject, Message = json }; - return JsonConvert.SerializeObject(context, _settings); - } - - public MessageAttributes GetMessageAttributes(string message) - { - var props = JObject.Parse(message).Value("MessageAttributes")?.Properties(); - if (props == null) - { - return new MessageAttributes(); - } - - var dict = new Dictionary(); - - foreach (var prop in props) - { - var propData = prop.Value; - if (propData == null) continue; - - var dataType = propData["Type"].ToString(); - var dataValue = propData["Value"].ToString(); - - var isString = dataType == "String"; - - var mav = new MessageAttributeValue - { - DataType = dataType, - StringValue = isString ? dataValue : null, - BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null - }; - dict.Add(prop.Name, mav); - } - - return new MessageAttributes(dict); - } - - public string GetMessageSubject(string sqsMessage) - { - if (string.IsNullOrWhiteSpace(sqsMessage)) return string.Empty; - - var body = JObject.Parse(sqsMessage); - return body.Value("Subject") ?? string.Empty; - } -} - public class NewtonsoftMessageBodySerializer : IMessageBodySerializer where T: Message { private readonly JsonSerializerSettings _settings; diff --git a/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs b/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs index 4aecf6c05..89c8604e3 100644 --- a/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs +++ b/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs @@ -25,9 +25,9 @@ public void Deconstruct(out Message message, out MessageAttributes attributes) } } -public sealed class MessageForPublishing +public sealed class PublishMessage { - public MessageForPublishing(string body, Dictionary messageAttributes, string subject) + public PublishMessage(string body, Dictionary messageAttributes, string subject) { Body = body; MessageAttributes = messageAttributes; diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs index 023957b78..f233b9110 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs @@ -3,14 +3,14 @@ namespace JustSaying.Messaging.MessageSerialization; -public class SystemTextJsonSerializationFactory(JsonSerializerOptions options) : IMessageSerializationFactory -{ - private readonly SystemTextJsonSerializer _serializer = new(options); - - public SystemTextJsonSerializationFactory() - : this(null) - { - } - - public IMessageSerializer GetSerializer() where T : Message => _serializer; -} +// public class SystemTextJsonSerializationFactory(JsonSerializerOptions options) : IMessageSerializationFactory +// { +// private readonly SystemTextJsonSerializer _serializer = new(options); +// +// public SystemTextJsonSerializationFactory() +// : this(null) +// { +// } +// +// public IMessageSerializer GetSerializer() where T : Message => _serializer; +// } diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs index ed445d31a..ac73bc931 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs @@ -5,107 +5,107 @@ namespace JustSaying.Messaging.MessageSerialization; -/// -/// A class representing an implementation of for the System.Text.Json serializer. -/// -public class SystemTextJsonSerializer : IMessageSerializer -{ - private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() - { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - Converters = - { - new JsonStringEnumConverter(), - }, - }; - - private readonly JsonSerializerOptions _options; - - /// - /// Initializes a new instance of the class. - /// - public SystemTextJsonSerializer() - : this(null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The optional to use. - public SystemTextJsonSerializer(JsonSerializerOptions options) - { - _options = options ?? DefaultJsonSerializerOptions; - } - - /// - public string GetMessageSubject(string sqsMessage) - { - using var body = JsonDocument.Parse(sqsMessage); - string subject = string.Empty; - - if (body.RootElement.TryGetProperty("Subject", out var value)) - { - subject = value.GetString() ?? string.Empty; - } - - return subject; - } - - public MessageAttributes GetMessageAttributes(string message) - { - using var jsonDocument = JsonDocument.Parse(message); - - if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) - { - return new MessageAttributes(); - } - - var attributes = new Dictionary(); - foreach(var obj in attributesElement.EnumerateObject()) - { - var dataType = obj.Value.GetProperty("Type").GetString(); - var dataValue = obj.Value.GetProperty("Value").GetString(); - - var isString = dataType == "String"; - - attributes.Add(obj.Name, new MessageAttributeValue() - { - DataType = dataType, - StringValue = isString ? dataValue : null, - BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null - }); - } - - return new MessageAttributes(attributes); - } - - /// - public Message Deserialize(string message, Type type) - { - using var document = JsonDocument.Parse(message); - JsonElement element = document.RootElement.GetProperty("Message"); - string json = element.ToString(); - return (Message)JsonSerializer.Deserialize(json, type, _options); - } - - /// - public string Serialize(Message message, bool serializeForSnsPublishing, string subject) - { - string json = JsonSerializer.Serialize(message, message.GetType(), _options); - - // AWS SNS service will add Subject and Message properties automatically, - // so just return plain message - if (serializeForSnsPublishing) - { - return json; - } - - // For direct publishing to SQS, add Subject and Message properties manually - var context = new { Subject = subject, Message = json }; - return JsonSerializer.Serialize(context, _options); - } -} +// /// +// /// A class representing an implementation of for the System.Text.Json serializer. +// /// +// public class SystemTextJsonSerializer : IMessageSerializer +// { +// private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() +// { +// DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, +// Converters = +// { +// new JsonStringEnumConverter(), +// }, +// }; +// +// private readonly JsonSerializerOptions _options; +// +// /// +// /// Initializes a new instance of the class. +// /// +// public SystemTextJsonSerializer() +// : this(null) +// { +// } +// +// /// +// /// Initializes a new instance of the class. +// /// +// /// The optional to use. +// public SystemTextJsonSerializer(JsonSerializerOptions options) +// { +// _options = options ?? DefaultJsonSerializerOptions; +// } +// +// /// +// public string GetMessageSubject(string sqsMessage) +// { +// using var body = JsonDocument.Parse(sqsMessage); +// string subject = string.Empty; +// +// if (body.RootElement.TryGetProperty("Subject", out var value)) +// { +// subject = value.GetString() ?? string.Empty; +// } +// +// return subject; +// } +// +// public MessageAttributes GetMessageAttributes(string message) +// { +// using var jsonDocument = JsonDocument.Parse(message); +// +// if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) +// { +// return new MessageAttributes(); +// } +// +// var attributes = new Dictionary(); +// foreach(var obj in attributesElement.EnumerateObject()) +// { +// var dataType = obj.Value.GetProperty("Type").GetString(); +// var dataValue = obj.Value.GetProperty("Value").GetString(); +// +// var isString = dataType == "String"; +// +// attributes.Add(obj.Name, new MessageAttributeValue() +// { +// DataType = dataType, +// StringValue = isString ? dataValue : null, +// BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null +// }); +// } +// +// return new MessageAttributes(attributes); +// } +// +// /// +// public Message Deserialize(string message, Type type) +// { +// using var document = JsonDocument.Parse(message); +// JsonElement element = document.RootElement.GetProperty("Message"); +// string json = element.ToString(); +// return (Message)JsonSerializer.Deserialize(json, type, _options); +// } +// +// /// +// public string Serialize(Message message, bool serializeForSnsPublishing, string subject) +// { +// string json = JsonSerializer.Serialize(message, message.GetType(), _options); +// +// // AWS SNS service will add Subject and Message properties automatically, +// // so just return plain message +// if (serializeForSnsPublishing) +// { +// return json; +// } +// +// // For direct publishing to SQS, add Subject and Message properties manually +// var context = new { Subject = subject, Message = json }; +// return JsonSerializer.Serialize(context, _options); +// } +// } public class SystemTextJsonMessageBodySerializer : IMessageBodySerializer where T: Message { diff --git a/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs deleted file mode 100644 index ec48e0ba8..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace JustSaying.Messaging.MessageSerialization; - -public class TypeSerializer(Type type, IMessageSerializer serializer) -{ - public Type Type { get; private set; } = type; - public IMessageSerializer Serializer { get; private set; } = serializer; - //public IMessageEnvelopeWrapper EnvelopeWrapper { get; private set; } = envelopeWrapper; -} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs index 44fe7b7c2..d2caf138e 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs @@ -31,7 +31,7 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName)) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); var message = new SimpleMessage diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs index 6c7a88873..a8380e980 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs @@ -30,7 +30,7 @@ public async Task Then_The_Message_Is_Handled() }; }); })) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); var message = new SimpleMessage diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs index 8c00e3d34..3333397fa 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs @@ -17,7 +17,7 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackQueue(UniqueName)) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton(handler); string content = Guid.NewGuid().ToString(); @@ -43,4 +43,4 @@ await WhenAsync( await handler.Received().Handle(Arg.Is((m) => m.Content == content)); }); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs index ebb81b64a..4c039baba 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs @@ -17,7 +17,7 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackTopic(UniqueName)) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); string content = Guid.NewGuid().ToString(); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs index 590ae6eb5..1104c4c0c 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs @@ -16,7 +16,7 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackTopic(UniqueName)) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); string content = Guid.NewGuid().ToString(); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs index 89eac719e..6f2356471 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs @@ -28,7 +28,7 @@ public async Task Then_The_Message_Is_Handled() }; }); })) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); var message = new SimpleMessage diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs index 79f41b583..dc62ad1fb 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs @@ -34,7 +34,7 @@ public async Task Then_The_Attributes_Are_Returned() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder .WithLoopbackTopic(UniqueName)) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); await WhenAsync( diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs index d03cc8762..a8bf209bc 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs @@ -33,7 +33,7 @@ public async Task Then_The_Attributes_Are_Returned() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder .WithLoopbackTopic(UniqueName)) - .AddSingleton() + //.AddSingleton() TODO .AddSingleton>(handler); await WhenAsync( diff --git a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs index d7d2e0a32..abbde16c2 100644 --- a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs +++ b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs @@ -6,7 +6,6 @@ namespace JustSaying.TestingFramework; public sealed class AwsFactAttribute : FactAttribute { public AwsFactAttribute() - : base() { if (!TestEnvironment.IsSimulatorConfigured && !TestEnvironment.HasCredentials) { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs index c2f9b5759..33e4ad7e4 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs @@ -1,104 +1,106 @@ -using JustSaying.Messaging; -using JustSaying.Messaging.Compression; -using JustSaying.AwsTools.MessageHandling; - -namespace JustSaying.UnitTests.AwsTools.MessageHandling; - -public class MessageCompressionUtilityTests -{ - private readonly MessageCompressionRegistry _compressionRegistry; - - public MessageCompressionUtilityTests() - { - _compressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - } - - [Fact] - public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() - { - // Arrange - var message = "Test message"; - var metadata = new PublishMetadata(); - var compressionOptions = new PublishCompressionOptions(); - - // Act - var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); - - // Assert - Assert.Null(result.compressedMessage); - Assert.Null(result.contentEncoding); - } - - [Fact] - public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMessage() - { - // Arrange - var message = "Short message"; - var metadata = new PublishMetadata(); - var compressionOptions = new PublishCompressionOptions - { - CompressionEncoding = ContentEncodings.GzipBase64, - MessageLengthThreshold = 1000 - }; - - // Act - var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); - - // Assert - Assert.Null(result.compressedMessage); - Assert.Null(result.contentEncoding); - } - - [Fact] - public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMessage() - { - // Arrange - var message = new string('a', 1000); - var metadata = new PublishMetadata(); - var compressionOptions = new PublishCompressionOptions - { - CompressionEncoding = ContentEncodings.GzipBase64, - MessageLengthThreshold = 500 - }; - - // Act - var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); - - // Assert - Assert.NotNull(result.compressedMessage); - Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); - - // Verify that the compressed message can be decompressed - var gzipCompression = new GzipMessageBodyCompression(); - var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); - Assert.Equal(message, decompressedMessage); - } - - [Fact] - public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() - { - // Arrange - var message = "Test message"; - var metadata = new PublishMetadata(); - metadata.AddMessageAttribute("Key1", new MessageAttributeValue { StringValue = "Value1", DataType = "String" }); - metadata.AddMessageAttribute("Key2", new MessageAttributeValue { BinaryValue = new byte[100], DataType = "Binary" }); - - var compressionOptions = new PublishCompressionOptions - { - CompressionEncoding = ContentEncodings.GzipBase64, - MessageLengthThreshold = 50 - }; - - // Act - var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); - - // Assert - Assert.NotNull(result.compressedMessage); - Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); - - // Verify that the compressed message can be decompressed - var gzipCompression = new GzipMessageBodyCompression(); - var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); - Assert.Equal(message, decompressedMessage); - } -} +// using JustSaying.Messaging; +// using JustSaying.Messaging.Compression; +// using JustSaying.AwsTools.MessageHandling; +// +// namespace JustSaying.UnitTests.AwsTools.MessageHandling; +// +// public class MessageCompressionUtilityTests +// { +// private readonly MessageCompressionRegistry _compressionRegistry; +// +// public MessageCompressionUtilityTests() +// { +// _compressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); +// } +// +// [Fact] +// public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() +// { +// // Arrange +// var message = "Test message"; +// var metadata = new PublishMetadata(); +// var compressionOptions = new PublishCompressionOptions(); +// +// // Act +// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); +// +// // Assert +// Assert.Null(result.compressedMessage); +// Assert.Null(result.contentEncoding); +// } +// +// [Fact] +// public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMessage() +// { +// // Arrange +// var message = "Short message"; +// var metadata = new PublishMetadata(); +// var compressionOptions = new PublishCompressionOptions +// { +// CompressionEncoding = ContentEncodings.GzipBase64, +// MessageLengthThreshold = 1000 +// }; +// +// // Act +// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); +// +// // Assert +// Assert.Null(result.compressedMessage); +// Assert.Null(result.contentEncoding); +// } +// +// [Fact] +// public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMessage() +// { +// // Arrange +// var message = new string('a', 1000); +// var metadata = new PublishMetadata(); +// var compressionOptions = new PublishCompressionOptions +// { +// CompressionEncoding = ContentEncodings.GzipBase64, +// MessageLengthThreshold = 500 +// }; +// +// // Act +// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); +// +// // Assert +// Assert.NotNull(result.compressedMessage); +// Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); +// +// // Verify that the compressed message can be decompressed +// var gzipCompression = new GzipMessageBodyCompression(); +// var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); +// Assert.Equal(message, decompressedMessage); +// } +// +// [Fact] +// public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() +// { +// // Arrange +// var message = "Test message"; +// var metadata = new PublishMetadata(); +// metadata.AddMessageAttribute("Key1", new MessageAttributeValue { StringValue = "Value1", DataType = "String" }); +// metadata.AddMessageAttribute("Key2", new MessageAttributeValue { BinaryValue = new byte[100], DataType = "Binary" }); +// +// var compressionOptions = new PublishCompressionOptions +// { +// CompressionEncoding = ContentEncodings.GzipBase64, +// MessageLengthThreshold = 50 +// }; +// +// // Act +// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); +// +// // Assert +// Assert.NotNull(result.compressedMessage); +// Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); +// +// // Verify that the compressed message can be decompressed +// var gzipCompression = new GzipMessageBodyCompression(); +// var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); +// Assert.Equal(message, decompressedMessage); +// } +// } + +// TODO diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index e8976cc1c..4e735b4f0 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -25,7 +25,7 @@ public async Task ShouldDecompressMessage() var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; var decompressorRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), decompressorRegistry); + var messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), decompressorRegistry); string payload = JsonSerializer.Serialize(originalMessage, originalMessage.GetType(), new JsonSerializerOptions { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index 6c48a0120..07f298a92 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -38,7 +38,7 @@ public class WhenDispatchingMessage : IAsyncLifetime internal MessageDispatcher SystemUnderTest { get; private set; } protected readonly IMessageBackoffStrategy MessageBackoffStrategy = Substitute.For(); - private readonly MessageConverter _messageConverter; + private readonly ReceivedMessageConverter _messageConverter; public WhenDispatchingMessage(ITestOutputHelper outputHelper) { @@ -46,7 +46,7 @@ public WhenDispatchingMessage(ITestOutputHelper outputHelper) _loggerFactory = TestLoggerFactory.Create(lb => lb.AddXUnit(outputHelper)); _messageMonitor = new TrackingLoggingMonitor(_loggerFactory.CreateLogger()); _middlewareMap = new MiddlewareMap(); - _messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + _messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); } public virtual async Task InitializeAsync() diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs index a764cf4ed..6a790d4e0 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs @@ -3,8 +3,8 @@ using JustSaying.Messaging; using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -17,7 +17,7 @@ public class WhenPublishing : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry([]), new PublishCompressionOptions(), nameof(SimpleMessage)); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs index 3dfc3f032..c782e34dc 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs @@ -5,6 +5,7 @@ using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -20,7 +21,7 @@ public class WhenPublishingAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry([]), new PublishCompressionOptions(), nameof(SimpleMessage)); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs index a237f5cd1..1ce18245f 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs @@ -16,7 +16,7 @@ public class WhenPublishingAsyncExceptionCanBeHandled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); return Task.FromResult(topic); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs index 40aec298b..db6d887c1 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs @@ -17,7 +17,7 @@ public class WhenPublishingAsyncExceptionCanBeThrown : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs index 401a2e55e..6afc5135d 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs @@ -25,7 +25,7 @@ public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For()) { MessageResponseLogger = (r, m) => diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs index ad942a58e..536a7e5dd 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs @@ -4,6 +4,7 @@ using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -11,16 +12,15 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncWithGenericMessageSubjectProvider : WhenPublishingTestBase { - public class MessageWithTypeParameters : Message - { - } + public class MessageWithTypeParameters : Message; private const string Message = "the_message_in_json"; private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer>(), new MessageCompressionRegistry([])); + var subject = new GenericMessageSubjectProvider().GetSubjectForType(typeof(MessageWithTypeParameters)); + var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry([]), new PublishCompressionOptions(), subject); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 7a00f1bce..9912d4f08 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -1,3 +1,4 @@ +using System.Text.Json.Nodes; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; @@ -11,14 +12,15 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishing : WhenPublishingTestBase { - private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private const string QueueName = "queuename"; + private string _capturedMessageBody; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _publishMessageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -30,9 +32,7 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - // TODO make work - // _messageConverter.Serialize(_message, false) - // .Returns("serialized_contents"); + Sqs.SendMessageAsync(Arg.Do(x => _capturedMessageBody = x.MessageBody)); } protected override async Task WhenAsync() @@ -43,8 +43,10 @@ protected override async Task WhenAsync() [Fact] public void MessageIsPublishedToQueue() { - Sqs.Received().SendMessageAsync(Arg.Is( - x => x.MessageBody.Equals("serialized_contents", StringComparison.OrdinalIgnoreCase))); + _capturedMessageBody.ShouldNotBeNull(); + var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); + var content = jsonNode["Content"].ShouldNotBeNull().GetValue(); + content.ShouldBe("Hello"); } [Fact] diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index 81009b914..8e3a6924e 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -1,3 +1,4 @@ +using System.Text.Json.Nodes; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; @@ -11,14 +12,15 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsync : WhenPublishingTestBase { - private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; + private string _capturedMessageBody; private const string QueueName = "queuename"; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _publishMessageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -30,9 +32,7 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - // TODO make work - // _serializationRegister.Serialize(_message, false) - // .Returns("serialized_contents"); + Sqs.SendMessageAsync(Arg.Do(x => _capturedMessageBody = x.MessageBody)); } protected override async Task WhenAsync() @@ -43,8 +43,10 @@ protected override async Task WhenAsync() [Fact] public void MessageIsPublishedToQueue() { - Sqs.Received().SendMessageAsync(Arg.Is( - x => x.MessageBody.Equals("serialized_contents", StringComparison.OrdinalIgnoreCase))); + _capturedMessageBody.ShouldNotBeNull(); + var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); + var content = jsonNode["Content"].ShouldNotBeNull().GetValue(); + content.ShouldBe("Hello"); } [Fact] diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index 5ed8e671a..bd2f5946f 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -15,7 +15,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTestBase { - private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _testMessage = new() { Content = "Hello" }; private const string QueueName = "queuename"; @@ -28,7 +28,7 @@ public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTest private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()) + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _publishMessageConverter, Substitute.For()) { MessageResponseLogger = (r, m) => { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index 8b0f27102..375597090 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -11,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessage : WhenPublishingTestBase { - private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); private const string Url = "https://testurl.com/" + QueueName; private readonly SimpleMessage _message = new(); @@ -24,7 +24,7 @@ public class WhenPublishingDelayedMessage : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _publishMessageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index eaef79855..447a71d74 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -11,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase { - private readonly MessageConverter _messageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new(); private readonly PublishMetadata _metadata = new() @@ -22,7 +22,7 @@ public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _messageConverter, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _publishMessageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs index d3277a582..95ee32fb2 100644 --- a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs +++ b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs @@ -35,12 +35,12 @@ public void ShouldResolveIMessagingConfigToMessagingConfig() _sut.ResolveService().ShouldBeOfType(); } - [Fact] - public void ShouldResolveIMessageSerializationFactoryToNewtonsoftSerializationFactory() - { - _sut.ResolveService().ShouldBeOfType(); - } - + // [Fact] + // public void ShouldResolveIMessageSerializationFactoryToNewtonsoftSerializationFactory() + // { + // _sut.ResolveService().ShouldBeOfType(); + // } + [Fact] public void ShouldResolveIMessageSubjectProviderToNonGenericMessageSubjectProvider() { diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs index 124af09fc..0b1a99773 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs @@ -1,5 +1,9 @@ using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.UnitTests.AwsTools.MessageHandling; using NSubstitute; @@ -30,7 +34,11 @@ protected override void Given() protected override async Task WhenAsync() { - SystemUnderTest.AddQueue(typeof(Message).FullName, _queue); + SystemUnderTest.AddQueue(typeof(Message).FullName, new SqsSource + { + SqsQueue = _queue, + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }); SystemUnderTest.AddMessageMiddleware(_queue.QueueName, _futureHandler1); SystemUnderTest.AddMessageMiddleware(_queue.QueueName, _futureHandler2); @@ -46,4 +54,4 @@ public void HandlersAreAdded() } public class Message2 : Message { } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs index cfadc0392..b6ccf6eb9 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs @@ -40,8 +40,8 @@ protected override async Task WhenAsync() SystemUnderTest.AddMessageMiddleware(_queue1.QueueName, new InspectableMiddleware()); - var messageConverter1 = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); - var messageConverter2 = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter1 = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter2 = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); SystemUnderTest.AddQueue("groupA", new SqsSource { SqsQueue = _queue1, diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs index fa4d664c6..f39734bc5 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs @@ -6,6 +6,7 @@ using JustSaying.Messaging.Channels.Multiplexer; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; @@ -36,8 +37,6 @@ public ChannelsTests(ITestOutputHelper testOutputHelper) MessageMonitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger()); } - - [Fact] public async Task QueueCanBeAssignedToOnePump() { @@ -182,8 +181,9 @@ public async Task MultipleQueuesCanBeAssignedToMultiplePumps() [InlineData(10, 20, 20, 50)] public async Task WhenSubscriberNotStarted_BufferShouldFillUp_AndStopDownloading(int receivePrefetch, int receiveBufferSize, int multiplexerCapacity, int expectedDownloadCount) { - var sqsQueue = TestQueue(); - IMessageReceiveBuffer buffer = CreateMessageReceiveBuffer(sqsQueue, receivePrefetch, receiveBufferSize); + var sqsSource = TestQueue(); + var sqsQueue = sqsSource.SqsQueue as FakeSqsQueue; + IMessageReceiveBuffer buffer = CreateMessageReceiveBuffer(sqsSource, receivePrefetch, receiveBufferSize); FakeDispatcher dispatcher = new FakeDispatcher(); IMultiplexerSubscriber consumer1 = CreateSubscriber(dispatcher); IMultiplexer multiplexer = CreateMultiplexer(multiplexerCapacity); @@ -226,7 +226,7 @@ public async Task Can_Be_Set_Up_Using_SubscriptionBus() var sqsQueue2 = TestQueue(); var sqsQueue3 = TestQueue(); - var queues = new List { sqsQueue1, sqsQueue2, sqsQueue3 }; + var queues = new List { sqsQueue1, sqsQueue2, sqsQueue3 }; IMessageDispatcher dispatcher = new FakeDispatcher(); var bus = CreateSubscriptionGroup(queues, dispatcher); @@ -244,7 +244,7 @@ public async Task Sqs_Queue_Is_Not_Polled_After_Cancellation() int callCountBeforeCancelled = 0; int callCountAfterCancelled = 0; - ISqsQueue sqsQueue = TestQueue(() => + var sqsQueue = TestQueue(() => { if (cts.Token.IsCancellationRequested) { @@ -277,7 +277,7 @@ public async Task Messages_Not_Dispatched_After_Cancellation() int dispatchedBeforeCancelled = 0; int dispatchedAfterCancelled = 0; - ISqsQueue sqsQueue = TestQueue(); + var sqsQueue = TestQueue(); IMessageDispatcher dispatcher = new FakeDispatcher(() => { if (cts.Token.IsCancellationRequested) @@ -307,7 +307,7 @@ public void SubscriptionGroup_StartingTwice_ShouldReturnSameCompletionTask() { var queue = TestQueue(); var dispatcher = new FakeDispatcher(); - var group = CreateSubscriptionGroup(new[] { queue }, dispatcher); + var group = CreateSubscriptionGroup([queue], dispatcher); var cts = new CancellationTokenSource(); @@ -333,11 +333,11 @@ IEnumerable GetMessages(CancellationToken cancellationToken) var source = new SqsSource { - SqsQueue =new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))), - MessageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer<>()) + SqsQueue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))), + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) }; - return ; + return source; } private MessageReceiveBuffer CreateMessageReceiveBuffer( diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs index 594f4944a..4d9d9b72c 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs @@ -1,8 +1,11 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; @@ -40,8 +43,6 @@ IEnumerable GetMessages() } var queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages())); - - var queues = new List { queue }; IMessageDispatcher dispatcher = new FakeDispatcher(() => { @@ -52,7 +53,13 @@ IEnumerable GetMessages() .WithDefaultConcurrencyLimit(8); var settings = new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(queues) }, + { + "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource + { + SqsQueue = queue, + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }) + } }; var subscriptionGroupFactory = new SubscriptionGroupFactory( @@ -93,7 +100,6 @@ IEnumerable GetMessages() } var queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages())); - var queues = new List { queue }; IMessageDispatcher dispatcher = new FakeDispatcher(() => Interlocked.Increment(ref messagesDispatched)); @@ -101,7 +107,11 @@ IEnumerable GetMessages() .WithDefaultConcurrencyLimit(1); var settings = new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(queues) }, + { "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource + { + SqsQueue = queue, + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }) }, }; var subscriptionGroupFactory = new SubscriptionGroupFactory( diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs index 5856cb160..47fa591c1 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs @@ -1,38 +1,16 @@ -using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; -using JustSaying.TestingFramework; namespace JustSaying.UnitTests.Messaging.Channels.TestHelpers; -// public class FakeSerializationRegister : IMessageSerializationRegister -// { -// public Func DefaultDeserializedMessage { get; set; } -// -// public IList ReceivedDeserializationRequests { get; } -// -// public FakeSerializationRegister() -// { -// var defaultMessage = new SimpleMessage -// { -// RaisingComponent = "Component", -// Id = Guid.NewGuid() -// }; -// DefaultDeserializedMessage = () => defaultMessage; -// ReceivedDeserializationRequests = new List(); -// } -// -// public Message DeserializeMessage(string body) -// { -// ReceivedDeserializationRequests.Add(body); -// return DefaultDeserializedMessage(); -// } -// -// public string Serialize(Message message, bool serializeForSnsPublishing) -// { -// return ""; -// } -// -// public void AddSerializer() where T : Message -// { } -// } +internal class FakeBodySerializer(string messageBody) : IMessageBodySerializer +{ + public string Serialize(Message message) => messageBody; + Message IMessageBodySerializer.Deserialize(string message) => throw new NotImplementedException(); +} + +internal class FakeBodyDeserializer(Message messageToReturn) : IMessageBodySerializer +{ + string IMessageBodySerializer.Serialize(Message message) => throw new NotImplementedException(); + public Message Deserialize(string message) => messageToReturn; +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs index 94889eefa..037c06814 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -24,11 +28,15 @@ public WhenReceivingShouldStop(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(ct => + var queue = new SqsSource { - Interlocked.Increment(ref _callCount); - return Task.FromResult(messages.AsEnumerable()); - }); + SqsQueue = new FakeSqsQueue(ct => + { + Interlocked.Increment(ref _callCount); + return Task.FromResult(messages.AsEnumerable()); + }), + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }; _messageReceivePauseSignal = new MessageReceivePauseSignal(); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs index c6ff0bd17..c51c63c07 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -23,12 +27,16 @@ public WhenSqsIsSlow(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(async ct => + var queue = new SqsSource { - await Task.Delay(100, ct); - Interlocked.Increment(ref _callCount); - return messages; - }); + SqsQueue = new FakeSqsQueue(async ct => + { + await Task.Delay(100, ct); + Interlocked.Increment(ref _callCount); + return messages; + }), + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }; var monitor = new TrackingLoggingMonitor( loggerFactory.CreateLogger()); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs index 6e939f963..9010905d2 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -23,11 +27,15 @@ public WhenSubscriberIsSlow(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(ct => + var queue = new SqsSource { - Interlocked.Increment(ref _callCount); - return Task.FromResult(messages.AsEnumerable()); - }); + SqsQueue = new FakeSqsQueue(ct => + { + Interlocked.Increment(ref _callCount); + return Task.FromResult(messages.AsEnumerable()); + }), + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }; var monitor = new TrackingLoggingMonitor( loggerFactory.CreateLogger()); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs index 857deb687..01fafa478 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -26,11 +30,15 @@ public WhenThereAreNoSubscribers(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(ct => + var queue = new SqsSource { - Interlocked.Increment(ref _callCount); - return Task.FromResult(messages.AsEnumerable()); - }); + SqsQueue = new FakeSqsQueue(ct => + { + Interlocked.Increment(ref _callCount); + return Task.FromResult(messages.AsEnumerable()); + }), + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }; var monitor = new TrackingLoggingMonitor( loggerFactory.CreateLogger()); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index 5b4cd2924..70c9ce135 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -42,7 +42,7 @@ public async Task Add_Different_Handler_Per_Queue() var middleware1 = new InspectableMiddleware(); var middleware2 = new InspectableMiddleware(); - var messageConverter = new MessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); bus.AddMessageMiddleware(queueName1, middleware1); bus.AddMessageMiddleware(queueName2, middleware2); @@ -116,15 +116,9 @@ private static FakeSqsQueue TestQueue( QueueName = queueName, }; - var messages = new List - { - new TestMessage { Body = """ - { - "Subject": "TestJustSayingMessage", - "Message": "{\"QueueName\":\"queue1\"}" - } - """ }, - }; + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "TestJustSayingMessage"); + + List messages = [new TestMessage { Body = messageConverter.ConvertForPublish(message, null, PublishDestinationType.Queue).Body }]; var queue = new FakeSqsQueue(async ct => { diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 2df6604a3..019a3cb5b 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -6,6 +6,7 @@ using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.Fakes; @@ -18,7 +19,7 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public abstract class BaseSubscriptionGroupTests : IAsyncLifetime { - protected IList Queues; + protected IList Queues; protected MiddlewareMap MiddlewareMap; protected TrackingLoggingMonitor Monitor; protected int ConcurrencyLimit = 8; @@ -51,7 +52,7 @@ public async Task InitializeAsync() private void GivenInternal() { - Queues = new List(); + Queues = []; Handler = new InspectableHandler(); Monitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger()); MiddlewareMap = new MiddlewareMap(); @@ -75,9 +76,9 @@ private void GivenInternal() // Default implementation protected virtual async Task WhenAsync() { - foreach (ISqsQueue queue in Queues) + foreach (SqsSource queue in Queues) { - MiddlewareMap.Add(queue.QueueName, Middleware); + MiddlewareMap.Add(queue.SqsQueue.QueueName, Middleware); } var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20)); @@ -103,7 +104,6 @@ private ISubscriptionGroup CreateSystemUnderTest() var dispatcher = new MessageDispatcher( Monitor, MiddlewareMap, - new MessageCompressionRegistry([]), LoggerFactory); var defaults = new SubscriptionGroupSettingsBuilder() @@ -128,24 +128,33 @@ protected virtual Dictionary SetupBusCon }; } - protected static FakeSqsQueue CreateSuccessfulTestQueue(string queueName, params Message[] messages) + protected static SqsSource CreateSuccessfulTestQueue(string queueName, params Message[] messages) { return CreateSuccessfulTestQueue(queueName, messages.AsEnumerable()); } - protected static FakeSqsQueue CreateSuccessfulTestQueue(string queueName, IEnumerable messages) + protected static SqsSource CreateSuccessfulTestQueue(string queueName, IEnumerable messages) { return CreateSuccessfulTestQueue(queueName, ct => Task.FromResult(messages)); } - protected static FakeSqsQueue CreateSuccessfulTestQueue( + protected static SqsSource CreateSuccessfulTestQueue( string queueName, Func>> messageProducer) { - var sqsQueue = new FakeSqsQueue( messageProducer, - queueName); + var sqsQueue = new FakeSqsQueue(messageProducer, queueName); - return sqsQueue; + return new SqsSource + { + SqsQueue = sqsQueue, + MessageConverter = new ReceivedMessageConverter(new FakeBodyDeserializer( + new SimpleMessage + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }), + new MessageCompressionRegistry([])) + }; } public Task DisposeAsync() diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs index 66ea93677..00f96d417 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs @@ -1,4 +1,5 @@ using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; @@ -11,7 +12,7 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenExactlyOnceIsAppliedToHandler(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private ISqsQueue _queue; + private SqsSource _queue; private readonly int _expectedTimeout = 5; private FakeMessageLock _messageLock; @@ -41,7 +42,7 @@ protected override void Given() protected override async Task WhenAsync() { - MiddlewareMap.Add(_queue.QueueName, Middleware); + MiddlewareMap.Add(_queue.SqsQueue.QueueName, Middleware); using var cts = new CancellationTokenSource(); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs index fad1b2045..86fafcda2 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs @@ -1,4 +1,5 @@ using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; @@ -11,7 +12,7 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenExactlyOnceIsAppliedWithoutSpecificTimeout(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private ISqsQueue _queue; + private SqsSource _queue; private readonly int _maximumTimeout = (int)TimeSpan.MaxValue.TotalSeconds; private FakeMessageLock _messageLock; @@ -39,7 +40,7 @@ protected override void Given() protected override async Task WhenAsync() { - MiddlewareMap.Add(_queue.QueueName, Middleware); + MiddlewareMap.Add(_queue.SqsQueue.QueueName, Middleware); var cts = new CancellationTokenSource(); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs index 5e12f67e5..c9f83f501 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs @@ -1,4 +1,5 @@ using Amazon.SQS.Model; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageProcessingStrategies; using Microsoft.Extensions.Logging; @@ -31,9 +32,10 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), ct => Task.FromResult(GetMessages(ct))); + var sqsSource = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), ct => Task.FromResult(GetMessages(ct))); + _queue = sqsSource.SqsQueue as FakeSqsQueue; - Queues.Add(_queue); + Queues.Add(sqsSource); } protected override async Task WhenAsync() diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs index daf449cc4..49afa6ffe 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs @@ -6,8 +6,8 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenListeningWithMultipleGroups(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private readonly ISqsQueue _queueB = CreateSuccessfulTestQueue("C7506B3F-81DA-4898-82A5-C0293523592A", new TestMessage()); - private readonly ISqsQueue _queueA = CreateSuccessfulTestQueue("EC159934-A30E-45B0-9186-78853F7D3BED", new TestMessage()); + private readonly SqsSource _queueB = CreateSuccessfulTestQueue("C7506B3F-81DA-4898-82A5-C0293523592A", new TestMessage()); + private readonly SqsSource _queueA = CreateSuccessfulTestQueue("EC159934-A30E-45B0-9186-78853F7D3BED", new TestMessage()); protected override Dictionary SetupBusConfig() { @@ -40,4 +40,4 @@ public void SubscriptionGroups_OverridesDefaultSettingsCorrectly() json.ShouldMatchApproved(c => c.SubFolder("Approvals")); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs index b0453430c..8a475d467 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs @@ -1,3 +1,5 @@ +using JustSaying.Messaging.Channels.SubscriptionGroups; + namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenMessageHandlingFails(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) @@ -6,9 +8,10 @@ public class WhenMessageHandlingFails(ITestOutputHelper testOutputHelper) : Base protected override void Given() { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage()); + var sqsSource = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage()); + _queue = sqsSource.SqsQueue as FakeSqsQueue; - Queues.Add(_queue); + Queues.Add(sqsSource); Handler.ShouldSucceed = false; } @@ -29,4 +32,4 @@ public void ExceptionIsNotLoggedToMonitor() { Monitor.HandledExceptions.ShouldBeEmpty(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs index da3cdcefb..6397fbb13 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Amazon.SQS.Model; +using JustSaying.Messaging.Channels.SubscriptionGroups; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; @@ -16,10 +17,10 @@ public class WhenMessageHandlingSucceeds(ITestOutputHelper testOutputHelper) : B protected override void Given() { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), - ct => Task.FromResult(new List { new TestMessage { Body = MessageBody } }.AsEnumerable())); + var sqsSource = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage { Body = MessageBody }); + _queue = sqsSource.SqsQueue as FakeSqsQueue; - Queues.Add(_queue); + Queues.Add(sqsSource); } [Fact] diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs index 16654bf4a..705a60579 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs @@ -9,9 +9,10 @@ public class WhenMessageHandlingThrows(ITestOutputHelper testOutputHelper) : Bas protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", new TestMessage()); + var sqsSource = CreateSuccessfulTestQueue("TestQueue", new TestMessage()); + _queue = sqsSource.SqsQueue as FakeSqsQueue; - Queues.Add(_queue); + Queues.Add(sqsSource); Handler.OnHandle = (msg) => { @@ -41,4 +42,4 @@ public void ExceptionIsLoggedToMonitor() { Monitor.HandledExceptions.ShouldNotBeEmpty(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs index 28514a11c..cfbecf077 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs @@ -1,6 +1,11 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; @@ -22,12 +27,14 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - _queue = CreateSuccessfulTestQueue("TestQueue", ct => Task.FromResult(GetMessages(ct))); - - Queues.Add(_queue); + _queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))); + var sqsSource = new SqsSource + { + SqsQueue = _queue, + MessageConverter = new ReceivedMessageConverter(new ThrowingMessageBodySerializer(), new MessageCompressionRegistry([])) + }; - // TODO throw exception during deserialization - throw new NotImplementedException(); + Queues.Add(sqsSource); } protected override bool Until() @@ -41,4 +48,10 @@ public async Task TheListenerDoesNotDie() await Patiently.AssertThatAsync(OutputHelper, () => _callCount.ShouldBeGreaterThan(1)); } + + private sealed class ThrowingMessageBodySerializer : IMessageBodySerializer + { + public string Serialize(Models.Message message) => throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + public Models.Message Deserialize(string message) => throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + } } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs index 3800e2b9a..bff1b0856 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs @@ -11,8 +11,9 @@ public class WhenThereAreExceptionsInSqsCalling(ITestOutputHelper testOutputHelp protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", ExceptionOnFirstCall()); - Queues.Add(_queue); + var sqsSource = CreateSuccessfulTestQueue("TestQueue", ExceptionOnFirstCall()); + _queue = sqsSource.SqsQueue as FakeSqsQueue; + Queues.Add(sqsSource); // setup deserializer failure } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs index f6cdf33f8..552ab1008 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs @@ -1,7 +1,12 @@ using Amazon; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; #pragma warning disable 618 @@ -14,6 +19,12 @@ public sealed class WhenUsingSqsQueueByName(ITestOutputHelper testOutputHelper) readonly string MessageTypeString = nameof(SimpleMessage); const string MessageBody = "object"; + private readonly SimpleMessage _message = new() + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }; + protected override void Given() { int retryCount = 1; @@ -33,17 +44,17 @@ protected override void Given() _queue = queue; - Queues.Add(_queue); + Queues.Add(new SqsSource + { + SqsQueue = queue, + MessageConverter = new ReceivedMessageConverter(new FakeBodyDeserializer(_message), new MessageCompressionRegistry([])) + }); } [Fact] public void HandlerReceivesMessage() { - Handler.ReceivedMessages.Contains(new SimpleMessage - { - RaisingComponent = "Component", - Id = Guid.NewGuid() - }) + Handler.ReceivedMessages.Contains(_message) .ShouldBeTrue(); } diff --git a/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs b/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs index ef933f15b..2e4309348 100644 --- a/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs @@ -1,8 +1,11 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware.Receive; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; @@ -36,8 +39,6 @@ public async Task ErrorHandlingAroundSqs_WithCustomPolicy_CanSwallowExceptions() int dispatchedMessageCount = 0; var sqsQueue = TestQueue(() => Interlocked.Increment(ref queueCalledCount)); - var queues = new List { sqsQueue }; - var config = new SubscriptionGroupSettingsBuilder() .WithDefaultConcurrencyLimit(8); config.WithCustomMiddleware( @@ -45,7 +46,13 @@ public async Task ErrorHandlingAroundSqs_WithCustomPolicy_CanSwallowExceptions() var settings = new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(queues) }, + { + "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource + { + SqsQueue = sqsQueue, + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + }) + } }; IMessageDispatcher dispatcher = new FakeDispatcher(() => Interlocked.Increment(ref dispatchedMessageCount)); diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs index aee4bebfe..adfc60e31 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs @@ -3,23 +3,23 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class DealingWithPotentiallyMissingConversation : XBehaviourTest +public class DealingWithPotentiallyMissingConversation : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; private string _jsonMessage; protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); + _jsonMessage = SystemUnderTest.Serialize(_messageOut); //add extra property to see what happens: _jsonMessage = _jsonMessage.Replace("{__", "{\"New\":\"Property\",__", StringComparison.OrdinalIgnoreCase); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -33,4 +33,4 @@ public void DeserializedMessageHasEmptyConversation_ThisIsForBackwardsCompatibil { _messageIn.Conversation.ShouldBeNull(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs index 508ef31be..0d67f0ac5 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs @@ -3,23 +3,24 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class WhenAskingForANewSerializer : XBehaviourTest -{ - private IMessageSerializer _result; - - protected override void Given() - { - - } - - protected override void WhenAction() - { - _result = SystemUnderTest.GetSerializer(); - } - - [Fact] - public void OneIsProvided() - { - _result.ShouldNotBeNull(); - } -} \ No newline at end of file +// TODO +// public class WhenAskingForANewSerializer : XBehaviourTest +// { +// private IMessageSerializer _result; +// +// protected override void Given() +// { +// +// } +// +// protected override void WhenAction() +// { +// _result = SystemUnderTest.GetSerializer(); +// } +// +// [Fact] +// public void OneIsProvided() +// { +// _result.ShouldNotBeNull(); +// } +// } diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs index 519e72884..631c91739 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs @@ -3,20 +3,20 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class WhenSerializingAndDeserializing : XBehaviourTest +public class WhenSerializingAndDeserializing : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; private string _jsonMessage; protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _jsonMessage = SystemUnderTest.Serialize(_messageOut); + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -39,4 +39,4 @@ public void EnumsAreRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs index 5ceea37a0..d767ea914 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs @@ -4,14 +4,14 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class WhenUsingCustomSettings : XBehaviourTest +public class WhenUsingCustomSettings : XBehaviourTest> { private MessageWithEnum _messageOut; private string _jsonMessage; - protected override NewtonsoftSerializer CreateSystemUnderTest() + protected override NewtonsoftMessageBodySerializer CreateSystemUnderTest() { - return new NewtonsoftSerializer(new JsonSerializerSettings()); + return new NewtonsoftMessageBodySerializer(new JsonSerializerSettings()); } protected override void Given() @@ -21,7 +21,7 @@ protected override void Given() public string GetMessageInContext(MessageWithEnum message) { - var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message, false, message.GetType().Name) }; + var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message) }; return JsonConvert.SerializeObject(context); } @@ -42,4 +42,4 @@ public void EnumsAreNotRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldNotContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs index 596dda031..19d9de754 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs @@ -3,7 +3,7 @@ namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -public class DealingWithPotentiallyMissingConversation : XBehaviourTest +public class DealingWithPotentiallyMissingConversation : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; @@ -16,11 +16,11 @@ protected override void Given() protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); + _jsonMessage = SystemUnderTest.Serialize(_messageOut); // Add extra property to see what happens: _jsonMessage = _jsonMessage.Replace("{__", "{\"New\":\"Property\",__", StringComparison.OrdinalIgnoreCase); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -34,4 +34,4 @@ public void DeserializedMessageHasEmptyConversation_ThisIsForBackwardsCompatibil { _messageIn.Conversation.ShouldBeNull(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs index 0acc316cf..26154d409 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs @@ -2,23 +2,23 @@ using JustSaying.TestingFramework; namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; - -public class WhenAskingForANewSerializer : XBehaviourTest -{ - private IMessageSerializer _result; - - protected override void Given() - { - } - - protected override void WhenAction() - { - _result = SystemUnderTest.GetSerializer(); - } - - [Fact] - public void OneIsProvided() - { - _result.ShouldNotBeNull(); - } -} \ No newline at end of file +// TODO +// public class WhenAskingForANewSerializer : XBehaviourTest +// { +// private IMessageSerializer _result; +// +// protected override void Given() +// { +// } +// +// protected override void WhenAction() +// { +// _result = SystemUnderTest.GetSerializer(); +// } +// +// [Fact] +// public void OneIsProvided() +// { +// _result.ShouldNotBeNull(); +// } +// } diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs index ed36f2232..dae073b1f 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs @@ -3,7 +3,7 @@ namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -public class WhenSerializingAndDeserializing : XBehaviourTest +public class WhenSerializingAndDeserializing : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; @@ -16,8 +16,8 @@ protected override void Given() protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _jsonMessage = SystemUnderTest.Serialize(_messageOut); + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -40,4 +40,4 @@ public void EnumsAreRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs index 7523c64e1..fbb017f7b 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs @@ -5,14 +5,14 @@ namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -public class WhenUsingCustomSettings : XBehaviourTest +public class WhenUsingCustomSettings : XBehaviourTest> { private MessageWithEnum _messageOut; private string _jsonMessage; - protected override SystemTextJsonSerializer CreateSystemUnderTest() + protected override SystemTextJsonMessageBodySerializer CreateSystemUnderTest() { - return new SystemTextJsonSerializer(new JsonSerializerOptions()); + return new SystemTextJsonMessageBodySerializer(new JsonSerializerOptions()); } protected override void Given() @@ -22,7 +22,7 @@ protected override void Given() public string GetMessageInContext(MessageWithEnum message) { - var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message, false, message.GetType().Name) }; + var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message) }; return JsonConvert.SerializeObject(context); } @@ -43,4 +43,4 @@ public void EnumsAreNotRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldNotContain("Two"); } -} \ No newline at end of file +} From d888b5a9aa88ce5b7863914cbcf6ea3422714889 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Tue, 27 Aug 2024 10:17:31 +0100 Subject: [PATCH 25/41] Add RawMessageDelivery support --- .../IServiceCollectionExtensions.cs | 3 +- .../JustSayingRegistry.cs | 3 +- .../ForeignTopicArnProvider.cs | 9 +- .../MessageHandling/ITopicArnProvider.cs | 7 -- .../MessageHandling/LocalTopicArnProvider.cs | 44 ---------- .../QueueCreation/AmazonQueueCreator.cs | 12 ++- .../QueueCreation/SqsReadConfiguration.cs | 1 + .../Fluent/TopicSubscriptionBuilder`1.cs | 10 ++- src/JustSaying/JustSayingBus.cs | 7 +- src/JustSaying/MessagingBusBuilder.cs | 3 +- .../RawDelivery/InspectableSqsClient.cs | 85 +++++++++++++++++++ .../RawDelivery/WhenUsingRawDelivery.cs | 56 ++++++++++++ .../WhenApplyingDefaultMiddlewares.cs | 4 +- .../JustSayingBus/GivenAServiceBus.cs | 2 + .../GivenAServiceBusWithoutMonitoring.cs | 3 +- .../SubscriptionGroupCollectionTests.cs | 2 +- 16 files changed, 176 insertions(+), 75 deletions(-) delete mode 100644 src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs delete mode 100644 src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs create mode 100644 tests/JustSaying.IntegrationTests/Fluent/RawDelivery/InspectableSqsClient.cs create mode 100644 tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index 16ce30846..b795e3b13 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -136,8 +136,7 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService()); services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService()); - // TODO - //services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index 323e25e1e..45f873db0 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -32,8 +32,7 @@ public JustSayingRegistry() For().Use((p) => new AwsClientFactoryProxy(p.GetInstance)).Singleton(); For().Use().Singleton(); For().Use().Singleton(); - // TODO - //For().Use().Singleton(); + For().Use().Singleton(); For().Use().Singleton(); For().Use().Singleton(); diff --git a/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs b/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs index 40afe039d..1a36f393f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs +++ b/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs @@ -2,17 +2,10 @@ namespace JustSaying.AwsTools.MessageHandling; -internal class ForeignTopicArnProvider(RegionEndpoint regionEndpoint, string accountId, string topicName) : ITopicArnProvider +internal class ForeignTopicArnProvider(RegionEndpoint regionEndpoint, string accountId, string topicName) { - private readonly string _arn = $"arn:aws:sns:{regionEndpoint.SystemName}:{accountId}:{topicName}"; - public Task ArnExistsAsync() - { - // Assume foreign topics exist, we actually find out when we attempt to subscribe - return Task.FromResult(true); - } - public Task GetArnAsync() { return Task.FromResult(_arn); diff --git a/src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs b/src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs deleted file mode 100644 index c2b1a5cd8..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling; - -internal interface ITopicArnProvider -{ - Task ArnExistsAsync(); - Task GetArnAsync(); -} \ No newline at end of file diff --git a/src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs b/src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs deleted file mode 100644 index ffe5a49e5..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Amazon.SimpleNotificationService; - -namespace JustSaying.AwsTools.MessageHandling; - -internal class LocalTopicArnProvider : ITopicArnProvider -{ - private readonly IAmazonSimpleNotificationService _client; - private readonly Lazy> _lazyGetArnAsync; - private bool _exists; - - public LocalTopicArnProvider(IAmazonSimpleNotificationService client, string topicName) - { - _client = client; - - _lazyGetArnAsync = new Lazy>(() => GetArnInternalAsync(topicName)); - } - - private async Task GetArnInternalAsync(string topicName) - { - try - { - var topic = await _client.FindTopicAsync(topicName).ConfigureAwait(false); - - _exists = true; - return topic.TopicArn; - } - catch (Exception) - { - // ignored - } - return null; - } - - public Task GetArnAsync() - { - return _lazyGetArnAsync.Value; - } - - public async Task ArnExistsAsync() - { - _ = await _lazyGetArnAsync.Value.ConfigureAwait(false); - return _exists; - } -} diff --git a/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs b/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs index 69c773c55..ce3ec74b1 100644 --- a/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs +++ b/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs @@ -33,7 +33,8 @@ await SubscribeQueueAndApplyFilterPolicyAsync(snsClient, topicArn, sqsClient, queue.Uri, - queueConfig.FilterPolicy).ConfigureAwait(false); + queueConfig.FilterPolicy, + queueConfig.RawMessageDelivery).ConfigureAwait(false); } else { @@ -46,7 +47,8 @@ await SubscribeQueueAndApplyFilterPolicyAsync(snsClient, eventTopic.Arn, sqsClient, queue.Uri, - queueConfig.FilterPolicy).ConfigureAwait(false); + queueConfig.FilterPolicy, + queueConfig.RawMessageDelivery).ConfigureAwait(false); var sqsDetails = new SqsPolicyDetails { @@ -94,7 +96,8 @@ private static async Task SubscribeQueueAndApplyFilterPolicyAsync( string topicArn, IAmazonSQS amazonSQS, Uri queueUrl, - string filterPolicy) + string filterPolicy, + bool rawMessageDelivery) { if (amazonSimpleNotificationService == null) throw new ArgumentNullException(nameof(amazonSimpleNotificationService)); if (amazonSQS == null) throw new ArgumentNullException(nameof(amazonSQS)); @@ -110,5 +113,8 @@ private static async Task SubscribeQueueAndApplyFilterPolicyAsync( await amazonSimpleNotificationService .SetSubscriptionAttributesAsync(subscriptionArn, "FilterPolicy", actualFilterPolicy) .ConfigureAwait(false); + await amazonSimpleNotificationService + .SetSubscriptionAttributesAsync(subscriptionArn, "RawMessageDelivery", rawMessageDelivery.ToString().ToLowerInvariant()) + .ConfigureAwait(false); } } diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs index 3746713c7..f3f3c9b66 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs @@ -21,6 +21,7 @@ public SqsReadConfiguration(SubscriptionType subscriptionType) public Dictionary Tags { get; set; } public string TopicSourceAccount { get; set; } public string FilterPolicy { get; set; } + public bool RawMessageDelivery { get; set; } public string SubscriptionGroupName { get; set; } public void ApplyTopicNamingConvention(ITopicNamingConvention namingConvention) where T: Message diff --git a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs index 79450e9ae..0acb9cddc 100644 --- a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs @@ -43,8 +43,9 @@ internal TopicSubscriptionBuilder() /// private Dictionary Tags { get; } = new(StringComparer.Ordinal); - private Action MiddlewareConfiguration { get; set; } + private bool IsRawDeliveryMode { get; set; } + private Action MiddlewareConfiguration { get; set; } /// /// Configures that the will create the topic name that should be used. @@ -173,6 +174,12 @@ public TopicSubscriptionBuilder WithTag(string key, string value) return this; } + public TopicSubscriptionBuilder WithRawDelivery() + { + IsRawDeliveryMode = true; + return this; + } + /// void ISubscriptionBuilder.Configure( JustSayingBus bus, @@ -188,6 +195,7 @@ void ISubscriptionBuilder.Configure( { QueueName = QueueName, TopicName = TopicName, + RawMessageDelivery = IsRawDeliveryMode, Tags = Tags }; diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index a0167323e..7223a74dc 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -1,5 +1,4 @@ using System.Collections.Concurrent; -using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Extensions; using JustSaying.Messaging; @@ -44,6 +43,7 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IDisposabl internal JustSayingBus( IMessagingConfig config, + IMessageBodySerializationFactory serializationFactory, ILoggerFactory loggerFactory, IMessageMonitor monitor) { @@ -56,7 +56,7 @@ internal JustSayingBus( Config = config; MiddlewareMap = new MiddlewareMap(); CompressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - MessageBodySerializerFactory = new NewtonsoftSerializationFactory(); + MessageBodySerializerFactory = serializationFactory; _publishersByType = []; _subscriptionGroupSettings = @@ -66,9 +66,10 @@ internal JustSayingBus( internal JustSayingBus( IMessagingConfig config, + IMessageBodySerializationFactory serializationFactory, IMessageReceivePauseSignal messageReceivePauseSignal, ILoggerFactory loggerFactory, - IMessageMonitor monitor) : this(config, loggerFactory, monitor) + IMessageMonitor monitor) : this(config, serializationFactory, loggerFactory, monitor) { _messageReceivePauseSignal = messageReceivePauseSignal; } diff --git a/src/JustSaying/MessagingBusBuilder.cs b/src/JustSaying/MessagingBusBuilder.cs index 027593fcf..0cf4e64bd 100644 --- a/src/JustSaying/MessagingBusBuilder.cs +++ b/src/JustSaying/MessagingBusBuilder.cs @@ -254,10 +254,11 @@ public IMessagingBus BuildSubscribers() private JustSayingBus CreateBus(IMessagingConfig config, ILoggerFactory loggerFactory) { + IMessageBodySerializationFactory serializationFactory = ServiceResolver.ResolveService(); IMessageReceivePauseSignal messageReceivePauseSignal = ServiceResolver.ResolveService(); IMessageMonitor monitor = ServiceResolver.ResolveOptionalService() ?? new NullOpMessageMonitor(); - var bus = new JustSayingBus(config, messageReceivePauseSignal, loggerFactory, monitor); + var bus = new JustSayingBus(config, serializationFactory, messageReceivePauseSignal, loggerFactory, monitor); return bus; } diff --git a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/InspectableSqsClient.cs b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/InspectableSqsClient.cs new file mode 100644 index 000000000..e679d14a1 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/InspectableSqsClient.cs @@ -0,0 +1,85 @@ +using Amazon; +using Amazon.Runtime; +using Amazon.Runtime.Endpoints; +using Amazon.Runtime.SharedInterfaces; +using Amazon.SimpleNotificationService; +using Amazon.SQS; +using Amazon.SQS.Model; +using JustSaying.AwsTools; +using JustSaying.TestingFramework; + +namespace JustSaying.Fluent.RawDelivery; + +internal sealed class InspectableSqsClient(IAmazonSQS innerAmazonSqsClient) : IAmazonSQS +{ + public List ReceiveMessageResponses { get; } = []; + + async Task IAmazonSQS.ReceiveMessageAsync(ReceiveMessageRequest request, CancellationToken cancellationToken) + { + var response = await innerAmazonSqsClient.ReceiveMessageAsync(request, cancellationToken); + ReceiveMessageResponses.Add(response); + return response; + } + + // Proxied implementations + void IDisposable.Dispose() => innerAmazonSqsClient.Dispose(); + Task> ICoreAmazonSQS.GetAttributesAsync(string queueUrl) => innerAmazonSqsClient.GetAttributesAsync(queueUrl); + Task ICoreAmazonSQS.SetAttributesAsync(string queueUrl, Dictionary attributes) => innerAmazonSqsClient.SetAttributesAsync(queueUrl, attributes); + IClientConfig IAmazonService.Config => innerAmazonSqsClient.Config; + Task IAmazonSQS.AuthorizeS3ToSendMessageAsync(string queueUrl, string bucket) => innerAmazonSqsClient.AuthorizeS3ToSendMessageAsync(queueUrl, bucket); + Task IAmazonSQS.AddPermissionAsync(string queueUrl, string label, List awsAccountIds, List actions, CancellationToken cancellationToken) => innerAmazonSqsClient.AddPermissionAsync(queueUrl, label, awsAccountIds, actions, cancellationToken); + Task IAmazonSQS.AddPermissionAsync(AddPermissionRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.AddPermissionAsync(request, cancellationToken); + Task IAmazonSQS.CancelMessageMoveTaskAsync(CancelMessageMoveTaskRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.CancelMessageMoveTaskAsync(request, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeout, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityAsync(queueUrl, receiptHandle, visibilityTimeout, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityAsync(ChangeMessageVisibilityRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityAsync(request, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityBatchAsync(string queueUrl, List entries, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityBatchAsync(queueUrl, entries, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityBatchAsync(ChangeMessageVisibilityBatchRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityBatchAsync(request, cancellationToken); + Task IAmazonSQS.CreateQueueAsync(string queueName, CancellationToken cancellationToken) => innerAmazonSqsClient.CreateQueueAsync(queueName, cancellationToken); + Task IAmazonSQS.CreateQueueAsync(CreateQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.CreateQueueAsync(request, cancellationToken); + Task IAmazonSQS.DeleteMessageAsync(string queueUrl, string receiptHandle, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageAsync(queueUrl, receiptHandle, cancellationToken); + Task IAmazonSQS.DeleteMessageAsync(DeleteMessageRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageAsync(request, cancellationToken); + Task IAmazonSQS.DeleteMessageBatchAsync(string queueUrl, List entries, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageBatchAsync(queueUrl, entries, cancellationToken); + Task IAmazonSQS.DeleteMessageBatchAsync(DeleteMessageBatchRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageBatchAsync(request, cancellationToken); + Task IAmazonSQS.DeleteQueueAsync(string queueUrl, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteQueueAsync(queueUrl, cancellationToken); + Task IAmazonSQS.DeleteQueueAsync(DeleteQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteQueueAsync(request, cancellationToken); + Task IAmazonSQS.GetQueueAttributesAsync(string queueUrl, List attributeNames, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueAttributesAsync(queueUrl, attributeNames, cancellationToken); + Task IAmazonSQS.GetQueueAttributesAsync(GetQueueAttributesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueAttributesAsync(request, cancellationToken); + Task IAmazonSQS.GetQueueUrlAsync(string queueName, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueUrlAsync(queueName, cancellationToken); + Task IAmazonSQS.GetQueueUrlAsync(GetQueueUrlRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueUrlAsync(request, cancellationToken); + Task IAmazonSQS.ListDeadLetterSourceQueuesAsync(ListDeadLetterSourceQueuesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListDeadLetterSourceQueuesAsync(request, cancellationToken); + Task IAmazonSQS.ListMessageMoveTasksAsync(ListMessageMoveTasksRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListMessageMoveTasksAsync(request, cancellationToken); + Task IAmazonSQS.ListQueuesAsync(string queueNamePrefix, CancellationToken cancellationToken) => innerAmazonSqsClient.ListQueuesAsync(queueNamePrefix, cancellationToken); + Task IAmazonSQS.ListQueuesAsync(ListQueuesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListQueuesAsync(request, cancellationToken); + Task IAmazonSQS.ListQueueTagsAsync(ListQueueTagsRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListQueueTagsAsync(request, cancellationToken); + Task IAmazonSQS.PurgeQueueAsync(string queueUrl, CancellationToken cancellationToken) => innerAmazonSqsClient.PurgeQueueAsync(queueUrl, cancellationToken); + Task IAmazonSQS.PurgeQueueAsync(PurgeQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.PurgeQueueAsync(request, cancellationToken); + Task IAmazonSQS.ReceiveMessageAsync(string queueUrl, CancellationToken cancellationToken) => innerAmazonSqsClient.ReceiveMessageAsync(queueUrl, cancellationToken); + Task IAmazonSQS.RemovePermissionAsync(string queueUrl, string label, CancellationToken cancellationToken) => innerAmazonSqsClient.RemovePermissionAsync(queueUrl, label, cancellationToken); + Task IAmazonSQS.RemovePermissionAsync(RemovePermissionRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.RemovePermissionAsync(request, cancellationToken); + Task IAmazonSQS.SendMessageAsync(string queueUrl, string messageBody, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageAsync(queueUrl, messageBody, cancellationToken); + Task IAmazonSQS.SendMessageAsync(SendMessageRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageAsync(request, cancellationToken); + Task IAmazonSQS.SendMessageBatchAsync(string queueUrl, List entries, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageBatchAsync(queueUrl, entries, cancellationToken); + Task IAmazonSQS.SendMessageBatchAsync(SendMessageBatchRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageBatchAsync(request, cancellationToken); + Task IAmazonSQS.SetQueueAttributesAsync(string queueUrl, Dictionary attributes, CancellationToken cancellationToken) => innerAmazonSqsClient.SetQueueAttributesAsync(queueUrl, attributes, cancellationToken); + Task IAmazonSQS.SetQueueAttributesAsync(SetQueueAttributesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.SetQueueAttributesAsync(request, cancellationToken); + Task IAmazonSQS.StartMessageMoveTaskAsync(StartMessageMoveTaskRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.StartMessageMoveTaskAsync(request, cancellationToken); + Task IAmazonSQS.TagQueueAsync(TagQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.TagQueueAsync(request, cancellationToken); + Task IAmazonSQS.UntagQueueAsync(UntagQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.UntagQueueAsync(request, cancellationToken); + Endpoint IAmazonSQS.DetermineServiceOperationEndpoint(AmazonWebServiceRequest request) => innerAmazonSqsClient.DetermineServiceOperationEndpoint(request); + ISQSPaginatorFactory IAmazonSQS.Paginators => innerAmazonSqsClient.Paginators; +} + +internal sealed class InspectableClientFactory(IAwsClientFactory innerClientFactory) : IAwsClientFactory +{ + public InspectableSqsClient InspectableSqsClient { get; } = new(innerClientFactory.GetSqsClient(TestEnvironment.Region)); + + public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) + { + return innerClientFactory.GetSnsClient(region); + } + + public IAmazonSQS GetSqsClient(RegionEndpoint region) + { + return InspectableSqsClient; + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs new file mode 100644 index 000000000..5a136e565 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs @@ -0,0 +1,56 @@ +using JustSaying.IntegrationTests.Fluent; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.Fluent.RawDelivery; + +public class WhenUsingRawDelivery(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Published() + { + // Arrange + var handler = new InspectableHandler(); + var awsClientFactory = new InspectableClientFactory(new LocalAwsClientFactory(Bus)); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => + { + builder.Client((options) => options.WithClientFactory(() => awsClientFactory)); + builder.WithLoopbackTopic(UniqueName, + c => { c.WithRawDelivery(); }); + }) + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage + { + Content = content + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(() => + { + var handledMessage = handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey()).ShouldHaveSingleItem(); + handledMessage.Content.ShouldBe(content); + var response = awsClientFactory.InspectableSqsClient.ReceiveMessageResponses.Where(r => r.Messages.Count > 0).ShouldHaveSingleItem(); + var responseMessage = response.Messages.ShouldHaveSingleItem(); + var messageBody = responseMessage.Body; + messageBody.ShouldNotContain("Message"); + messageBody.ShouldNotContain("Subject"); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs index b12c0efea..075d50b8a 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs @@ -25,7 +25,7 @@ public async Task Then_The_Defaults_Are_The_Defaults_For_Sure() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder.WithLoopbackTopic(UniqueName)) - .AddJustSayingHandlers(new[] { handler }); + .AddJustSayingHandlers([handler]); string json = ""; await WhenAsync( @@ -81,4 +81,4 @@ await WhenAsync( json.ShouldMatchApproved(c => c.SubFolder($"Approvals")); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs index 41a3f9792..eb460287b 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs @@ -1,5 +1,6 @@ using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging; @@ -53,6 +54,7 @@ private JustSaying.JustSayingBus CreateSystemUnderTest() { var messageReceivePauseSignal = new MessageReceivePauseSignal(); var bus = new JustSaying.JustSayingBus(Config, + new NewtonsoftSerializationFactory(), messageReceivePauseSignal, LoggerFactory, Monitor); diff --git a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs index b3601052e..fffdff054 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs @@ -1,4 +1,5 @@ using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.MessageSerialization; using Microsoft.Extensions.Logging; using NSubstitute; @@ -35,6 +36,6 @@ protected virtual void Given() private JustSaying.JustSayingBus CreateSystemUnderTest() { - return new JustSaying.JustSayingBus(Config, new MessageReceivePauseSignal(), LoggerFactory, null); + return new JustSaying.JustSayingBus(Config, new NewtonsoftSerializationFactory(), new MessageReceivePauseSignal(), LoggerFactory, null); } } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index 70c9ce135..b99895413 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -93,7 +93,7 @@ private JustSaying.JustSayingBus CreateBus() { var config = Substitute.For(); - var bus = new JustSaying.JustSayingBus(config, MessageReceivePauseSignal, LoggerFactory, MessageMonitor); + var bus = new JustSaying.JustSayingBus(config, new NewtonsoftSerializationFactory(), MessageReceivePauseSignal, LoggerFactory, MessageMonitor); var defaultSubscriptionSettings = new SubscriptionGroupSettingsBuilder() .WithDefaultMultiplexerCapacity(1) From c593ef63ee17d8b729ba75ead9d45a513a40864c Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Wed, 4 Sep 2024 14:25:06 +0100 Subject: [PATCH 26/41] Fix more tests --- .../PublishMessageConverter.cs | 10 ++-- .../Fluent/QueueAddressConfiguration.cs | 1 + .../QueueAddressSubscriptionBuilder`1.cs | 3 +- .../Fluent/QueueSubscriptionBuilder`1.cs | 4 +- .../Fluent/TopicSubscriptionBuilder`1.cs | 11 +---- .../Compression/MessageCompressionRegistry.cs | 4 +- .../NewtonsoftSerializer.cs | 9 +++- .../SystemTextJsonSerializer.cs | 26 ++++++---- .../RawDelivery/WhenUsingRawDelivery.cs | 2 +- .../WhenDispatchingCompressedMessage.cs | 2 +- .../WhenDispatchingMessage.cs | 27 +++++++---- .../Sns/TopicByName/WhenPublishing.cs | 2 +- .../Sns/TopicByName/WhenPublishingAsync.cs | 2 +- ...henPublishingAsyncExceptionCanBeHandled.cs | 2 +- ...WhenPublishingAsyncExceptionCanBeThrown.cs | 2 +- ...enPublishingAsyncResponseLoggerIsCalled.cs | 2 +- ...gAsyncWithGenericMessageSubjectProvider.cs | 2 +- .../MessageHandling/Sqs/WhenPublishing.cs | 2 +- .../Sqs/WhenPublishingAsync.cs | 2 +- ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 2 +- .../Sqs/WhenPublishingDelayedMessage.cs | 2 +- .../Sqs/WhenPublishingDelayedMessageAsync.cs | 2 +- .../CompressionEncodingValidatorTests.cs | 6 +-- .../WhenRegisteringMessageHandlers.cs | 2 +- .../WhenRegisteringSubscribers.cs | 4 +- .../Messaging/Channels/ChannelsTests.cs | 2 +- .../Messaging/Channels/ErrorHandlingTests.cs | 4 +- .../WhenReceivingShouldStop.cs | 2 +- .../WhenSqsIsSlow.cs | 2 +- .../WhenSubscriberIsSlow.cs | 2 +- .../WhenThereAreNoSubscribers.cs | 2 +- .../SubscriptionGroupCollectionTests.cs | 4 +- .../BaseSubscriptionGroupTests.cs | 20 ++++---- .../WhenExactlyOnceIsAppliedToHandler.cs | 12 ++--- ...sAppliedToHandlerWithoutExplicitTimeout.cs | 19 ++++---- .../WhenListeningStartsAndStops.cs | 25 ++++++---- .../WhenListeningWithMultipleGroups.cs | 48 +++++++++++++++++-- .../WhenMessageHandlingSucceeds.cs | 13 +---- ...enThereAreExceptionsInMessageProcessing.cs | 2 +- .../WhenUsingSqsQueueByName.cs | 2 +- .../Messaging/Policies/ChannelPolicyTests.cs | 2 +- ...alingWithPotentiallyMissingConversation.cs | 2 +- 42 files changed, 175 insertions(+), 121 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs index d0557d4c2..7b09704f8 100644 --- a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs @@ -14,19 +14,21 @@ internal sealed class ReceivedMessageConverter : IReceivedMessageConverter { private readonly IMessageBodySerializer _bodySerializer; private readonly MessageCompressionRegistry _compressionRegistry; + private readonly bool _isRawMessage; - public ReceivedMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry) + public ReceivedMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, bool isRawMessage) { _bodySerializer = bodySerializer; _compressionRegistry = compressionRegistry; + _isRawMessage = isRawMessage; } public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) { string body = message.Body; var attributes = GetMessageAttributes(message, body); - //bool isRawMessage = IsRawMessage(body); - if (body is not null) // TODO + + if (body is not null && !_isRawMessage) { var jsonNode = JsonNode.Parse(body); if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) @@ -81,7 +83,7 @@ private static MessageAttributes GetMessageAttributes(string message) var isString = dataType == "String"; - attributes.Add(obj.Name, new MessageAttributeValue() + attributes.Add(obj.Name, new MessageAttributeValue { DataType = dataType, StringValue = isString ? dataValue : null, diff --git a/src/JustSaying/Fluent/QueueAddressConfiguration.cs b/src/JustSaying/Fluent/QueueAddressConfiguration.cs index 1902538ef..94df7441d 100644 --- a/src/JustSaying/Fluent/QueueAddressConfiguration.cs +++ b/src/JustSaying/Fluent/QueueAddressConfiguration.cs @@ -3,6 +3,7 @@ namespace JustSaying.Fluent; public sealed class QueueAddressConfiguration { public string SubscriptionGroupName { get; set; } + public bool RawMessageDelivery { get; set; } public void Validate() { diff --git a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs index a5e0c7d3b..8168b66fa 100644 --- a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs @@ -92,7 +92,8 @@ void ISubscriptionBuilder.Configure( attachedQueueConfig.Validate(); var serializer = MessageBodySerializer ?? bus.MessageBodySerializerFactory.GetSerializer(); - var messageConverter = new ReceivedMessageConverter(serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()])); + var compressionRegistry = bus.CompressionRegistry; + var messageConverter = new ReceivedMessageConverter(serializer, compressionRegistry, attachedQueueConfig.RawMessageDelivery); var sqsSource = new SqsSource { SqsQueue = queue, MessageConverter = messageConverter }; bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, sqsSource); diff --git a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs index 275c3f0f0..80919f3d7 100644 --- a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs @@ -187,7 +187,9 @@ void ISubscriptionBuilder.Configure( var queue = creator.EnsureQueueExists(region, subscriptionConfig); bus.AddStartupTask(queue.StartupTask); - bus.AddQueue(subscriptionConfig.SubscriptionGroupName, new SqsSource { MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), null), SqsQueue = queue.Queue }); + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var compressionRegistry = bus.CompressionRegistry; + bus.AddQueue(subscriptionConfig.SubscriptionGroupName, new SqsSource { MessageConverter = new ReceivedMessageConverter(serializer, compressionRegistry, subscriptionConfig.RawMessageDelivery), SqsQueue = queue.Queue }); logger.LogInformation( "Created SQS subscriber for message type '{MessageType}' on queue '{QueueName}'.", diff --git a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs index 0acb9cddc..e57d88c32 100644 --- a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs @@ -43,8 +43,6 @@ internal TopicSubscriptionBuilder() /// private Dictionary Tags { get; } = new(StringComparer.Ordinal); - private bool IsRawDeliveryMode { get; set; } - private Action MiddlewareConfiguration { get; set; } /// @@ -174,12 +172,6 @@ public TopicSubscriptionBuilder WithTag(string key, string value) return this; } - public TopicSubscriptionBuilder WithRawDelivery() - { - IsRawDeliveryMode = true; - return this; - } - /// void ISubscriptionBuilder.Configure( JustSayingBus bus, @@ -195,7 +187,6 @@ void ISubscriptionBuilder.Configure( { QueueName = QueueName, TopicName = TopicName, - RawMessageDelivery = IsRawDeliveryMode, Tags = Tags }; @@ -221,7 +212,7 @@ void ISubscriptionBuilder.Configure( var sqsSource = new SqsSource { SqsQueue = queueWithStartup.Queue, - MessageConverter = new ReceivedMessageConverter(serializer, compressionRegistry) + MessageConverter = new ReceivedMessageConverter(serializer, compressionRegistry, subscriptionConfig.RawMessageDelivery) }; bus.AddQueue(subscriptionConfig.SubscriptionGroupName, sqsSource); diff --git a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs index f0adad317..95976d5d0 100644 --- a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs +++ b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs @@ -11,9 +11,9 @@ public sealed class MessageCompressionRegistry /// Initializes a new instance of the class. /// /// A list of available compression methods. - public MessageCompressionRegistry(IList compressions) + public MessageCompressionRegistry(IList compressions = null) { - _compressions = compressions ?? throw new ArgumentNullException(nameof(compressions)); + _compressions = compressions ?? []; } /// diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs index b7e1addac..e555483d6 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs @@ -8,15 +8,20 @@ public class NewtonsoftMessageBodySerializer : IMessageBodySerializer where T { private readonly JsonSerializerSettings _settings; - public NewtonsoftMessageBodySerializer(JsonSerializerSettings settings = null) + public NewtonsoftMessageBodySerializer() { - _settings = settings ?? new JsonSerializerSettings + _settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = [new Newtonsoft.Json.Converters.StringEnumConverter()] }; } + public NewtonsoftMessageBodySerializer(JsonSerializerSettings settings) + { + _settings = settings; + } + public string Serialize(Message message) { return JsonConvert.SerializeObject(message, _settings); diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs index ac73bc931..b1e32169e 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs @@ -107,22 +107,18 @@ namespace JustSaying.Messaging.MessageSerialization; // } // } -public class SystemTextJsonMessageBodySerializer : IMessageBodySerializer where T: Message +public class SystemTextJsonMessageBodySerializer : SystemTextJsonMessageBodySerializerBase, IMessageBodySerializer where T: Message { private readonly JsonSerializerOptions _options; - private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() + public SystemTextJsonMessageBodySerializer() { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - Converters = - { - new JsonStringEnumConverter(), - }, - }; + _options = DefaultJsonSerializerOptions; + } public SystemTextJsonMessageBodySerializer(JsonSerializerOptions options) { - _options = options ?? DefaultJsonSerializerOptions; + _options = options; } public string Serialize(Message message) @@ -135,3 +131,15 @@ public Message Deserialize(string messageBody) return JsonSerializer.Deserialize(messageBody, _options); } } + +public class SystemTextJsonMessageBodySerializerBase +{ + private protected static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonStringEnumConverter(), + }, + }; +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs index 5a136e565..cc08ac61e 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs @@ -19,7 +19,7 @@ public async Task Then_The_Message_Is_Published() { builder.Client((options) => options.WithClientFactory(() => awsClientFactory)); builder.WithLoopbackTopic(UniqueName, - c => { c.WithRawDelivery(); }); + c => { c.WithReadConfiguration(rc => rc.RawMessageDelivery = true); }); }) .AddSingleton>(handler); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs index 4e735b4f0..01e3994be 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -25,7 +25,7 @@ public async Task ShouldDecompressMessage() var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; var decompressorRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); - var messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), decompressorRegistry); + var messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), decompressorRegistry, false); string payload = JsonSerializer.Serialize(originalMessage, originalMessage.GetType(), new JsonSerializerOptions { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index 07f298a92..b8f06eaa9 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -37,7 +37,8 @@ public class WhenDispatchingMessage : IAsyncLifetime internal MessageDispatcher SystemUnderTest { get; private set; } - protected readonly IMessageBackoffStrategy MessageBackoffStrategy = Substitute.For(); + private readonly IMessageBackoffStrategy _messageBackoffStrategy = Substitute.For(); + private readonly IMessageBodySerializer _messageBodySerializer = Substitute.For(); private readonly ReceivedMessageConverter _messageConverter; public WhenDispatchingMessage(ITestOutputHelper outputHelper) @@ -46,7 +47,7 @@ public WhenDispatchingMessage(ITestOutputHelper outputHelper) _loggerFactory = TestLoggerFactory.Create(lb => lb.AddXUnit(outputHelper)); _messageMonitor = new TrackingLoggingMonitor(_loggerFactory.CreateLogger()); _middlewareMap = new MiddlewareMap(); - _messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + _messageConverter = new ReceivedMessageConverter(_messageBodySerializer, new MessageCompressionRegistry(), false); } public virtual async Task InitializeAsync() @@ -65,7 +66,7 @@ public virtual Task DisposeAsync() protected virtual void Given() { - _typedMessage = new OrderAccepted(); + _typedMessage = new SimpleMessage(); _sqsMessage = new SQSMessage { @@ -82,6 +83,8 @@ IEnumerable GetMessages() { Uri = new Uri(ExpectedQueueUrl) }; + + _messageBodySerializer.Deserialize(Arg.Any()).Returns(_typedMessage); } private async Task When() @@ -100,6 +103,12 @@ private MessageDispatcher CreateSystemUnderTestAsync() return dispatcher; } + [Fact] + public void ShouldDeserializeMessage() + { + _messageBodySerializer.Received(1).Deserialize(Arg.Is(x => x == _sqsMessage.Body)); + } + public class AndHandlerMapDoesNotHaveMatchingHandler(ITestOutputHelper outputHelper) : WhenDispatchingMessage(outputHelper) { private const int ExpectedReceiveCount = 1; @@ -132,11 +141,11 @@ protected override void Given() sc => sc.AddSingleton>(handler)); var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver) - .UseBackoff(MessageBackoffStrategy) + .UseBackoff(_messageBackoffStrategy) .UseDefaults(handler.GetType()) .Build(); - _middlewareMap.Add(_queue.QueueName, middleware); + _middlewareMap.Add(_queue.QueueName, middleware); } [Fact] @@ -168,20 +177,20 @@ protected override void Given() sc => sc.AddSingleton>(handler)); var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver) - .UseBackoff(MessageBackoffStrategy) + .UseBackoff(_messageBackoffStrategy) .UseDefaults(handler.GetType()) .Build(); - _middlewareMap.Add(_queue.QueueName, middleware); + _middlewareMap.Add(_queue.QueueName, middleware); - MessageBackoffStrategy.GetBackoffDuration(_typedMessage, 1, _expectedException).Returns(_expectedBackoffTimeSpan); + _messageBackoffStrategy.GetBackoffDuration(_typedMessage, 1, _expectedException).Returns(_expectedBackoffTimeSpan); _sqsMessage.Attributes.Add(MessageSystemAttributeName.ApproximateReceiveCount, ExpectedReceiveCount.ToString(CultureInfo.InvariantCulture)); } [Fact] public void ShouldInvokeMessageBackoffStrategyWithNumberOfReceives() { - MessageBackoffStrategy.Received(1).GetBackoffDuration(Arg.Is(_typedMessage), Arg.Is(ExpectedReceiveCount), Arg.Is(_expectedException)); + _messageBackoffStrategy.Received(1).GetBackoffDuration(Arg.Is(_typedMessage), Arg.Is(ExpectedReceiveCount), Arg.Is(_expectedException)); } [Fact] diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs index 6a790d4e0..f7c846aba 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs @@ -17,7 +17,7 @@ public class WhenPublishing : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry([]), new PublishCompressionOptions(), nameof(SimpleMessage)); + var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage)); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs index c782e34dc..5da6d7570 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs @@ -21,7 +21,7 @@ public class WhenPublishingAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry([]), new PublishCompressionOptions(), nameof(SimpleMessage)); + var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage)); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs index 1ce18245f..49ad48281 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs @@ -16,7 +16,7 @@ public class WhenPublishingAsyncExceptionCanBeHandled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); return Task.FromResult(topic); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs index db6d887c1..360306c38 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs @@ -17,7 +17,7 @@ public class WhenPublishingAsyncExceptionCanBeThrown : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs index 6afc5135d..d9530fe01 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs @@ -25,7 +25,7 @@ public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For()) { MessageResponseLogger = (r, m) => diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs index 536a7e5dd..fb2bd8e85 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs @@ -20,7 +20,7 @@ public class MessageWithTypeParameters : Message; private protected override Task CreateSystemUnderTestAsync() { var subject = new GenericMessageSubjectProvider().GetSubjectForType(typeof(MessageWithTypeParameters)); - var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry([]), new PublishCompressionOptions(), subject); + var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), subject); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 9912d4f08..0af479466 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -12,7 +12,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishing : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private const string QueueName = "queuename"; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index 8e3a6924e..ca957297f 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -12,7 +12,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsync : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private string _capturedMessageBody; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index bd2f5946f..48dba5f6e 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -15,7 +15,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _testMessage = new() { Content = "Hello" }; private const string QueueName = "queuename"; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index 375597090..8e3aae0ba 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -11,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessage : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); private const string Url = "https://testurl.com/" + QueueName; private readonly SimpleMessage _message = new(); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index 447a71d74..0579ee3ab 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -11,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new(); private readonly PublishMetadata _metadata = new() diff --git a/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs b/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs index 09ba02287..d15c5dd36 100644 --- a/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs +++ b/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs @@ -10,7 +10,7 @@ public class CompressionEncodingValidatorTests public void ValidateEncoding_WithNullCompressionOptions_DoesNotThrow() { // Arrange - var registry = new MessageCompressionRegistry([]); + var registry = new MessageCompressionRegistry(); // Act & Assert CompressionEncodingValidator.ValidateEncoding(registry, null); @@ -20,7 +20,7 @@ public void ValidateEncoding_WithNullCompressionOptions_DoesNotThrow() public void ValidateEncoding_WithNullCompressionEncoding_DoesNotThrow() { // Arrange - var registry = new MessageCompressionRegistry([]); + var registry = new MessageCompressionRegistry(); var options = new PublishCompressionOptions { CompressionEncoding = null }; // Act & Assert @@ -43,7 +43,7 @@ public void ValidateEncoding_WithRegisteredEncoding_DoesNotThrow() public void ValidateEncoding_WithUnregisteredEncoding_ThrowsInvalidOperationException() { // Arrange - var registry = new MessageCompressionRegistry([]); + var registry = new MessageCompressionRegistry(); var options = new PublishCompressionOptions { CompressionEncoding = "unknown" }; // Act & Assert diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs index 0b1a99773..fa5aa6359 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs @@ -37,7 +37,7 @@ protected override async Task WhenAsync() SystemUnderTest.AddQueue(typeof(Message).FullName, new SqsSource { SqsQueue = _queue, - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }); SystemUnderTest.AddMessageMiddleware(_queue.QueueName, _futureHandler1); SystemUnderTest.AddMessageMiddleware(_queue.QueueName, _futureHandler2); diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs index b6ccf6eb9..7fcc393c2 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs @@ -40,8 +40,8 @@ protected override async Task WhenAsync() SystemUnderTest.AddMessageMiddleware(_queue1.QueueName, new InspectableMiddleware()); - var messageConverter1 = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); - var messageConverter2 = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter1 = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false); + var messageConverter2 = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false); SystemUnderTest.AddQueue("groupA", new SqsSource { SqsQueue = _queue1, diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs index f39734bc5..b7d10bf08 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs @@ -334,7 +334,7 @@ IEnumerable GetMessages(CancellationToken cancellationToken) var source = new SqsSource { SqsQueue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))), - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }; return source; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs index 4d9d9b72c..26eb151da 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs @@ -57,7 +57,7 @@ IEnumerable GetMessages() "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource { SqsQueue = queue, - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }) } }; @@ -110,7 +110,7 @@ IEnumerable GetMessages() { "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource { SqsQueue = queue, - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }) }, }; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs index 037c06814..4eb6a37d3 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs @@ -35,7 +35,7 @@ public WhenReceivingShouldStop(ITestOutputHelper testOutputHelper) Interlocked.Increment(ref _callCount); return Task.FromResult(messages.AsEnumerable()); }), - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }; _messageReceivePauseSignal = new MessageReceivePauseSignal(); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs index c51c63c07..664477167 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs @@ -35,7 +35,7 @@ public WhenSqsIsSlow(ITestOutputHelper testOutputHelper) Interlocked.Increment(ref _callCount); return messages; }), - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }; var monitor = new TrackingLoggingMonitor( diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs index 9010905d2..6c4942230 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs @@ -34,7 +34,7 @@ public WhenSubscriberIsSlow(ITestOutputHelper testOutputHelper) Interlocked.Increment(ref _callCount); return Task.FromResult(messages.AsEnumerable()); }), - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }; var monitor = new TrackingLoggingMonitor( diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs index 01fafa478..336cfce4e 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs @@ -37,7 +37,7 @@ public WhenThereAreNoSubscribers(ITestOutputHelper testOutputHelper) Interlocked.Increment(ref _callCount); return Task.FromResult(messages.AsEnumerable()); }), - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }; var monitor = new TrackingLoggingMonitor( diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index b99895413..74d3878a1 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -42,7 +42,7 @@ public async Task Add_Different_Handler_Per_Queue() var middleware1 = new InspectableMiddleware(); var middleware2 = new InspectableMiddleware(); - var messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])); + var messageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false); bus.AddMessageMiddleware(queueName1, middleware1); bus.AddMessageMiddleware(queueName2, middleware2); @@ -116,7 +116,7 @@ private static FakeSqsQueue TestQueue( QueueName = queueName, }; - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([]), new PublishCompressionOptions(), "TestJustSayingMessage"); + var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "TestJustSayingMessage"); List messages = [new TestMessage { Body = messageConverter.ConvertForPublish(message, null, PublishDestinationType.Queue).Body }]; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 019a3cb5b..8cb791892 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -57,6 +57,11 @@ private void GivenInternal() Monitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger()); MiddlewareMap = new MiddlewareMap(); CompletionMiddleware = new AwaitableMiddleware(OutputHelper); + SetupMessage = new SimpleMessage + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }; var testResolver = new InMemoryServiceResolver(OutputHelper, Monitor, sc => sc.AddSingleton>(Handler)); @@ -69,6 +74,7 @@ private void GivenInternal() Given(); } + public SimpleMessage SetupMessage { get; private set; } public AwaitableMiddleware CompletionMiddleware { get; set; } protected abstract void Given(); @@ -128,17 +134,17 @@ protected virtual Dictionary SetupBusCon }; } - protected static SqsSource CreateSuccessfulTestQueue(string queueName, params Message[] messages) + protected SqsSource CreateSuccessfulTestQueue(string queueName, params Message[] messages) { return CreateSuccessfulTestQueue(queueName, messages.AsEnumerable()); } - protected static SqsSource CreateSuccessfulTestQueue(string queueName, IEnumerable messages) + protected SqsSource CreateSuccessfulTestQueue(string queueName, IEnumerable messages) { return CreateSuccessfulTestQueue(queueName, ct => Task.FromResult(messages)); } - protected static SqsSource CreateSuccessfulTestQueue( + protected SqsSource CreateSuccessfulTestQueue( string queueName, Func>> messageProducer) { @@ -148,12 +154,8 @@ protected static SqsSource CreateSuccessfulTestQueue( { SqsQueue = sqsQueue, MessageConverter = new ReceivedMessageConverter(new FakeBodyDeserializer( - new SimpleMessage - { - RaisingComponent = "Component", - Id = Guid.NewGuid() - }), - new MessageCompressionRegistry([])) + SetupMessage), + new MessageCompressionRegistry(), false) }; } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs index 00f96d417..be3599766 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs @@ -18,7 +18,10 @@ public class WhenExactlyOnceIsAppliedToHandler(ITestOutputHelper testOutputHelpe protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", new TestMessage()); + _queue = CreateSuccessfulTestQueue("TestQueue", new TestMessage + { + Body = """{"Subject":"SimpleMessage", "Message": { "Content": "Hi"} }""" + }); Queues.Add(_queue); @@ -67,12 +70,7 @@ public void ProcessingIsPassedToTheHandler() public void MessageIsLocked() { // this should be part of setup to make work - var message = new SimpleMessage - { - RaisingComponent = "Component", - Id = Guid.NewGuid() - }; - var messageId = message.Id.ToString(); + var messageId = SetupMessage.Id.ToString(); var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent); tempLockRequests.Count().ShouldBeGreaterThan(0); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs index 86fafcda2..fb27abdf2 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs @@ -18,7 +18,10 @@ public class WhenExactlyOnceIsAppliedWithoutSpecificTimeout(ITestOutputHelper te protected override void Given() { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage()); + _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage + { + Body = """{"Subject":"SimpleMessage", "Message": { "Content": "Hi"} }""" + }); Queues.Add(_queue); _messageLock = new FakeMessageLock(); @@ -47,9 +50,9 @@ protected override async Task WhenAsync() var completion = SystemUnderTest.RunAsync(cts.Token); await Patiently.AssertThatAsync(OutputHelper, - () => Handler.ReceivedMessages.Any()); + () => !Handler.ReceivedMessages.IsEmpty); - cts.Cancel(); + await cts.CancelAsync(); await Assert.ThrowsAnyAsync(() => completion); } @@ -57,15 +60,9 @@ await Patiently.AssertThatAsync(OutputHelper, [Fact] public void MessageIsLocked() { - // this should be part of setup to make work - var message = new SimpleMessage - { - RaisingComponent = "Component", - Id = Guid.NewGuid() - }; - var messageId = message.Id.ToString(); + var messageId = SetupMessage.Id.ToString(); - var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent); + var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent).ToList(); tempLockRequests.ShouldNotBeEmpty(); foreach(var lockRequest in tempLockRequests) diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs index c9f83f501..19baac6a2 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs @@ -1,15 +1,17 @@ +using System.Text.Json; using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageProcessingStrategies; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenListeningStartsAndStops(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private const string AttributeMessageContentsRunning = """{ "Subject": "SimpleMessage", "Message": "Message Contents Running" }"""; - private const string AttributeMessageContentsAfterStop = """{ "Subject": "SimpleMessage", "Message": "Message Contents After Stop" }"""; - private int _expectedMaxMessageCount; private bool _running; private FakeSqsQueue _queue; @@ -21,8 +23,8 @@ protected override void Given() Logger.LogInformation("Expected max message count is {MaxMessageCount}", _expectedMaxMessageCount); - var response1 = new Message { Body = AttributeMessageContentsRunning }; - var response2 = new Message { Body = AttributeMessageContentsAfterStop } ; + var response1 = new Message { Body = $$"""{ "Subject": "SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Message Contents Running" }))}}" }""" }; + var response2 = new Message { Body = $$"""{ "Subject": "SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Message Contents After Stop" }))}}" }""" }; IEnumerable GetMessages(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) @@ -32,7 +34,14 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - var sqsSource = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), ct => Task.FromResult(GetMessages(ct))); + var sqsQueue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct)), Guid.NewGuid().ToString()); + + var sqsSource = new SqsSource + { + SqsQueue = sqsQueue, + MessageConverter = new ReceivedMessageConverter(new SystemTextJsonMessageBodySerializer(), new MessageCompressionRegistry(), false) + }; + _queue = sqsSource.SqsQueue as FakeSqsQueue; Queues.Add(sqsSource); @@ -62,7 +71,7 @@ public void TheMaxMessageAllowanceIsGrabbed() [Fact] public void MessageIsProcessed() { - // TODO - throw new NotImplementedException(); + Handler.ReceivedMessages.ShouldContain(m => m.Content.Equals("Message Contents Running")); + Handler.ReceivedMessages.ShouldNotContain(m => m.Content.Equals("Message Contents After Stop")); } } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs index 49afa6ffe..ad54e1b6d 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs @@ -1,13 +1,53 @@ -using JustSaying.AwsTools.MessageHandling; +using System.Text.Json; +using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; using Newtonsoft.Json; +using JsonSerializer = System.Text.Json.JsonSerializer; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; -public class WhenListeningWithMultipleGroups(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) +public class WhenListeningWithMultipleGroups : BaseSubscriptionGroupTests { - private readonly SqsSource _queueB = CreateSuccessfulTestQueue("C7506B3F-81DA-4898-82A5-C0293523592A", new TestMessage()); - private readonly SqsSource _queueA = CreateSuccessfulTestQueue("EC159934-A30E-45B0-9186-78853F7D3BED", new TestMessage()); + private readonly SqsSource _queueA; + private readonly SqsSource _queueB; + + public WhenListeningWithMultipleGroups(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + var queueA = new FakeSqsQueue(ct => + Task.FromResult(new List + { + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Hi" }))}}" }""" + } + }.AsEnumerable()), + "EC159934-A30E-45B0-9186-78853F7D3BED"); + var queueB = new FakeSqsQueue(ct => + Task.FromResult(new List + { + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Hi again" }))}}" }""" + } + }.AsEnumerable()), + "C7506B3F-81DA-4898-82A5-C0293523592A"); + + var messageConverter = new ReceivedMessageConverter(new SystemTextJsonMessageBodySerializer(), new MessageCompressionRegistry(), false); + _queueA = new SqsSource + { + SqsQueue = queueA, + MessageConverter = messageConverter + }; + _queueB = new SqsSource + { + SqsQueue = queueB, + MessageConverter = messageConverter + }; + } protected override Dictionary SetupBusConfig() { diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs index 6397fbb13..4e3bedbc7 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs @@ -23,21 +23,10 @@ protected override void Given() Queues.Add(sqsSource); } - [Fact] - public void MessagesGetDeserializedByCorrectHandler() - { - // SerializationRegister.ReceivedDeserializationRequests.ShouldAllBe( - // msg => msg == MessageBody); - // TODO - throw new NotImplementedException(); - } - [Fact] public void ProcessingIsPassedToTheHandlerForCorrectMessage() { - //Handler.ReceivedMessages.ShouldContain(SerializationRegister.DefaultDeserializedMessage()); - // TODO - throw new NotImplementedException(); + Handler.ReceivedMessages.ShouldContain(SetupMessage); } [Fact] diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs index cfbecf077..87f16a534 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs @@ -31,7 +31,7 @@ IEnumerable GetMessages(CancellationToken cancellationToken) var sqsSource = new SqsSource { SqsQueue = _queue, - MessageConverter = new ReceivedMessageConverter(new ThrowingMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new ThrowingMessageBodySerializer(), new MessageCompressionRegistry(), false) }; Queues.Add(sqsSource); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs index 552ab1008..e15bfd963 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs @@ -47,7 +47,7 @@ protected override void Given() Queues.Add(new SqsSource { SqsQueue = queue, - MessageConverter = new ReceivedMessageConverter(new FakeBodyDeserializer(_message), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new FakeBodyDeserializer(_message), new MessageCompressionRegistry(), false) }); } diff --git a/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs b/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs index 2e4309348..4c9471866 100644 --- a/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs @@ -50,7 +50,7 @@ public async Task ErrorHandlingAroundSqs_WithCustomPolicy_CanSwallowExceptions() "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource { SqsQueue = sqsQueue, - MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry([])) + MessageConverter = new ReceivedMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), false) }) } }; diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs index adfc60e31..976dd227e 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs @@ -18,7 +18,7 @@ protected override void WhenAction() _jsonMessage = SystemUnderTest.Serialize(_messageOut); //add extra property to see what happens: - _jsonMessage = _jsonMessage.Replace("{__", "{\"New\":\"Property\",__", StringComparison.OrdinalIgnoreCase); + _jsonMessage = _jsonMessage.Replace("{__", """{"New":"Property",__""", StringComparison.OrdinalIgnoreCase); _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } From 3657d8d3f71fd9393a8cf0df748f07512a7d6bb3 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 3 Oct 2024 01:21:53 +0100 Subject: [PATCH 27/41] Add more tests and cleanup code --- Directory.Build.props | 2 +- Directory.Packages.props | 1 + JustSaying.sln | 7 - .../Compression/MessageCompressionUtility.cs | 14 -- .../PublishMessageConverter.cs | 2 +- .../QueueAddressPublicationBuilder`1.cs | 11 +- .../Fluent/QueuePublicationBuilder`1.cs | 2 - .../ServiceResolver/DefaultServiceResolver.cs | 9 +- .../TopicAddressPublicationBuilder`1.cs | 9 +- .../AwsTools/WhenUsingABasicThrottle.cs | 4 +- .../Fluent/IntegrationTestBase.cs | 2 +- .../Fluent/MessagingBusBuilderTests.cs | 2 +- ...essageIsPublishedToAQueueWithAttributes.cs | 1 - ...ssageIsPublishedToAQueueWithCompression.cs | 1 - ...geIsPublishedToAQueueWithSystemTextJson.cs | 1 - ...essageIsPublishedToATopicWithAttributes.cs | 1 - ...geIsPublishedToATopicWithSystemTextJson.cs | 1 - .../WhenAMessageIsPublishedWithCompression.cs | 1 - ...henHandlingAMessageWithBinaryAttributes.cs | 1 - ...henHandlingAMessageWithStringAttributes.cs | 1 - .../JustSaying.IntegrationTests.csproj | 2 +- .../TestSettings.cs | 1 - .../AwsFactAttribute.cs | 4 - .../AwsTheoryAttribute.cs | 6 +- .../TestEnvironment.cs | 16 +- .../MessageCompressionUtilityTests.cs | 210 +++++++++--------- ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 4 - .../SubscriptionGroupCollectionTests.cs | 1 - .../Newtonsoft/WhenAskingForANewSerializer.cs | 26 --- .../WhenAskingForANewSerializer.cs | 24 -- 30 files changed, 141 insertions(+), 226 deletions(-) delete mode 100644 src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs delete mode 100644 tests/JustSaying.IntegrationTests/TestSettings.cs delete mode 100644 tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs delete mode 100644 tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs diff --git a/Directory.Build.props b/Directory.Build.props index f3cd972b4..3ea00783c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -43,7 +43,7 @@ latest enable $(PackageProjectUrl).git - true + true snupkg true true diff --git a/Directory.Packages.props b/Directory.Packages.props index 9b198fc9b..b2e21a85c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -19,6 +19,7 @@ + diff --git a/JustSaying.sln b/JustSaying.sln index 0fa5015b2..2c647d2fc 100644 --- a/JustSaying.sln +++ b/JustSaying.sln @@ -81,8 +81,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JustSaying.Extensions.Aws", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JustSaying.Extensions.Aws.Tests", "tests\JustSaying.Extensions.Aws.Tests\JustSaying.Extensions.Aws.Tests.csproj", "{1B99B357-5D76-4540-B28E-B6CD3F6F1963}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalAwsMessaging", "..\..\..\RiderProjects\ConsoleApp9\src\LocalAwsMessaging\LocalAwsMessaging.csproj", "{52311A75-232B-4466-B429-71C256710566}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -153,10 +151,6 @@ Global {1B99B357-5D76-4540-B28E-B6CD3F6F1963}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B99B357-5D76-4540-B28E-B6CD3F6F1963}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B99B357-5D76-4540-B28E-B6CD3F6F1963}.Release|Any CPU.Build.0 = Release|Any CPU - {52311A75-232B-4466-B429-71C256710566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52311A75-232B-4466-B429-71C256710566}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52311A75-232B-4466-B429-71C256710566}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52311A75-232B-4466-B429-71C256710566}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -182,7 +176,6 @@ Global {38DAC394-0A6E-4BB6-BCFC-8C21D2C64B3A} = {77C93C37-DE5B-448F-9A23-6C9D0C8465CA} {4EFC48D7-4B45-4EBC-9237-4B84FE8239E0} = {A94633F2-29F2-48C6-840A-C5370B300AE2} {1B99B357-5D76-4540-B28E-B6CD3F6F1963} = {E22A50F2-9952-4483-8AD1-09BE354FB3E4} - {52311A75-232B-4466-B429-71C256710566} = {A94633F2-29F2-48C6-840A-C5370B300AE2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {18FBDF85-C124-4444-9F03-D0D4F2B3A612} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs deleted file mode 100644 index a7dd6dd38..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/MessageCompressionUtility.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Text; -using System.Text.Json.Nodes; -using JustSaying.Messaging; -using JustSaying.Messaging.Compression; - -namespace JustSaying.AwsTools.MessageHandling; - -/// -/// Provides utility methods for compressing messages based on specified criteria. -/// -internal static class MessageCompressionUtility -{ - -} diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs index 7b09704f8..010e198c4 100644 --- a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs @@ -202,7 +202,7 @@ private static void AddMessageAttributes(DictionaryOptions specifying when and how to compress. /// Registry of available compression algorithms. /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). - private static (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) + public static (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) { string contentEncoding = null; string compressedMessage = null; diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index 1f4b0ec3a..f9ce8bb20 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -3,7 +3,6 @@ using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; using JustSaying.Messaging.Compression; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -20,6 +19,7 @@ public sealed class QueueAddressPublicationBuilder : IPublicationBuilder { private readonly QueueAddress _queueAddress; private PublishCompressionOptions _compressionOptions; + private string _subject; /// /// Initializes a new instance of the class. @@ -42,6 +42,13 @@ public QueueAddressPublicationBuilder WithCompression(PublishCompressionOptio return this; } + // TODO add tests + public QueueAddressPublicationBuilder WithSubject(string subject) + { + _subject = subject; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -52,7 +59,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa var config = bus.Config; var compressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions; var subjectProvider = bus.Config.MessageSubjectProvider; - var subject = subjectProvider.GetSubjectForType(typeof(T)); + var subject = _subject ?? subjectProvider.GetSubjectForType(typeof(T)); var eventPublisher = new SqsMessagePublisher( _queueAddress.QueueUrl, diff --git a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs index 6854674ed..e68517bd5 100644 --- a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs @@ -3,8 +3,6 @@ using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; using JustSaying.Messaging; -using JustSaying.Messaging.Compression; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index dc0ba41d9..77d176fe9 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -43,11 +43,10 @@ private object TryResolveService(Type desiredType) { return new NullOpMessageMonitor(); } - // TODO - // else if (desiredType == typeof(IMessageSerializationFactory)) - // { - // return new NewtonsoftSerializationFactory(); - // } + else if (desiredType == typeof(IMessageBodySerializer)) + { + return new NewtonsoftSerializationFactory(); + } else if (desiredType == typeof(MessageCompressionRegistry)) { return new MessageCompressionRegistry([new GzipMessageBodyCompression()]); diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 4d2862b5d..95768d8d4 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -21,6 +21,7 @@ public sealed class TopicAddressPublicationBuilder : IPublicationBuilder private readonly TopicAddress _topicAddress; private Func _exceptionHandler; private PublishCompressionOptions _compressionOptions; + private string _subject; /// /// Initializes a new instance of the class. @@ -59,6 +60,12 @@ public TopicAddressPublicationBuilder WithCompression(PublishCompressionOptio return this; } + public TopicAddressPublicationBuilder WithSubject(string subject) + { + _subject = subject; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -73,7 +80,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa var compressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions; var serializer = bus.MessageBodySerializerFactory.GetSerializer(); var subjectProvider = bus.Config.MessageSubjectProvider; - var subject = subjectProvider.GetSubjectForType(typeof(T)); + var subject = _subject ?? subjectProvider.GetSubjectForType(typeof(T)); var eventPublisher = new TopicAddressPublisher( proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(arn.Region)), diff --git a/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs b/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs index bec28a9b3..a84bb5761 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs @@ -40,7 +40,7 @@ public async Task Messages_Are_Throttled_But_Still_Delivered(int throttleMessage { await queue.CreateAsync(new SqsBasicConfiguration()); - if (!IsSimulator) + if (ServiceUri is not null) { // Wait for up to 60 secs for queue creation to be guaranteed completed by AWS using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(1)); @@ -105,7 +105,7 @@ await WhenAsync( async (publisher, listener, cancellationToken) => { var stopwatch = Stopwatch.StartNew(); - var delay = IsSimulator ? TimeSpan.FromMilliseconds(100) : TimeSpan.FromSeconds(5); + var delay = (ServiceUri is null) ? TimeSpan.FromMilliseconds(100) : TimeSpan.FromSeconds(5); await listener.StartAsync(cancellationToken); diff --git a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs index 719eb5326..751004718 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs @@ -8,7 +8,7 @@ using JustSaying.Messaging.MessageHandling; using JustSaying.Models; using JustSaying.TestingFramework; -using LocalAwsMessaging; +using LocalSqsSnsMessaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NSubstitute; diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs index 031b6354b..44ab80d19 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs @@ -4,7 +4,7 @@ using JustSaying.Messaging.Monitoring; using JustSaying.Models; using JustSaying.TestingFramework; -using LocalAwsMessaging; +using LocalSqsSnsMessaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs index d2caf138e..df3e28e67 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs @@ -31,7 +31,6 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName)) - //.AddSingleton() TODO .AddSingleton>(handler); var message = new SimpleMessage diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs index a8380e980..676e31cd9 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs @@ -30,7 +30,6 @@ public async Task Then_The_Message_Is_Handled() }; }); })) - //.AddSingleton() TODO .AddSingleton>(handler); var message = new SimpleMessage diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs index 3333397fa..66fe06bad 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs @@ -17,7 +17,6 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackQueue(UniqueName)) - //.AddSingleton() TODO .AddSingleton(handler); string content = Guid.NewGuid().ToString(); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs index 4c039baba..bdd64fdd7 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs @@ -17,7 +17,6 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackTopic(UniqueName)) - //.AddSingleton() TODO .AddSingleton>(handler); string content = Guid.NewGuid().ToString(); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs index 1104c4c0c..ed96527fc 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs @@ -16,7 +16,6 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackTopic(UniqueName)) - //.AddSingleton() TODO .AddSingleton>(handler); string content = Guid.NewGuid().ToString(); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs index 6f2356471..ac1169d8d 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs @@ -28,7 +28,6 @@ public async Task Then_The_Message_Is_Handled() }; }); })) - //.AddSingleton() TODO .AddSingleton>(handler); var message = new SimpleMessage diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs index dc62ad1fb..a555fc3f4 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs @@ -34,7 +34,6 @@ public async Task Then_The_Attributes_Are_Returned() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder .WithLoopbackTopic(UniqueName)) - //.AddSingleton() TODO .AddSingleton>(handler); await WhenAsync( diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs index a8bf209bc..6db1a520f 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs @@ -33,7 +33,6 @@ public async Task Then_The_Attributes_Are_Returned() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder .WithLoopbackTopic(UniqueName)) - //.AddSingleton() TODO .AddSingleton>(handler); await WhenAsync( diff --git a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj index f35b60279..059df017e 100644 --- a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj +++ b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj @@ -9,13 +9,13 @@ - + diff --git a/tests/JustSaying.IntegrationTests/TestSettings.cs b/tests/JustSaying.IntegrationTests/TestSettings.cs deleted file mode 100644 index 929e22c3f..000000000 --- a/tests/JustSaying.IntegrationTests/TestSettings.cs +++ /dev/null @@ -1 +0,0 @@ -// [assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs index abbde16c2..09ce62a25 100644 --- a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs +++ b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs @@ -7,9 +7,5 @@ public sealed class AwsFactAttribute : FactAttribute { public AwsFactAttribute() { - if (!TestEnvironment.IsSimulatorConfigured && !TestEnvironment.HasCredentials) - { - Skip = "This test requires either an AWS simulator URL or AWS credentials to be configured."; - } } } diff --git a/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs b/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs index b6ca18d36..e35512a17 100644 --- a/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs +++ b/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs @@ -8,9 +8,5 @@ public sealed class AwsTheoryAttribute : TheoryAttribute public AwsTheoryAttribute() : base() { - if (!TestEnvironment.IsSimulatorConfigured && !TestEnvironment.HasCredentials) - { - Skip = "This test requires either an AWS simulator URL or AWS credentials to be configured."; - } } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/TestEnvironment.cs b/tests/JustSaying.TestingFramework/TestEnvironment.cs index 41de48542..e6b47333e 100644 --- a/tests/JustSaying.TestingFramework/TestEnvironment.cs +++ b/tests/JustSaying.TestingFramework/TestEnvironment.cs @@ -45,15 +45,13 @@ public static Uri SimulatorUrl { get { - // TODO Undo this change - return new Uri("http://localhost:4566", UriKind.Absolute); - // var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); - // if (string.IsNullOrWhiteSpace(awsEnv)) - // { - // return null; - // } - // - // return new Uri(awsEnv, UriKind.Absolute); + var awsEnv = Environment.GetEnvironmentVariable("AWS_SERVICE_URL"); + if (string.IsNullOrWhiteSpace(awsEnv)) + { + return null; + } + + return new Uri(awsEnv, UriKind.Absolute); } } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs index 33e4ad7e4..ab289b243 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionUtilityTests.cs @@ -1,106 +1,104 @@ -// using JustSaying.Messaging; -// using JustSaying.Messaging.Compression; -// using JustSaying.AwsTools.MessageHandling; -// -// namespace JustSaying.UnitTests.AwsTools.MessageHandling; -// -// public class MessageCompressionUtilityTests -// { -// private readonly MessageCompressionRegistry _compressionRegistry; -// -// public MessageCompressionUtilityTests() -// { -// _compressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); -// } -// -// [Fact] -// public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() -// { -// // Arrange -// var message = "Test message"; -// var metadata = new PublishMetadata(); -// var compressionOptions = new PublishCompressionOptions(); -// -// // Act -// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); -// -// // Assert -// Assert.Null(result.compressedMessage); -// Assert.Null(result.contentEncoding); -// } -// -// [Fact] -// public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMessage() -// { -// // Arrange -// var message = "Short message"; -// var metadata = new PublishMetadata(); -// var compressionOptions = new PublishCompressionOptions -// { -// CompressionEncoding = ContentEncodings.GzipBase64, -// MessageLengthThreshold = 1000 -// }; -// -// // Act -// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); -// -// // Assert -// Assert.Null(result.compressedMessage); -// Assert.Null(result.contentEncoding); -// } -// -// [Fact] -// public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMessage() -// { -// // Arrange -// var message = new string('a', 1000); -// var metadata = new PublishMetadata(); -// var compressionOptions = new PublishCompressionOptions -// { -// CompressionEncoding = ContentEncodings.GzipBase64, -// MessageLengthThreshold = 500 -// }; -// -// // Act -// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); -// -// // Assert -// Assert.NotNull(result.compressedMessage); -// Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); -// -// // Verify that the compressed message can be decompressed -// var gzipCompression = new GzipMessageBodyCompression(); -// var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); -// Assert.Equal(message, decompressedMessage); -// } -// -// [Fact] -// public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() -// { -// // Arrange -// var message = "Test message"; -// var metadata = new PublishMetadata(); -// metadata.AddMessageAttribute("Key1", new MessageAttributeValue { StringValue = "Value1", DataType = "String" }); -// metadata.AddMessageAttribute("Key2", new MessageAttributeValue { BinaryValue = new byte[100], DataType = "Binary" }); -// -// var compressionOptions = new PublishCompressionOptions -// { -// CompressionEncoding = ContentEncodings.GzipBase64, -// MessageLengthThreshold = 50 -// }; -// -// // Act -// var result = MessageCompressionUtility.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); -// -// // Assert -// Assert.NotNull(result.compressedMessage); -// Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); -// -// // Verify that the compressed message can be decompressed -// var gzipCompression = new GzipMessageBodyCompression(); -// var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); -// Assert.Equal(message, decompressedMessage); -// } -// } - -// TODO +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.AwsTools.MessageHandling; + +namespace JustSaying.UnitTests.AwsTools.MessageHandling; + +public class MessageCompressionUtilityTests +{ + private readonly MessageCompressionRegistry _compressionRegistry; + + public MessageCompressionUtilityTests() + { + _compressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); + } + + [Fact] + public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() + { + // Arrange + var message = "Test message"; + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions(); + + // Act + var result = PublishMessageConverter.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + + // Assert + Assert.Null(result.compressedMessage); + Assert.Null(result.contentEncoding); + } + + [Fact] + public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMessage() + { + // Arrange + var message = "Short message"; + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 1000 + }; + + // Act + var result = PublishMessageConverter.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + + // Assert + Assert.Null(result.compressedMessage); + Assert.Null(result.contentEncoding); + } + + [Fact] + public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMessage() + { + // Arrange + var message = new string('a', 1000); + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 500 + }; + + // Act + var result = PublishMessageConverter.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } + + [Fact] + public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() + { + // Arrange + var message = "Test message"; + var metadata = new PublishMetadata(); + metadata.AddMessageAttribute("Key1", new MessageAttributeValue { StringValue = "Value1", DataType = "String" }); + metadata.AddMessageAttribute("Key2", new MessageAttributeValue { BinaryValue = new byte[100], DataType = "Binary" }); + + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 50 + }; + + // Act + var result = PublishMessageConverter.CompressMessageBody(message, metadata, PublishDestinationType.Topic, compressionOptions, _compressionRegistry); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index 48dba5f6e..71d57d08e 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -47,10 +47,6 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - // TODO make work - // _serializationRegister.Serialize(_testMessage, false) - // .Returns("serialized_contents"); - Sqs.SendMessageAsync(Arg.Any()) .Returns(PublishResult); } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index 74d3878a1..02810d87e 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -106,7 +106,6 @@ private JustSaying.JustSayingBus CreateBus() return bus; } - // TODO remove redundant code private static FakeSqsQueue TestQueue( string queueName, Action spy = null) diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs deleted file mode 100644 index 0d67f0ac5..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs +++ /dev/null @@ -1,26 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.TestingFramework; - -namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; - -// TODO -// public class WhenAskingForANewSerializer : XBehaviourTest -// { -// private IMessageSerializer _result; -// -// protected override void Given() -// { -// -// } -// -// protected override void WhenAction() -// { -// _result = SystemUnderTest.GetSerializer(); -// } -// -// [Fact] -// public void OneIsProvided() -// { -// _result.ShouldNotBeNull(); -// } -// } diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs deleted file mode 100644 index 26154d409..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs +++ /dev/null @@ -1,24 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.TestingFramework; - -namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -// TODO -// public class WhenAskingForANewSerializer : XBehaviourTest -// { -// private IMessageSerializer _result; -// -// protected override void Given() -// { -// } -// -// protected override void WhenAction() -// { -// _result = SystemUnderTest.GetSerializer(); -// } -// -// [Fact] -// public void OneIsProvided() -// { -// _result.ShouldNotBeNull(); -// } -// } From d644e489f0416fb0532e09cc3840d6022134a7a9 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 3 Oct 2024 10:31:16 +0100 Subject: [PATCH 28/41] More tidy up --- .../GenericMessageSubjectProvider.cs | 1 - .../IMessageSerialisationRegister.cs | 33 ----- .../IMessageSerialiser.cs | 35 ----- .../IMessageSerializationFactory.cs | 8 + ...s => NewtonsoftMessageBodySerializer`1.cs} | 0 ...SystemTextJsonMessageBodySerializerBase.cs | 29 ++++ .../SystemTextJsonSerializationFactory.cs | 16 -- .../SystemTextJsonSerializer.cs | 139 +++--------------- 8 files changed, 59 insertions(+), 202 deletions(-) delete mode 100644 src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs rename src/JustSaying/Messaging/MessageSerialization/{NewtonsoftSerializer.cs => NewtonsoftMessageBodySerializer`1.cs} (100%) create mode 100644 src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs delete mode 100644 src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs diff --git a/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs b/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs index 7d575efff..b3e9e9b48 100644 --- a/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs +++ b/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs @@ -1,4 +1,3 @@ -using System.Reflection; using System.Text.RegularExpressions; using JustSaying.Extensions; diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs deleted file mode 100644 index 1c0660d27..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs +++ /dev/null @@ -1,33 +0,0 @@ -using JustSaying.Messaging.MessageHandling; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -// internal interface IMessageSerializationRegister -// { -// /// -// /// Deserializes a message. -// /// -// /// Message must always have Subject and Message properties -// /// The and -// /// returned from the body of the SQS message. -// Message DeserializeMessage(string body); -// -// /// -// /// Serializes a message for publishing -// /// -// /// -// /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: -// /// new { Subject = message.GetType().Name, Message = serializedMessage }; -// /// -// /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties -// /// -// /// The serialized message for publishing. -// string Serialize(Message message, bool serializeForSnsPublishing); -// -// /// -// /// Register a serializer for the given type, if one does not already exist. -// /// -// /// The type to register a serializer for. -// void AddSerializer() where T : Message; -// } diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs index 607b46996..a5aa73dee 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs @@ -1,44 +1,9 @@ -using JustSaying.Messaging.MessageHandling; using JustSaying.Models; namespace JustSaying.Messaging.MessageSerialization; -// public interface IMessageSerializer -// { -// string GetMessageSubject(string sqsMessage); -// -// Message Deserialize(string message, Type type); -// -// /// -// /// Serializes a message for publishing -// /// -// /// -// /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: -// /// new { Subject = subject, Message = serializedMessage }; -// /// -// /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties -// /// -// /// -// string Serialize(Message message, bool serializeForSnsPublishing, string subject); -// } - public interface IMessageBodySerializer { string Serialize(Message message); Message Deserialize(string message); } - - -// public sealed class MessageEnvelopeWrapper : IMessageEnvelopeWrapper -// { -// public string Serialize(string messageBody, string typeIdentifier) -// { -// return messageBody; -// } -// -// public string Deserialize(string message) -// { -// return message; -// } -// } -// diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs index 2e5b8a16e..6bcdbc314 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs @@ -2,7 +2,15 @@ namespace JustSaying.Messaging.MessageSerialization; +/// +/// Defines a factory for creating message body serializers. +/// public interface IMessageBodySerializationFactory { + /// + /// Gets a serializer for messages of type . + /// + /// The type of message for which to get a serializer. Must inherit from . + /// An capable of serializing and deserializing messages of type . IMessageBodySerializer GetSerializer() where T : Message; } diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs similarity index 100% rename from src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs rename to src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs new file mode 100644 index 000000000..bddbf20e5 --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs @@ -0,0 +1,29 @@ +namespace JustSaying.Messaging.MessageSerialization; + +using System.Text.Json; +using System.Text.Json.Serialization; + +/// +/// Provides a base class for System.Text.Json-based message body serializers with default serialization options. +/// +public abstract class SystemTextJsonMessageBodySerializerBase +{ + /// + /// Gets the default JSON serializer options used by derived serializers. + /// + /// + /// These options include: + /// + /// Ignoring null values when writing JSON. + /// Using a for enum serialization. + /// + /// + private protected static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonStringEnumConverter(), + }, + }; +} diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs deleted file mode 100644 index f233b9110..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Text.Json; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -// public class SystemTextJsonSerializationFactory(JsonSerializerOptions options) : IMessageSerializationFactory -// { -// private readonly SystemTextJsonSerializer _serializer = new(options); -// -// public SystemTextJsonSerializationFactory() -// : this(null) -// { -// } -// -// public IMessageSerializer GetSerializer() where T : Message => _serializer; -// } diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs index b1e32169e..0703a81ed 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs @@ -1,145 +1,50 @@ using System.Text.Json; -using System.Text.Json.Serialization; -using JustSaying.Messaging.MessageHandling; using JustSaying.Models; namespace JustSaying.Messaging.MessageSerialization; -// /// -// /// A class representing an implementation of for the System.Text.Json serializer. -// /// -// public class SystemTextJsonSerializer : IMessageSerializer -// { -// private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() -// { -// DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, -// Converters = -// { -// new JsonStringEnumConverter(), -// }, -// }; -// -// private readonly JsonSerializerOptions _options; -// -// /// -// /// Initializes a new instance of the class. -// /// -// public SystemTextJsonSerializer() -// : this(null) -// { -// } -// -// /// -// /// Initializes a new instance of the class. -// /// -// /// The optional to use. -// public SystemTextJsonSerializer(JsonSerializerOptions options) -// { -// _options = options ?? DefaultJsonSerializerOptions; -// } -// -// /// -// public string GetMessageSubject(string sqsMessage) -// { -// using var body = JsonDocument.Parse(sqsMessage); -// string subject = string.Empty; -// -// if (body.RootElement.TryGetProperty("Subject", out var value)) -// { -// subject = value.GetString() ?? string.Empty; -// } -// -// return subject; -// } -// -// public MessageAttributes GetMessageAttributes(string message) -// { -// using var jsonDocument = JsonDocument.Parse(message); -// -// if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) -// { -// return new MessageAttributes(); -// } -// -// var attributes = new Dictionary(); -// foreach(var obj in attributesElement.EnumerateObject()) -// { -// var dataType = obj.Value.GetProperty("Type").GetString(); -// var dataValue = obj.Value.GetProperty("Value").GetString(); -// -// var isString = dataType == "String"; -// -// attributes.Add(obj.Name, new MessageAttributeValue() -// { -// DataType = dataType, -// StringValue = isString ? dataValue : null, -// BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null -// }); -// } -// -// return new MessageAttributes(attributes); -// } -// -// /// -// public Message Deserialize(string message, Type type) -// { -// using var document = JsonDocument.Parse(message); -// JsonElement element = document.RootElement.GetProperty("Message"); -// string json = element.ToString(); -// return (Message)JsonSerializer.Deserialize(json, type, _options); -// } -// -// /// -// public string Serialize(Message message, bool serializeForSnsPublishing, string subject) -// { -// string json = JsonSerializer.Serialize(message, message.GetType(), _options); -// -// // AWS SNS service will add Subject and Message properties automatically, -// // so just return plain message -// if (serializeForSnsPublishing) -// { -// return json; -// } -// -// // For direct publishing to SQS, add Subject and Message properties manually -// var context = new { Subject = subject, Message = json }; -// return JsonSerializer.Serialize(context, _options); -// } -// } - -public class SystemTextJsonMessageBodySerializer : SystemTextJsonMessageBodySerializerBase, IMessageBodySerializer where T: Message +/// +/// Provides serialization and deserialization functionality for messages of type using System.Text.Json. +/// +/// The type of message to be serialized or deserialized. Must inherit from . +public sealed class SystemTextJsonMessageBodySerializer : SystemTextJsonMessageBodySerializerBase, IMessageBodySerializer where T: Message { private readonly JsonSerializerOptions _options; + /// + /// Initializes a new instance of the class with default JSON serializer options. + /// public SystemTextJsonMessageBodySerializer() { _options = DefaultJsonSerializerOptions; } + /// + /// Initializes a new instance of the class with custom JSON serializer options. + /// + /// The custom to use for serialization and deserialization. public SystemTextJsonMessageBodySerializer(JsonSerializerOptions options) { _options = options; } + /// + /// Serializes a message to its JSON string representation. + /// + /// The message to serialize. + /// A JSON string representation of the message. public string Serialize(Message message) { return JsonSerializer.Serialize(message, message.GetType(), _options); } + /// + /// Deserializes a JSON string to a message of type . + /// + /// The JSON string to deserialize. + /// A deserialized message of type . public Message Deserialize(string messageBody) { return JsonSerializer.Deserialize(messageBody, _options); } } - -public class SystemTextJsonMessageBodySerializerBase -{ - private protected static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() - { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - Converters = - { - new JsonStringEnumConverter(), - }, - }; -} From 6c049480872cfb83921111ae98009798a3343391 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 3 Oct 2024 10:50:51 +0100 Subject: [PATCH 29/41] More tidy up --- .../IMessageSerialiser.cs | 14 ++++++ .../NewtonsoftMessageBodySerializer`1.cs | 31 +++++++++++- .../NewtonsoftSerializationFactory.cs | 2 +- ...lizer.cs => SystemTextJsonSerializer`1.cs} | 0 .../Fluent/IntegrationTestBase.cs | 22 --------- .../RawDelivery/WhenUsingRawDelivery.cs | 1 + .../JustSaying.IntegrationTests.csproj | 1 - .../JustSaying.TestingFramework.csproj | 1 + .../LocalAwsClientFactory.cs | 48 ++++++++----------- 9 files changed, 65 insertions(+), 55 deletions(-) rename src/JustSaying/Messaging/MessageSerialization/{SystemTextJsonSerializer.cs => SystemTextJsonSerializer`1.cs} (100%) diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs index a5aa73dee..57ff5d149 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs @@ -2,8 +2,22 @@ namespace JustSaying.Messaging.MessageSerialization; +/// +/// Defines the contract for serializing and deserializing message bodies. +/// public interface IMessageBodySerializer { + /// + /// Serializes a message into a string representation. + /// + /// The message to serialize. + /// A string representation of the serialized message. string Serialize(Message message); + + /// + /// Deserializes a string representation back into a message object. + /// + /// The string representation of the message to deserialize. + /// The deserialized message object. Message Deserialize(string message); } diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs index e555483d6..53485b2fe 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs @@ -1,13 +1,26 @@ -using System.Text.RegularExpressions; using JustSaying.Models; using Newtonsoft.Json; namespace JustSaying.Messaging.MessageSerialization; -public class NewtonsoftMessageBodySerializer : IMessageBodySerializer where T: Message +/// +/// Provides serialization and deserialization functionality for messages of type using Newtonsoft.Json. +/// +/// The type of message to be serialized or deserialized. Must inherit from . +public sealed class NewtonsoftMessageBodySerializer : IMessageBodySerializer where T: Message { private readonly JsonSerializerSettings _settings; + /// + /// Initializes a new instance of the class with default JSON serializer settings. + /// + /// + /// Default settings include: + /// + /// Ignoring null values when serializing. + /// Using a for enum serialization. + /// + /// public NewtonsoftMessageBodySerializer() { _settings = new JsonSerializerSettings @@ -17,16 +30,30 @@ public NewtonsoftMessageBodySerializer() }; } + /// + /// Initializes a new instance of the class with custom JSON serializer settings. + /// + /// The custom to use for serialization and deserialization. public NewtonsoftMessageBodySerializer(JsonSerializerSettings settings) { _settings = settings; } + /// + /// Serializes a message to its JSON string representation. + /// + /// The message to serialize. + /// A JSON string representation of the message. public string Serialize(Message message) { return JsonConvert.SerializeObject(message, _settings); } + /// + /// Deserializes a JSON string to a message of type . + /// + /// The JSON string to deserialize. + /// A deserialized message of type . public Message Deserialize(string message) { return JsonConvert.DeserializeObject(message, _settings); diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs index 3d1239e7b..0fbb2c7c4 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs @@ -3,7 +3,7 @@ namespace JustSaying.Messaging.MessageSerialization; -public class NewtonsoftSerializationFactory(JsonSerializerSettings settings = null) : IMessageBodySerializationFactory +public sealed class NewtonsoftSerializationFactory(JsonSerializerSettings settings = null) : IMessageBodySerializationFactory { public IMessageBodySerializer GetSerializer() where T : Message => new NewtonsoftMessageBodySerializer(settings); } diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer`1.cs similarity index 100% rename from src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs rename to src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer`1.cs diff --git a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs index 751004718..d109688fe 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs @@ -1,8 +1,5 @@ using System.Diagnostics; -using Amazon; using Amazon.Runtime; -using Amazon.SimpleNotificationService; -using Amazon.SQS; using JustSaying.AwsTools; using JustSaying.Messaging; using JustSaying.Messaging.MessageHandling; @@ -139,22 +136,3 @@ protected async Task RunActionWithTimeout(Func action) await actionTask; } } - -public sealed class LocalAwsClientFactory : IAwsClientFactory -{ - private readonly InMemoryAwsBus _bus; - - public LocalAwsClientFactory(InMemoryAwsBus bus) - { - _bus = bus; - } - public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) - { - return _bus.CreateSnsClient(); - } - - public IAmazonSQS GetSqsClient(RegionEndpoint region) - { - return _bus.CreateSqsClient(); - } -} diff --git a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs index cc08ac61e..aebb52b63 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs @@ -1,3 +1,4 @@ +using JustSaying.IntegrationTests; using JustSaying.IntegrationTests.Fluent; using JustSaying.Messaging.MessageHandling; using JustSaying.TestingFramework; diff --git a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj index 059df017e..cc47188fa 100644 --- a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj +++ b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj @@ -15,7 +15,6 @@ - diff --git a/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj b/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj index 2eb504355..f24d52a10 100644 --- a/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj +++ b/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj @@ -8,6 +8,7 @@ + diff --git a/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs b/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs index 6eb37c63f..b0b085d64 100644 --- a/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs +++ b/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs @@ -1,36 +1,26 @@ using Amazon; -using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SQS; using JustSaying.AwsTools; +using LocalSqsSnsMessaging; namespace JustSaying.TestingFramework; -// public class LocalAwsClientFactory(Uri serviceUrl) : IAwsClientFactory -// { -// private Uri ServiceUrl { get; } = serviceUrl; -// -// public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) -// { -// var credentials = new AnonymousAWSCredentials(); -// var clientConfig = new AmazonSimpleNotificationServiceConfig -// { -// RegionEndpoint = region, -// ServiceURL = ServiceUrl.ToString() -// }; -// -// return new AmazonSimpleNotificationServiceClient(credentials, clientConfig); -// } -// -// public IAmazonSQS GetSqsClient(RegionEndpoint region) -// { -// var credentials = new AnonymousAWSCredentials(); -// var clientConfig = new AmazonSQSConfig -// { -// RegionEndpoint = region, -// ServiceURL = ServiceUrl.ToString() -// }; -// -// return new AmazonSQSClient(credentials, clientConfig); -// } -// } +public sealed class LocalAwsClientFactory : IAwsClientFactory +{ + private readonly InMemoryAwsBus _bus; + + public LocalAwsClientFactory(InMemoryAwsBus bus) + { + _bus = bus; + } + public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) + { + return _bus.CreateSnsClient(); + } + + public IAmazonSQS GetSqsClient(RegionEndpoint region) + { + return _bus.CreateSqsClient(); + } +} From cb8e0fde8da7fb7ec81e789852493b50d7698739 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 3 Oct 2024 10:57:13 +0100 Subject: [PATCH 30/41] More tidy up --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index b2e21a85c..666076147 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,7 +33,7 @@ - + From fe1d325ee1776d1fe892d18d5ef42d1e46a37f55 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 3 Oct 2024 11:42:08 +0100 Subject: [PATCH 31/41] More tidy up --- src/JustSaying/JustSaying.csproj | 1 - .../PublicAPI/net461/PublicAPI.Unshipped.txt | 158 ++++++++++++++++-- .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 158 ++++++++++++++++-- .../netstandard2.0/PublicAPI.Unshipped.txt | 158 ++++++++++++++++-- .../Fluent/ActionRunnerTest.cs | 38 ----- 5 files changed, 432 insertions(+), 81 deletions(-) delete mode 100644 tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index bae498f67..8b88dc73e 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -2,7 +2,6 @@ true netstandard2.0;net461;net8.0 - $(NoWarn);RS0016;RS0017;RS0026 diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index b0477dac3..4bd1aba8e 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -5,22 +5,33 @@ JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncodin JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void +JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection JustSaying.Messaging.Compression.ContentEncodings JustSaying.Messaging.Compression.GzipMessageBodyCompression JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string @@ -31,11 +42,130 @@ JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry) -> void +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void +JustSaying.Messaging.IPublishMessageConverter +JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string +JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary +JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string +JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase.SystemTextJsonMessageBodySerializerBase() -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher + diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index b0477dac3..4bd1aba8e 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -5,22 +5,33 @@ JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncodin JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void +JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection JustSaying.Messaging.Compression.ContentEncodings JustSaying.Messaging.Compression.GzipMessageBodyCompression JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string @@ -31,11 +42,130 @@ JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry) -> void +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void +JustSaying.Messaging.IPublishMessageConverter +JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string +JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary +JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string +JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase.SystemTextJsonMessageBodySerializerBase() -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher + diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index b0477dac3..4bd1aba8e 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -5,22 +5,33 @@ JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncodin JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionOptions.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.CompressionRegistry.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionOptions.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.get -> JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.CompressionRegistry.set -> void +JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void +JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection JustSaying.Messaging.Compression.ContentEncodings JustSaying.Messaging.Compression.GzipMessageBodyCompression JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string @@ -31,11 +42,130 @@ JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.IMessageCompressionRegistry -JustSaying.Messaging.Compression.IMessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory, JustSaying.Messaging.Compression.IMessageCompressionRegistry compressionRegistry) -> void +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void +JustSaying.Messaging.IPublishMessageConverter +JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string +JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary +JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string +JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase.SystemTextJsonMessageBodySerializerBase() -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher + diff --git a/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs b/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs deleted file mode 100644 index 397729732..000000000 --- a/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs +++ /dev/null @@ -1,38 +0,0 @@ -// namespace JustSaying.IntegrationTests.Fluent; -// -// public class ActionRunnerTest(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) -// { -// protected override TimeSpan Timeout => TimeSpan.FromSeconds(2); -// -// [Fact] -// public async Task TestRunnerWillSucceedOnSuccessfulTask() -// { -// static async Task SuccessTask(CancellationToken ctx) => -// await Task.Delay(100, ctx); -// -// await RunActionWithTimeout(SuccessTask); -// } -// -// [Fact] -// public async Task TestRunnerWillThrowOnTimeout() -// { -// async Task TimeoutTask(CancellationToken ctx) => -// await Task.Delay(Timeout.Add(Timeout), ctx); -// -// await Assert.ThrowsAsync( -// () => RunActionWithTimeout(TimeoutTask)); -// } -// -// [Fact] -// public async Task TestRunnerWillThrowOnFailure() -// { -// static async Task ThrowingTask(CancellationToken ctx) -// { -// await Task.Delay(100, ctx); -// throw new InvalidOperationException(); -// } -// -// await Assert.ThrowsAsync( -// () => RunActionWithTimeout(ThrowingTask)); -// } -// } From 8ca09adab024416be842f9c9fc7fcca0539db89e Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Thu, 3 Oct 2024 11:59:47 +0100 Subject: [PATCH 32/41] More tidy up --- .../Fluent/ServiceResolver/DefaultServiceResolver.cs | 2 +- .../Fluent/WhenUsingDefaultServiceResolver.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index 77d176fe9..b1ab1a126 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -43,7 +43,7 @@ private object TryResolveService(Type desiredType) { return new NullOpMessageMonitor(); } - else if (desiredType == typeof(IMessageBodySerializer)) + else if (desiredType == typeof(IMessageBodySerializationFactory)) { return new NewtonsoftSerializationFactory(); } diff --git a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs index 95ee32fb2..5bb32006b 100644 --- a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs +++ b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs @@ -35,11 +35,11 @@ public void ShouldResolveIMessagingConfigToMessagingConfig() _sut.ResolveService().ShouldBeOfType(); } - // [Fact] - // public void ShouldResolveIMessageSerializationFactoryToNewtonsoftSerializationFactory() - // { - // _sut.ResolveService().ShouldBeOfType(); - // } + [Fact] + public void ShouldResolveIMessageSerializationFactoryToNewtonsoftSerializationFactory() + { + _sut.ResolveService().ShouldBeOfType(); + } [Fact] public void ShouldResolveIMessageSubjectProviderToNonGenericMessageSubjectProvider() From d2b2a8fa3752676d9cef3de6123341c13111a202 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 4 Oct 2024 09:05:18 +0100 Subject: [PATCH 33/41] Apply some feedback --- .../PublishMessageConverter.cs | 150 +----------------- .../ReceivedMessageConverter.cs | 142 +++++++++++++++++ .../MessageHandling/SqsMessagePublisher.cs | 2 +- .../TopicAddressPublicationBuilder`1.cs | 2 - .../Channels/SubscriptionGroups/SqsSource.cs | 9 ++ .../SubscriptionGroupFactory.cs | 2 +- .../SubscriptionGroupSettings.cs | 6 - .../Messaging/Compression/ContentEncodings.cs | 2 +- .../MessageHandling/MessageAttributes.cs | 2 +- .../MessageSerialization/PublishMessage.cs | 22 +++ .../MessageSerialization/ReceivedMessage.cs | 21 --- 11 files changed, 185 insertions(+), 175 deletions(-) create mode 100644 src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs create mode 100644 src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs create mode 100644 src/JustSaying/Messaging/MessageSerialization/PublishMessage.cs diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs index 010e198c4..63303c69f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs @@ -1,153 +1,13 @@ using System.Text; -using System.Text.Json; using System.Text.Json.Nodes; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Compression; -using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; namespace JustSaying.Messaging; -internal sealed class ReceivedMessageConverter : IReceivedMessageConverter -{ - private readonly IMessageBodySerializer _bodySerializer; - private readonly MessageCompressionRegistry _compressionRegistry; - private readonly bool _isRawMessage; - - public ReceivedMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, bool isRawMessage) - { - _bodySerializer = bodySerializer; - _compressionRegistry = compressionRegistry; - _isRawMessage = isRawMessage; - } - - public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) - { - string body = message.Body; - var attributes = GetMessageAttributes(message, body); - - if (body is not null && !_isRawMessage) - { - var jsonNode = JsonNode.Parse(body); - if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) - { - body = messageNode!.ToString(); - } - } - body = ApplyBodyDecompression(body, attributes); - var result = _bodySerializer.Deserialize(body); - return new ReceivedMessage(result, attributes); - } - - private string ApplyBodyDecompression(string body, MessageAttributes attributes) - { - var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); - if (contentEncoding is not null) - { - var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); - if (decompressor is null) - { - throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); - } - - body = decompressor.Decompress(body); - } - - return body; - } - - private static MessageAttributes GetMessageAttributes(Amazon.SQS.Model.Message message, string body) - { - bool isSnsPayload = IsSnsPayload(body); - var attributes = isSnsPayload ? GetMessageAttributes(body) : GetRawMessageAttributes(message); - - return attributes; - } - - private static MessageAttributes GetMessageAttributes(string message) - { - using var jsonDocument = JsonDocument.Parse(message); - - if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) - { - return new MessageAttributes(); - } - - Dictionary attributes = new(); - foreach(var obj in attributesElement.EnumerateObject()) - { - var dataType = obj.Value.GetProperty("Type").GetString(); - var dataValue = obj.Value.GetProperty("Value").GetString(); - - var isString = dataType == "String"; - - attributes.Add(obj.Name, new MessageAttributeValue - { - DataType = dataType, - StringValue = isString ? dataValue : null, - BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null - }); - } - - return new MessageAttributes(attributes); - } - - private static MessageAttributes GetRawMessageAttributes(Amazon.SQS.Model.Message message) - { - Dictionary rawAttributes = new (); - if (message.MessageAttributes is null) - { - return new MessageAttributes(); - } - - foreach (var messageMessageAttribute in message.MessageAttributes) - { - var dataType = messageMessageAttribute.Value.DataType; - var dataValue = messageMessageAttribute.Value.StringValue; - var isString = dataType == "String"; - var messageAttributeValue = new MessageAttributeValue - { - DataType = dataType, - StringValue = isString ? dataValue : null, - BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null - }; - rawAttributes.Add(messageMessageAttribute.Key, messageAttributeValue); - } - - return new MessageAttributes(rawAttributes); - } - - private static bool IsSnsPayload(string body) - { - if (body is null) - { - return false; - } - - try - { - var isSnsPayload = false; - using var jsonDocument = JsonDocument.Parse(body); - if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) - { - string messageType = typeElement.GetString(); - if (messageType is "Notification") - { - isSnsPayload = true; - } - } - - return isSnsPayload; - } - catch - { - return false; - } - } -} - internal sealed class PublishMessageConverter : IPublishMessageConverter { private readonly IMessageBodySerializer _bodySerializer; @@ -202,14 +62,20 @@ private static void AddMessageAttributes(DictionaryOptions specifying when and how to compress. /// Registry of available compression algorithms. /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). - public static (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata, PublishDestinationType destinationType, PublishCompressionOptions compressionOptions, MessageCompressionRegistry compressionRegistry) + public static (string compressedMessage, string contentEncoding) + CompressMessageBody( + string message, + PublishMetadata metadata, + PublishDestinationType destinationType, + PublishCompressionOptions compressionOptions, + MessageCompressionRegistry compressionRegistry) { string contentEncoding = null; string compressedMessage = null; if (compressionOptions?.CompressionEncoding is { } compressionEncoding && compressionRegistry is not null) { var messageSize = CalculateTotalMessageSize(message, metadata); - if (messageSize > compressionOptions.MessageLengthThreshold) + if (messageSize >= compressionOptions.MessageLengthThreshold) { var compression = compressionRegistry.GetCompression(compressionEncoding); if (compression is null) diff --git a/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs new file mode 100644 index 000000000..5ee53e3fa --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs @@ -0,0 +1,142 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using JustSaying.AwsTools; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; + +namespace JustSaying.Messaging; + +internal sealed class ReceivedMessageConverter : IReceivedMessageConverter +{ + private readonly IMessageBodySerializer _bodySerializer; + private readonly MessageCompressionRegistry _compressionRegistry; + private readonly bool _isRawMessage; + + public ReceivedMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, bool isRawMessage) + { + _bodySerializer = bodySerializer; + _compressionRegistry = compressionRegistry; + _isRawMessage = isRawMessage; + } + + public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) + { + string body = message.Body; + var attributes = GetMessageAttributes(message, body); + + if (body is not null && !_isRawMessage) + { + var jsonNode = JsonNode.Parse(body); + if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) + { + body = messageNode.ToString(); + } + } + body = ApplyBodyDecompression(body, attributes); + var result = _bodySerializer.Deserialize(body); + return new ReceivedMessage(result, attributes); + } + + private string ApplyBodyDecompression(string body, MessageAttributes attributes) + { + var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); + if (contentEncoding is not null) + { + var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); + if (decompressor is null) + { + throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + } + + body = decompressor.Decompress(body); + } + + return body; + } + + private static MessageAttributes GetMessageAttributes(Amazon.SQS.Model.Message message, string body) + { + bool isSnsPayload = IsSnsPayload(body); + var attributes = isSnsPayload ? GetMessageAttributes(body) : GetRawMessageAttributes(message); + + return attributes; + } + + private static MessageAttributes GetMessageAttributes(string message) + { + using var jsonDocument = JsonDocument.Parse(message); + + if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) + { + return new MessageAttributes(); + } + + Dictionary attributes = new(); + foreach (var obj in attributesElement.EnumerateObject()) + { + var dataType = obj.Value.GetProperty("Type").GetString(); + var dataValue = obj.Value.GetProperty("Value").GetString(); + + var isString = dataType == "String"; + + attributes.Add(obj.Name, new MessageAttributeValue + { + DataType = dataType, + StringValue = isString ? dataValue : null, + BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null + }); + } + + return new MessageAttributes(attributes); + } + + private static MessageAttributes GetRawMessageAttributes(Amazon.SQS.Model.Message message) + { + if (message.MessageAttributes is null) + { + return new MessageAttributes(); + } + + Dictionary rawAttributes = new (); + + foreach (var messageMessageAttribute in message.MessageAttributes) + { + var dataType = messageMessageAttribute.Value.DataType; + var dataValue = messageMessageAttribute.Value.StringValue; + var isString = dataType == "String"; + var messageAttributeValue = new MessageAttributeValue + { + DataType = dataType, + StringValue = isString ? dataValue : null, + BinaryValue = !isString ? Convert.FromBase64String(dataValue) : null + }; + rawAttributes.Add(messageMessageAttribute.Key, messageAttributeValue); + } + + return new MessageAttributes(rawAttributes); + } + + private static bool IsSnsPayload(string body) + { + if (body is null) + { + return false; + } + + try + { + using var jsonDocument = JsonDocument.Parse(body); + if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) + { + return typeElement.GetString() is "Notification"; + } + } + catch + { + // ignored + } + + return false; + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index dcf5c91a8..57d029d95 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -11,7 +11,7 @@ namespace JustSaying.AwsTools.MessageHandling; -internal class SqsMessagePublisher( +internal sealed class SqsMessagePublisher( IAmazonSQS client, PublishMessageConverter messageConverter, ILoggerFactory loggerFactory) : IMessagePublisher diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 95768d8d4..7ff886c56 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -2,8 +2,6 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; -using JustSaying.Messaging.Compression; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs new file mode 100644 index 000000000..bf0bac587 --- /dev/null +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs @@ -0,0 +1,9 @@ +using JustSaying.AwsTools.MessageHandling; + +namespace JustSaying.Messaging.Channels.SubscriptionGroups; + +public sealed class SqsSource +{ + public ISqsQueue SqsQueue { get; set; } + public IReceivedMessageConverter MessageConverter { get; set; } +} diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs index 8007d3874..88141aa3b 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs @@ -15,7 +15,7 @@ namespace JustSaying.Messaging.Channels.SubscriptionGroups; /// /// Builds 's from the various components required. /// -internal class SubscriptionGroupFactory : ISubscriptionGroupFactory +internal sealed class SubscriptionGroupFactory : ISubscriptionGroupFactory { private readonly IMessageDispatcher _messageDispatcher; private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs index 08ba289e6..c6ab469a8 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs @@ -69,9 +69,3 @@ internal SubscriptionGroupSettings( /// public IReadOnlyCollection QueueSources { get; } } - -public sealed class SqsSource -{ - public ISqsQueue SqsQueue { get; set; } - public IReceivedMessageConverter MessageConverter { get; set; } -} diff --git a/src/JustSaying/Messaging/Compression/ContentEncodings.cs b/src/JustSaying/Messaging/Compression/ContentEncodings.cs index d5c56b5cb..075371799 100644 --- a/src/JustSaying/Messaging/Compression/ContentEncodings.cs +++ b/src/JustSaying/Messaging/Compression/ContentEncodings.cs @@ -11,7 +11,7 @@ namespace JustSaying.Messaging.Compression; public static class ContentEncodings { /// - /// The GzipBase64 constant represents the "gzip,base64" content encoding. + /// Represents the gzip,base64 content encoding. /// public const string GzipBase64 = "gzip,base64"; } diff --git a/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs b/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs index 784470d51..15b6a6c66 100644 --- a/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs +++ b/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs @@ -20,7 +20,7 @@ public MessageAttributeValue Get(string value) /// /// Gets all available attribute keys. /// - /// An IReadOnlyCollection of strings representing all attribute keys. + /// An of strings representing all attribute keys. public IReadOnlyCollection GetKeys() => _attributes.Keys; } diff --git a/src/JustSaying/Messaging/MessageSerialization/PublishMessage.cs b/src/JustSaying/Messaging/MessageSerialization/PublishMessage.cs new file mode 100644 index 000000000..56762d539 --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/PublishMessage.cs @@ -0,0 +1,22 @@ +namespace JustSaying.Messaging.MessageSerialization; + +public sealed class PublishMessage +{ + public PublishMessage(string body, Dictionary messageAttributes, string subject) + { + Body = body; + MessageAttributes = messageAttributes; + Subject = subject; + } + + public string Body { get; } + public Dictionary MessageAttributes { get; } + public string Subject { get; } + + public void Deconstruct(out string body, out Dictionary attributes, out string subject) + { + body = Body; + attributes = MessageAttributes; + subject = Subject; + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs b/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs index 89c8604e3..dcfec5d5c 100644 --- a/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs +++ b/src/JustSaying/Messaging/MessageSerialization/ReceivedMessage.cs @@ -24,24 +24,3 @@ public void Deconstruct(out Message message, out MessageAttributes attributes) attributes = MessageAttributes; } } - -public sealed class PublishMessage -{ - public PublishMessage(string body, Dictionary messageAttributes, string subject) - { - Body = body; - MessageAttributes = messageAttributes; - Subject = subject; - } - - public string Body { get; } - public Dictionary MessageAttributes { get; } - public string Subject { get; } - - public void Deconstruct(out string body, out Dictionary attributes, out string subject) - { - body = Body; - attributes = MessageAttributes; - subject = Subject; - } -} From fbe31d964e06b5e078bcbc73d9ebb11d6780d7ac Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 4 Oct 2024 15:24:13 +0100 Subject: [PATCH 34/41] Apply some feedback --- .../Compression/PublishCompressionOptions.cs | 3 ++- .../Dispatch/MessageDispatcher.cs | 2 +- .../MessageHandling/IMessageConverter.cs | 15 ----------- .../IPublishMessageConverter.cs | 26 +++++++++++++++++++ .../IReceivedMessageConverter.cs | 17 ++++++++++++ .../ServiceBuilderServiceResolver.cs | 3 +-- ...=> SystemTextJsonMessageBodySerializer.cs} | 7 ++--- ... SystemTextJsonMessageBodySerializer`1.cs} | 10 +------ .../PublicAPI/net461/PublicAPI.Unshipped.txt | 6 ++--- .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 6 ++--- .../netstandard2.0/PublicAPI.Unshipped.txt | 6 ++--- .../WhenListeningStartsAndStops.cs | 2 +- .../WhenListeningWithMultipleGroups.cs | 2 +- 13 files changed, 58 insertions(+), 47 deletions(-) delete mode 100644 src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs create mode 100644 src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs rename src/JustSaying/Messaging/MessageSerialization/{SystemTextJsonMessageBodySerializerBase.cs => SystemTextJsonMessageBodySerializer.cs} (70%) rename src/JustSaying/Messaging/MessageSerialization/{SystemTextJsonSerializer`1.cs => SystemTextJsonMessageBodySerializer`1.cs} (79%) diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs index 9afa1f9ce..aed06d91a 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs @@ -13,11 +13,12 @@ public sealed class PublishCompressionOptions /// The default value is 262,144 bytes (256 KB). /// public int MessageLengthThreshold { get; set; } = 256 * 1024; + /// /// Gets or sets the compression encoding to be used. /// /// - /// This should correspond to a registered compression algorithm in the IMessageCompressionRegistry. + /// This should correspond to a registered compression algorithm in the .. /// public string CompressionEncoding { get; set; } } diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index b46126cb0..475472dbc 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -8,7 +8,7 @@ namespace JustSaying.AwsTools.MessageHandling.Dispatch; -internal class MessageDispatcher : IMessageDispatcher +internal sealed class MessageDispatcher : IMessageDispatcher { private readonly IMessageMonitor _messagingMonitor; private readonly MiddlewareMap _middlewareMap; diff --git a/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs deleted file mode 100644 index 5597d81cc..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/IMessageConverter.cs +++ /dev/null @@ -1,15 +0,0 @@ -using JustSaying.AwsTools.MessageHandling; -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; - -namespace JustSaying.Messaging; - -public interface IPublishMessageConverter -{ - PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); -} - -public interface IReceivedMessageConverter -{ - ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message); -} diff --git a/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs new file mode 100644 index 000000000..26ec47f72 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs @@ -0,0 +1,26 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Models; + +namespace JustSaying.Messaging; + +public interface IPublishMessageConverter +{ + /// + /// Converts a message to a format suitable for publishing, applying necessary transformations and compression. + /// + /// The original message to be converted. + /// Metadata associated with the publish operation, including any custom message attributes. + /// The type of destination (Topic or Queue) where the message will be published. + /// A object containing the converted message body, attributes, and any additional publishing information. + /// + /// This method handles the following operations: + /// - Serializes the message body + /// - Adds custom message attributes + /// - Applies compression to the message body if it meets specified criteria + /// - Adds compression-related attributes if compression is applied + /// - Prepares the message for SNS (if applicable) by setting the subject + /// The exact behavior may vary based on the destination type and compression options. + /// + PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs new file mode 100644 index 000000000..a861bc5c9 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs @@ -0,0 +1,17 @@ +using JustSaying.Messaging.MessageSerialization; + +namespace JustSaying.Messaging; + +public interface IReceivedMessageConverter +{ + /// + /// Converts an Amazon SQS message to a object. + /// + /// The Amazon SQS message to convert. + /// A object containing the deserialized message body and attributes. + /// + /// This method handles the conversion of both raw SQS messages and SNS-wrapped messages. + /// It also applies any necessary decompression to the message body. + /// + ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message); +} diff --git a/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs index e4e283ba2..562e76e98 100644 --- a/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs @@ -1,7 +1,6 @@ using System.Collections.Concurrent; using JustSaying.AwsTools; using JustSaying.Messaging.MessageHandling; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using Microsoft.Extensions.Logging; @@ -41,7 +40,7 @@ private void Build() { _serviceLookup[typeof(IMessageMonitor)] = builder.MessageMonitoring(); } - + if (builder.MessageContextAccessor != null) { _serviceLookup[typeof(IMessageContextAccessor)] = builder.MessageContextAccessor(); diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs similarity index 70% rename from src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs rename to src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs index bddbf20e5..634afe7dd 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializerBase.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs @@ -3,10 +3,7 @@ namespace JustSaying.Messaging.MessageSerialization; using System.Text.Json; using System.Text.Json.Serialization; -/// -/// Provides a base class for System.Text.Json-based message body serializers with default serialization options. -/// -public abstract class SystemTextJsonMessageBodySerializerBase +public static class SystemTextJsonMessageBodySerializer { /// /// Gets the default JSON serializer options used by derived serializers. @@ -18,7 +15,7 @@ public abstract class SystemTextJsonMessageBodySerializerBase /// Using a for enum serialization. /// /// - private protected static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() + public static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, Converters = diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer`1.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer`1.cs similarity index 79% rename from src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer`1.cs rename to src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer`1.cs index 0703a81ed..324fa772b 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer`1.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer`1.cs @@ -7,18 +7,10 @@ namespace JustSaying.Messaging.MessageSerialization; /// Provides serialization and deserialization functionality for messages of type using System.Text.Json. /// /// The type of message to be serialized or deserialized. Must inherit from . -public sealed class SystemTextJsonMessageBodySerializer : SystemTextJsonMessageBodySerializerBase, IMessageBodySerializer where T: Message +public sealed class SystemTextJsonMessageBodySerializer : IMessageBodySerializer where T: Message { private readonly JsonSerializerOptions _options; - /// - /// Initializes a new instance of the class with default JSON serializer options. - /// - public SystemTextJsonMessageBodySerializer() - { - _options = DefaultJsonSerializerOptions; - } - /// /// Initializes a new instance of the class with custom JSON serializer options. /// diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index 4bd1aba8e..09f7ab451 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -73,13 +73,11 @@ JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSa JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer() -> void JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase.SystemTextJsonMessageBodySerializerBase() -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher @@ -168,4 +166,4 @@ JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void *REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher - +static readonly JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions -> System.Text.Json.JsonSerializerOptions diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 4bd1aba8e..09f7ab451 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -73,13 +73,11 @@ JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSa JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer() -> void JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase.SystemTextJsonMessageBodySerializerBase() -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher @@ -168,4 +166,4 @@ JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void *REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher - +static readonly JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions -> System.Text.Json.JsonSerializerOptions diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 4bd1aba8e..09f7ab451 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -73,13 +73,11 @@ JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSa JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer() -> void JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializerBase.SystemTextJsonMessageBodySerializerBase() -> void JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher @@ -168,4 +166,4 @@ JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void *REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher - +static readonly JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions -> System.Text.Json.JsonSerializerOptions diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs index 19baac6a2..773e5b3ae 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs @@ -39,7 +39,7 @@ IEnumerable GetMessages(CancellationToken cancellationToken) var sqsSource = new SqsSource { SqsQueue = sqsQueue, - MessageConverter = new ReceivedMessageConverter(new SystemTextJsonMessageBodySerializer(), new MessageCompressionRegistry(), false) + MessageConverter = new ReceivedMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false) }; _queue = sqsSource.SqsQueue as FakeSqsQueue; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs index ad54e1b6d..2fc302f7c 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs @@ -36,7 +36,7 @@ public WhenListeningWithMultipleGroups(ITestOutputHelper testOutputHelper) : bas }.AsEnumerable()), "C7506B3F-81DA-4898-82A5-C0293523592A"); - var messageConverter = new ReceivedMessageConverter(new SystemTextJsonMessageBodySerializer(), new MessageCompressionRegistry(), false); + var messageConverter = new ReceivedMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false); _queueA = new SqsSource { SqsQueue = queueA, From 64e0d2182e29cc082d55496b8fbf6caa9f698167 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 4 Oct 2024 15:57:17 +0100 Subject: [PATCH 35/41] Apply some feedback --- .../MessageSerialization/NewtonsoftSerializationFactory.cs | 5 ++++- .../SystemTextJsonMessageBodySerializer.cs | 2 +- src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs index 0fbb2c7c4..c44e05ca1 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using JustSaying.Models; using Newtonsoft.Json; @@ -5,5 +6,7 @@ namespace JustSaying.Messaging.MessageSerialization; public sealed class NewtonsoftSerializationFactory(JsonSerializerSettings settings = null) : IMessageBodySerializationFactory { - public IMessageBodySerializer GetSerializer() where T : Message => new NewtonsoftMessageBodySerializer(settings); + private readonly ConcurrentDictionary _cache = new(); + + public IMessageBodySerializer GetSerializer() where T : Message => (IMessageBodySerializer)_cache.GetOrAdd(typeof(T), _ => new NewtonsoftMessageBodySerializer(settings)); } diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs index 634afe7dd..3d5505313 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs @@ -15,7 +15,7 @@ public static class SystemTextJsonMessageBodySerializer /// Using a for enum serialization. /// /// - public static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() + public static JsonSerializerOptions DefaultJsonSerializerOptions { get; } = new() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, Converters = diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index 09f7ab451..fe4afcff0 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -166,4 +166,4 @@ JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void *REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -static readonly JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions -> System.Text.Json.JsonSerializerOptions +static JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions From ee7febf75ebb6d6612a932b5e6eade9e75bc4bb3 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 4 Oct 2024 16:07:56 +0100 Subject: [PATCH 36/41] Apply some feedback --- src/JustSaying/JustSaying.csproj | 8 + .../PublicAPI/PublicAPI.Shipped.txt | 745 +++++++++++++++++ .../PublicAPI/PublicAPI.Unshipped.txt | 169 ++++ .../PublicAPI/net461/PublicAPI.Shipped.txt | 749 ------------------ .../PublicAPI/net461/PublicAPI.Unshipped.txt | 173 +--- .../PublicAPI/net8.0/PublicAPI.Shipped.txt | 745 ----------------- .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 169 ---- .../netstandard2.0/PublicAPI.Shipped.txt | 749 ------------------ .../netstandard2.0/PublicAPI.Unshipped.txt | 173 +--- 9 files changed, 930 insertions(+), 2750 deletions(-) create mode 100644 src/JustSaying/PublicAPI/PublicAPI.Shipped.txt create mode 100644 src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index 8b88dc73e..11e263690 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -25,4 +25,12 @@ + + + + + + + + diff --git a/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt new file mode 100644 index 000000000..a1c0546c3 --- /dev/null +++ b/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt @@ -0,0 +1,745 @@ +abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary +abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string +JustSaying.AwsTools.AwsClientFactoryProxy +JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void +JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void +JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void +JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void +JustSaying.AwsTools.DefaultAwsClientFactory +JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void +JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void +JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS +JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri +JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void +JustSaying.AwsTools.ErrorQueue +JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.IAwsClientFactory +JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS +JustSaying.AwsTools.IAwsClientFactoryProxy +JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void +JustSaying.AwsTools.JustSayingConstants +JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable +JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string +JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string +JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> +JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string +JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri +JustSaying.AwsTools.MessageHandling.MessageResponse +JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? +JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void +JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string +JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void +JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void +JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata +JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void +JustSaying.AwsTools.MessageHandling.PublishException +JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName +JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string +JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void +JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByName +JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void +JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues +JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.RedrivePolicy +JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string +JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void +JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int +JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void +JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void +JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void +JustSaying.AwsTools.QueueCreation.ServerSideEncryption +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void +JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.Extensions.ChannelExtensions +JustSaying.Fluent.AccountAddressProvider +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void +JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri +JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri +JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string +JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string +JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.IMessageBusConfigurationContributor +JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void +JustSaying.Fluent.IServiceResolver +JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T +JustSaying.Fluent.IServiceResolver.ResolveService() -> T +JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig +JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.QueueAddressConfiguration +JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void +JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string +JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void +JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void +JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Fluent.QueueAddressSubscriptionBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder +JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.SnsWriteConfigurationBuilder +JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void +JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder +JustSaying.Fluent.SqsConfigurationBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder +JustSaying.Fluent.SqsReadConfigurationBuilder +JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void +JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder +JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder +JustSaying.Fluent.SqsWriteConfigurationBuilder +JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void +JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder +JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func +JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void +JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.HandlerNotRegisteredWithContainerException +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void +JustSaying.HandlerResolutionContext +JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void +JustSaying.HandlerResolutionContext.QueueName.get -> string +JustSaying.IHandlerResolver +JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync +JustSaying.IMessagingBus +JustSaying.IMessagingConfig +JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider +JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void +JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention +JustSaying.IMessagingConfig.QueueNamingConvention.set -> void +JustSaying.IMessagingConfig.Region.get -> string +JustSaying.IMessagingConfig.Region.set -> void +JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention +JustSaying.IMessagingConfig.TopicNamingConvention.set -> void +JustSaying.IMessagingConfig.Validate() -> void +JustSaying.IPublishConfiguration +JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void +JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action +JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void +JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan +JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void +JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int +JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void +JustSaying.IStartable +JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.JustSayingBus +JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void +JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void +JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task +JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig +JustSaying.JustSayingBus.Dispose() -> void +JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void +JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IMessageDeleter +JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater +JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IQueueMessageContext +JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string +JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.Channels.Context.QueueMessageContext +JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string +JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation +JustSaying.Messaging.IMessagePublisher +JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Interrogation.IInterrogable +JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object +JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void +JustSaying.Messaging.MessageAttributeValue +JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void +JustSaying.Messaging.MessageAttributeValue.DataType.get -> string +JustSaying.Messaging.MessageAttributeValue.DataType.set -> void +JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void +JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string +JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void +JustSaying.Messaging.MessageHandling.IHandlerAsync +JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.IMessageContextAccessor +JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void +JustSaying.Messaging.MessageHandling.IMessageContextReader +JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.IMessageLockAsync +JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.ListHandler +JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void +JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue +JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void +JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void +JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.MessageHandling.MessageContextAccessor +JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void +JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse +JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool +JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool +JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void +JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy +JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan +JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults +JustSaying.Messaging.MessagePublisherExtensions +JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider +JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void +JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string +JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider +JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +JustSaying.Messaging.MessageSerialization.MessageWithAttributes +JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider +JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string +JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.TypeSerializer +JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware +JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware +JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.ExactlyOnceMiddleware +JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void +JustSaying.Messaging.Middleware.HandleMessageContext +JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception +JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter +JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type +JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string +JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void +JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater +JustSaying.Messaging.Middleware.HandleMessageContextExtensions +JustSaying.Messaging.Middleware.HandlerInvocationMiddleware +JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.Logging.LoggingMiddleware +JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware +JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void +JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void +JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.Messaging.Middleware.MiddlewareBuilder +JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware +JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void +JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware +JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void +JustSaying.Messaging.Middleware.StopwatchMiddleware +JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor +JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void +JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? +JustSaying.Messaging.PublishMetadata.Delay.set -> void +JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary +JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void +JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher +JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus +JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void +JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingConfig +JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void +JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action +JustSaying.MessagingConfig.MessageResponseLogger.set -> void +JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider +JustSaying.MessagingConfig.MessageSubjectProvider.set -> void +JustSaying.MessagingConfig.MessagingConfig() -> void +JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan +JustSaying.MessagingConfig.PublishFailureBackoff.set -> void +JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int +JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void +JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention +JustSaying.MessagingConfig.QueueNamingConvention.set -> void +JustSaying.MessagingConfig.Region.get -> string +JustSaying.MessagingConfig.Region.set -> void +JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention +JustSaying.MessagingConfig.TopicNamingConvention.set -> void +JustSaying.Naming.DefaultNamingConventions +JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void +JustSaying.Naming.IQueueNamingConvention +JustSaying.Naming.IQueueNamingConvention.QueueName() -> string +JustSaying.Naming.ITopicNamingConvention +JustSaying.Naming.ITopicNamingConvention.TopicName() -> string +JustSaying.Naming.NamingConventionExtensions +override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary +override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool +override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task +override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary +override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string +override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void +override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string +override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> +static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int +static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int +static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string +static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string +static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan +static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy +static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void +static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int +static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage +static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase +static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase +static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string +static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string +virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void +virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void +virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void +virtual JustSaying.MessagingConfig.Validate() -> void +virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string +virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt new file mode 100644 index 000000000..fe4afcff0 --- /dev/null +++ b/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt @@ -0,0 +1,169 @@ +const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void +JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void +JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void +JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.Compression.ContentEncodings +JustSaying.Messaging.Compression.GzipMessageBodyCompression +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void +JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.MessageCompressionRegistry +JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void +JustSaying.Messaging.IPublishMessageConverter +JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.IReceivedMessageConverter +JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string +JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary +JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void +JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string +JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void +JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher +static JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt index ac3e28b2f..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt @@ -1,749 +0,0 @@ -abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string -JustSaying.AwsTools.AwsClientFactoryProxy -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.DefaultAwsClientFactory -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void -JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void -JustSaying.AwsTools.ErrorQueue -JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.IAwsClientFactoryProxy -JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.JustSayingConstants -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable -JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri -JustSaying.AwsTools.MessageHandling.MessageResponse -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.PublishException -JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName -JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.Extensions.ChannelExtensions -JustSaying.Fluent.AccountAddressProvider -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string -JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string -JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.IMessageBusConfigurationContributor -JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void -JustSaying.Fluent.IServiceResolver -JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T -JustSaying.Fluent.IServiceResolver.ResolveService() -> T -JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig -JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.QueueAddressConfiguration -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void -JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void -JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void -JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.HandlerNotRegisteredWithContainerException -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.HandlerResolutionContext -JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void -JustSaying.HandlerResolutionContext.QueueName.get -> string -JustSaying.IHandlerResolver -JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.IMessagingBus -JustSaying.IMessagingConfig -JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void -JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.IMessagingConfig.QueueNamingConvention.set -> void -JustSaying.IMessagingConfig.Region.get -> string -JustSaying.IMessagingConfig.Region.set -> void -JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.IMessagingConfig.TopicNamingConvention.set -> void -JustSaying.IMessagingConfig.Validate() -> void -JustSaying.IPublishConfiguration -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void -JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action -JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void -JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void -JustSaying.IStartable -JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus -JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void -JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void -JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig -JustSaying.JustSayingBus.Dispose() -> void -JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void -JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IQueueMessageContext -JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext -JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation -JustSaying.Messaging.IMessagePublisher -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Interrogation.IInterrogable -JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object -JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void -JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void -JustSaying.Messaging.MessageAttributeValue.DataType.get -> string -JustSaying.Messaging.MessageAttributeValue.DataType.set -> void -JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void -JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string -JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void -JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageContextAccessor -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.IMessageContextReader -JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageLockAsync -JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler -JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void -JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.MessageHandling.MessageContextAccessor -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan -JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults -JustSaying.Messaging.MessagePublisherExtensions -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.TypeSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.HandleMessageContext -JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception -JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type -JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string -JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Middleware.HandleMessageContextExtensions -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void -JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBuilder -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void -JustSaying.Messaging.Middleware.StopwatchMiddleware -JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor -JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? -JustSaying.Messaging.PublishMetadata.Delay.set -> void -JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary -JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void -JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher -JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus -JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void -JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingConfig -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void -JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action -JustSaying.MessagingConfig.MessageResponseLogger.set -> void -JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.MessagingConfig.MessageSubjectProvider.set -> void -JustSaying.MessagingConfig.MessagingConfig() -> void -JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.MessagingConfig.PublishFailureBackoff.set -> void -JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int -JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void -JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.MessagingConfig.QueueNamingConvention.set -> void -JustSaying.MessagingConfig.Region.get -> string -JustSaying.MessagingConfig.Region.set -> void -JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.MessagingConfig.TopicNamingConvention.set -> void -JustSaying.Naming.DefaultNamingConventions -JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void -JustSaying.Naming.IQueueNamingConvention -JustSaying.Naming.IQueueNamingConvention.QueueName() -> string -JustSaying.Naming.ITopicNamingConvention -JustSaying.Naming.ITopicNamingConvention.TopicName() -> string -JustSaying.Naming.NamingConventionExtensions -override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string -override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void -override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string -override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> -static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy -static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void -virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void -virtual JustSaying.MessagingConfig.Validate() -> void -virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string -virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index fe4afcff0..ec6ede7fa 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -1,169 +1,4 @@ -const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void -JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void -JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool -JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void -JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void -JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Compression.ContentEncodings -JustSaying.Messaging.Compression.GzipMessageBodyCompression -JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void -JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string -JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string -JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.MessageCompressionRegistry -JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void -JustSaying.Messaging.IPublishMessageConverter -JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage -JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage -JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage -JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string -JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary -JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string -JustSaying.Messaging.MessageSerialization.ReceivedMessage -JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void -JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -static JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt index a1c0546c3..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -1,745 +0,0 @@ -abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string -JustSaying.AwsTools.AwsClientFactoryProxy -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.DefaultAwsClientFactory -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void -JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void -JustSaying.AwsTools.ErrorQueue -JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.IAwsClientFactoryProxy -JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.JustSayingConstants -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable -JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri -JustSaying.AwsTools.MessageHandling.MessageResponse -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.PublishException -JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName -JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.Extensions.ChannelExtensions -JustSaying.Fluent.AccountAddressProvider -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string -JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string -JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.IMessageBusConfigurationContributor -JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void -JustSaying.Fluent.IServiceResolver -JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T -JustSaying.Fluent.IServiceResolver.ResolveService() -> T -JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig -JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.QueueAddressConfiguration -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void -JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void -JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void -JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.HandlerNotRegisteredWithContainerException -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void -JustSaying.HandlerResolutionContext -JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void -JustSaying.HandlerResolutionContext.QueueName.get -> string -JustSaying.IHandlerResolver -JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.IMessagingBus -JustSaying.IMessagingConfig -JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void -JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.IMessagingConfig.QueueNamingConvention.set -> void -JustSaying.IMessagingConfig.Region.get -> string -JustSaying.IMessagingConfig.Region.set -> void -JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.IMessagingConfig.TopicNamingConvention.set -> void -JustSaying.IMessagingConfig.Validate() -> void -JustSaying.IPublishConfiguration -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void -JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action -JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void -JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void -JustSaying.IStartable -JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus -JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void -JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void -JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig -JustSaying.JustSayingBus.Dispose() -> void -JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void -JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IQueueMessageContext -JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext -JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation -JustSaying.Messaging.IMessagePublisher -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Interrogation.IInterrogable -JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object -JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void -JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void -JustSaying.Messaging.MessageAttributeValue.DataType.get -> string -JustSaying.Messaging.MessageAttributeValue.DataType.set -> void -JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void -JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string -JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void -JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageContextAccessor -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.IMessageContextReader -JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageLockAsync -JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler -JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void -JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.MessageHandling.MessageContextAccessor -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan -JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults -JustSaying.Messaging.MessagePublisherExtensions -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.TypeSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.HandleMessageContext -JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception -JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type -JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string -JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Middleware.HandleMessageContextExtensions -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void -JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBuilder -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void -JustSaying.Messaging.Middleware.StopwatchMiddleware -JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor -JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? -JustSaying.Messaging.PublishMetadata.Delay.set -> void -JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary -JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void -JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher -JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus -JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void -JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingConfig -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void -JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action -JustSaying.MessagingConfig.MessageResponseLogger.set -> void -JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.MessagingConfig.MessageSubjectProvider.set -> void -JustSaying.MessagingConfig.MessagingConfig() -> void -JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.MessagingConfig.PublishFailureBackoff.set -> void -JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int -JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void -JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.MessagingConfig.QueueNamingConvention.set -> void -JustSaying.MessagingConfig.Region.get -> string -JustSaying.MessagingConfig.Region.set -> void -JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.MessagingConfig.TopicNamingConvention.set -> void -JustSaying.Naming.DefaultNamingConventions -JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void -JustSaying.Naming.IQueueNamingConvention -JustSaying.Naming.IQueueNamingConvention.QueueName() -> string -JustSaying.Naming.ITopicNamingConvention -JustSaying.Naming.ITopicNamingConvention.TopicName() -> string -JustSaying.Naming.NamingConventionExtensions -override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string -override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void -override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string -override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> -static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy -static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void -virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void -virtual JustSaying.MessagingConfig.Validate() -> void -virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string -virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 09f7ab451..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -1,169 +0,0 @@ -const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void -JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void -JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool -JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void -JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void -JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Compression.ContentEncodings -JustSaying.Messaging.Compression.GzipMessageBodyCompression -JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void -JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string -JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string -JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.MessageCompressionRegistry -JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void -JustSaying.Messaging.IPublishMessageConverter -JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage -JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage -JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage -JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string -JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary -JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string -JustSaying.Messaging.MessageSerialization.ReceivedMessage -JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void -JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -static readonly JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions -> System.Text.Json.JsonSerializerOptions diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index ac3e28b2f..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -1,749 +0,0 @@ -abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string -JustSaying.AwsTools.AwsClientFactoryProxy -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.DefaultAwsClientFactory -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void -JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void -JustSaying.AwsTools.ErrorQueue -JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.IAwsClientFactoryProxy -JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.JustSayingConstants -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable -JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri -JustSaying.AwsTools.MessageHandling.MessageResponse -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.PublishException -JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName -JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.Extensions.ChannelExtensions -JustSaying.Fluent.AccountAddressProvider -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string -JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string -JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.IMessageBusConfigurationContributor -JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void -JustSaying.Fluent.IServiceResolver -JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T -JustSaying.Fluent.IServiceResolver.ResolveService() -> T -JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig -JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.QueueAddressConfiguration -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void -JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void -JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void -JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.HandlerNotRegisteredWithContainerException -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.HandlerResolutionContext -JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void -JustSaying.HandlerResolutionContext.QueueName.get -> string -JustSaying.IHandlerResolver -JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.IMessagingBus -JustSaying.IMessagingConfig -JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void -JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.IMessagingConfig.QueueNamingConvention.set -> void -JustSaying.IMessagingConfig.Region.get -> string -JustSaying.IMessagingConfig.Region.set -> void -JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.IMessagingConfig.TopicNamingConvention.set -> void -JustSaying.IMessagingConfig.Validate() -> void -JustSaying.IPublishConfiguration -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void -JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action -JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void -JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void -JustSaying.IStartable -JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus -JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void -JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void -JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig -JustSaying.JustSayingBus.Dispose() -> void -JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void -JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IQueueMessageContext -JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext -JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation -JustSaying.Messaging.IMessagePublisher -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Interrogation.IInterrogable -JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object -JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void -JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void -JustSaying.Messaging.MessageAttributeValue.DataType.get -> string -JustSaying.Messaging.MessageAttributeValue.DataType.set -> void -JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void -JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string -JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void -JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageContextAccessor -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.IMessageContextReader -JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageLockAsync -JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler -JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void -JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.MessageHandling.MessageContextAccessor -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan -JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults -JustSaying.Messaging.MessagePublisherExtensions -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.TypeSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.HandleMessageContext -JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception -JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type -JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string -JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Middleware.HandleMessageContextExtensions -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void -JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBuilder -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void -JustSaying.Messaging.Middleware.StopwatchMiddleware -JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor -JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? -JustSaying.Messaging.PublishMetadata.Delay.set -> void -JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary -JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void -JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher -JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus -JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void -JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingConfig -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void -JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action -JustSaying.MessagingConfig.MessageResponseLogger.set -> void -JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.MessagingConfig.MessageSubjectProvider.set -> void -JustSaying.MessagingConfig.MessagingConfig() -> void -JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.MessagingConfig.PublishFailureBackoff.set -> void -JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int -JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void -JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.MessagingConfig.QueueNamingConvention.set -> void -JustSaying.MessagingConfig.Region.get -> string -JustSaying.MessagingConfig.Region.set -> void -JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.MessagingConfig.TopicNamingConvention.set -> void -JustSaying.Naming.DefaultNamingConventions -JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void -JustSaying.Naming.IQueueNamingConvention -JustSaying.Naming.IQueueNamingConvention.QueueName() -> string -JustSaying.Naming.ITopicNamingConvention -JustSaying.Naming.ITopicNamingConvention.TopicName() -> string -JustSaying.Naming.NamingConventionExtensions -override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string -override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void -override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string -override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> -static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy -static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void -virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void -virtual JustSaying.MessagingConfig.Validate() -> void -virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string -virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 09f7ab451..ec6ede7fa 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,169 +1,4 @@ -const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void -JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void -JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void -JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool -JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void -JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void -JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Compression.ContentEncodings -JustSaying.Messaging.Compression.GzipMessageBodyCompression -JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void -JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string -JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string -JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string -JustSaying.Messaging.Compression.MessageCompressionRegistry -JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression -JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void -JustSaying.Messaging.IPublishMessageConverter -JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage -JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage -JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage -JustSaying.Messaging.MessageSerialization.PublishMessage.Body.get -> string -JustSaying.Messaging.MessageSerialization.PublishMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary -JustSaying.Messaging.MessageSerialization.PublishMessage.PublishMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void -JustSaying.Messaging.MessageSerialization.PublishMessage.Subject.get -> string -JustSaying.Messaging.MessageSerialization.ReceivedMessage -JustSaying.Messaging.MessageSerialization.ReceivedMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void -JustSaying.Messaging.MessageSerialization.ReceivedMessage.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.ReceivedMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.ReceivedMessage.ReceivedMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions -JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -static readonly JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions -> System.Text.Json.JsonSerializerOptions +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void From ef110b8c688547c6a8044b0b53a033f5ef27468d Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Fri, 4 Oct 2024 16:41:20 +0100 Subject: [PATCH 37/41] Apply some feedback --- .../MessageHandling/IPublishMessageConverter.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs index 26ec47f72..956988e47 100644 --- a/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs @@ -15,11 +15,13 @@ public interface IPublishMessageConverter /// A object containing the converted message body, attributes, and any additional publishing information. /// /// This method handles the following operations: - /// - Serializes the message body - /// - Adds custom message attributes - /// - Applies compression to the message body if it meets specified criteria - /// - Adds compression-related attributes if compression is applied - /// - Prepares the message for SNS (if applicable) by setting the subject + ///
    + ///
  • Serializes the message body
  • + ///
  • Adds custom message attributes
  • + ///
  • Applies compression to the message body if it meets specified criteria
  • + ///
  • Adds compression-related attributes if compression is applied
  • + ///
  • Prepares the message for SNS (if applicable) by setting the subject
  • + ///
/// The exact behavior may vary based on the destination type and compression options. ///
PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); From 8de44410cd2e57de4ead13fa5554b92120b98d0b Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 7 Oct 2024 15:48:54 +0100 Subject: [PATCH 38/41] More changes --- .../Dispatch/MessageDispatcher.cs | 2 +- .../IPublishMessageConverter.cs | 3 +- .../IReceivedMessageConverter.cs | 2 +- .../PublishMessageConverter.cs | 27 ++++++--- .../ReceivedMessageConverter.cs | 6 +- .../MessageHandling/SnsMessagePublisher.cs | 6 +- .../MessageHandling/SqsMessagePublisher.cs | 8 +-- .../QueueCreation/SnsWriteConfiguration.cs | 1 + .../QueueCreation/SqsBasicConfiguration.cs | 1 + .../StaticPublicationConfiguration.cs | 2 +- .../QueueAddressPublicationBuilder`1.cs | 9 ++- .../Fluent/QueuePublicationBuilder`1.cs | 2 +- src/JustSaying/Fluent/SqsEndpointHelper.cs | 2 +- .../TopicAddressPublicationBuilder`1.cs | 14 ++--- .../Fluent/TopicAddressPublisher.cs | 21 ------- src/JustSaying/JustSaying.csproj.DotSettings | 2 - .../Compression/MessageCompressionRegistry.cs | 2 +- .../PublicAPI/PublicAPI.Unshipped.txt | 9 ++- .../Sns/TopicByName/WhenPublishing.cs | 2 +- .../Sns/TopicByName/WhenPublishingAsync.cs | 2 +- ...henPublishingAsyncExceptionCanBeHandled.cs | 2 +- ...WhenPublishingAsyncExceptionCanBeThrown.cs | 2 +- ...enPublishingAsyncResponseLoggerIsCalled.cs | 2 +- ...gAsyncWithGenericMessageSubjectProvider.cs | 2 +- .../MessageHandling/Sqs/WhenPublishing.cs | 6 +- .../Sqs/WhenPublishingAsync.cs | 6 +- ...lishingAsyncResponseLoggerAsyncIsCalled.cs | 2 +- .../Sqs/WhenPublishingDelayedMessage.cs | 2 +- .../Sqs/WhenPublishingDelayedMessageAsync.cs | 2 +- .../Sqs/WhenPublishingRawMessage.cs | 57 +++++++++++++++++++ .../SubscriptionGroupCollectionTests.cs | 10 ++-- ...alingWithPotentiallyMissingConversation.cs | 9 ++- .../WhenSerializingAndDeserializing.cs | 7 ++- 33 files changed, 151 insertions(+), 81 deletions(-) delete mode 100644 src/JustSaying/Fluent/TopicAddressPublisher.cs delete mode 100644 src/JustSaying/JustSaying.csproj.DotSettings create mode 100644 tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 475472dbc..b5af56425 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -74,7 +74,7 @@ await middleware.RunAsync(handleContext, null, cancellationToken) { _logger.LogDebug("Attempting to deserialize message."); - var (message, attributes) = messageContext.MessageConverter.ConvertForReceive(messageContext.Message); + var (message, attributes) = await messageContext.MessageConverter.ConvertForReceiveAsync(messageContext.Message); return (true, message, attributes); } diff --git a/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs index 956988e47..e038dec1e 100644 --- a/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/IPublishMessageConverter.cs @@ -11,7 +11,6 @@ public interface IPublishMessageConverter ///
/// The original message to be converted. /// Metadata associated with the publish operation, including any custom message attributes. - /// The type of destination (Topic or Queue) where the message will be published. /// A object containing the converted message body, attributes, and any additional publishing information. /// /// This method handles the following operations: @@ -24,5 +23,5 @@ public interface IPublishMessageConverter /// /// The exact behavior may vary based on the destination type and compression options. /// - PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType); + ValueTask ConvertForPublishAsync(Message message, PublishMetadata publishMetadata); } diff --git a/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs index a861bc5c9..d459d3222 100644 --- a/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/IReceivedMessageConverter.cs @@ -13,5 +13,5 @@ public interface IReceivedMessageConverter /// This method handles the conversion of both raw SQS messages and SNS-wrapped messages. /// It also applies any necessary decompression to the message body. /// - ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message); + ValueTask ConvertForReceiveAsync(Amazon.SQS.Model.Message message); } diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs index 63303c69f..135fdc782 100644 --- a/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/PublishMessageConverter.cs @@ -10,34 +10,47 @@ namespace JustSaying.Messaging; internal sealed class PublishMessageConverter : IPublishMessageConverter { + private readonly PublishDestinationType _destinationType; private readonly IMessageBodySerializer _bodySerializer; private readonly MessageCompressionRegistry _compressionRegistry; private readonly PublishCompressionOptions _compressionOptions; - private readonly string _snsSubject; + private readonly string _subject; + private readonly bool _isRawMessage; - public PublishMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions, string snsSubject) + public PublishMessageConverter(PublishDestinationType destinationType, IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions, string subject, bool isRawMessage) { + _destinationType = destinationType; _bodySerializer = bodySerializer; _compressionRegistry = compressionRegistry; _compressionOptions = compressionOptions; - _snsSubject = snsSubject; + _subject = subject; + _isRawMessage = isRawMessage; } - public PublishMessage ConvertForPublish(Message message, PublishMetadata publishMetadata, PublishDestinationType destinationType) + public ValueTask ConvertForPublishAsync(Message message, PublishMetadata publishMetadata) { var messageBody = _bodySerializer.Serialize(message); Dictionary attributeValues = new(); AddMessageAttributes(attributeValues, publishMetadata); - (string compressedMessage, string contentEncoding) = CompressMessageBody(messageBody, publishMetadata, destinationType, _compressionOptions, _compressionRegistry); + (string compressedMessage, string contentEncoding) = CompressMessageBody(messageBody, publishMetadata, _destinationType, _compressionOptions, _compressionRegistry); if (compressedMessage is not null) { messageBody = compressedMessage; attributeValues.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); } - return new PublishMessage(messageBody, attributeValues, _snsSubject); + if (_destinationType == PublishDestinationType.Queue && !_isRawMessage) + { + messageBody = new JsonObject + { + ["Message"] = messageBody, + ["Subject"] = _subject + }.ToJsonString(); + } + + return new ValueTask(new PublishMessage(messageBody, attributeValues, _subject)); } private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) @@ -89,7 +102,7 @@ public static (string compressedMessage, string contentEncoding) jsonNode = JsonNode.Parse(message); if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) { - message = messageNode!.GetValue(); + message = messageNode?.GetValue(); } } compressedMessage = compression.Compress(message); diff --git a/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs index 5ee53e3fa..5a4e6b726 100644 --- a/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs @@ -20,7 +20,7 @@ public ReceivedMessageConverter(IMessageBodySerializer bodySerializer, MessageCo _isRawMessage = isRawMessage; } - public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) + public ValueTask ConvertForReceiveAsync(Amazon.SQS.Model.Message message) { string body = message.Body; var attributes = GetMessageAttributes(message, body); @@ -30,12 +30,12 @@ public ReceivedMessage ConvertForReceive(Amazon.SQS.Model.Message message) var jsonNode = JsonNode.Parse(body); if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) { - body = messageNode.ToString(); + body = messageNode?.ToString(); } } body = ApplyBodyDecompression(body, attributes); var result = _bodySerializer.Deserialize(body); - return new ReceivedMessage(result, attributes); + return new ValueTask(new ReceivedMessage(result, attributes)); } private string ApplyBodyDecompression(string body, MessageAttributes attributes) diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 442a6fa34..4cf3b980d 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -47,7 +47,7 @@ public Task PublishAsync(Message message, CancellationToken cancellationToken) public async Task PublishAsync(Message message, PublishMetadata metadata, CancellationToken cancellationToken) { - var request = BuildPublishRequest(message, metadata); + var request = await BuildPublishRequestAsync(message, metadata); PublishResponse response = null; try { @@ -90,9 +90,9 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel private bool ClientExceptionHandler(Exception ex, Message message) => _handleException?.Invoke(ex, message) ?? false; - private PublishRequest BuildPublishRequest(Message message, PublishMetadata metadata) + private async Task BuildPublishRequestAsync(Message message, PublishMetadata metadata) { - var (messageToSend, attributes, subject) = _messageConverter.ConvertForPublish(message, metadata, PublishDestinationType.Topic); + var (messageToSend, attributes, subject) = await _messageConverter.ConvertForPublishAsync(message, metadata); var request = new PublishRequest { diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index 57d029d95..cbab2e8f3 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -2,9 +2,7 @@ using Amazon.SQS; using Amazon.SQS.Model; using JustSaying.Messaging; -using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; -using JustSaying.Messaging.MessageHandling; using Microsoft.Extensions.Logging; using Message = JustSaying.Models.Message; using MessageAttributeValue = Amazon.SQS.Model.MessageAttributeValue; @@ -42,7 +40,7 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel { if (QueueUrl is null) throw new PublishException("Queue URL was null, perhaps you need to call `StartAsync` on the `IMessagePublisher` before publishing."); - var request = BuildSendMessageRequest(message, metadata); + var request = await BuildSendMessageRequestAsync(message, metadata); SendMessageResponse response; try { @@ -80,9 +78,9 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel } } - private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetadata metadata) + private async Task BuildSendMessageRequestAsync(Message message, PublishMetadata metadata) { - var (messageBody, attributes, _) = messageConverter.ConvertForPublish(message, metadata, PublishDestinationType.Queue); + var (messageBody, attributes, _) = await messageConverter.ConvertForPublishAsync(message, metadata); var request = new SendMessageRequest { diff --git a/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs index a754c7f67..7e85bc520 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs @@ -7,6 +7,7 @@ public class SnsWriteConfiguration { public ServerSideEncryption Encryption { get; set; } public PublishCompressionOptions CompressionOptions { get; set; } + public bool IsRawMessage { get; set; } /// /// Extension point enabling custom error handling on a per notification basis, including ability handle raised exceptions. diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs index e776c45bd..c3b3c00ed 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs @@ -13,6 +13,7 @@ public class SqsBasicConfiguration public int RetryCountBeforeSendingToErrorQueue { get; set; } = JustSayingConstants.DefaultHandlerRetryCount; public bool ErrorQueueOptOut { get; set; } public ServerSideEncryption ServerSideEncryption { get; set; } + public bool IsRawMessage { get; set; } public string QueueName { get; set; } public void ApplyQueueNamingConvention(IQueueNamingConvention namingConvention) diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index c6a0f1abc..d77fbf459 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -40,7 +40,7 @@ public static StaticPublicationConfiguration Build( var eventPublisher = new SnsMessagePublisher( snsClient, - new PublishMessageConverter(serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject), + new PublishMessageConverter(PublishDestinationType.Topic, serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject, writeConfiguration.IsRawMessage), loggerFactory, bus.Config.MessageSubjectProvider) { diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index f9ce8bb20..f26dce9f4 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -20,6 +20,7 @@ public sealed class QueueAddressPublicationBuilder : IPublicationBuilder private readonly QueueAddress _queueAddress; private PublishCompressionOptions _compressionOptions; private string _subject; + private bool _isRawMessage; /// /// Initializes a new instance of the class. @@ -49,6 +50,12 @@ public QueueAddressPublicationBuilder WithSubject(string subject) return this; } + public QueueAddressPublicationBuilder WithRawMessages() + { + _isRawMessage = true; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -64,7 +71,7 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa var eventPublisher = new SqsMessagePublisher( _queueAddress.QueueUrl, proxy.GetAwsClientFactory().GetSqsClient(RegionEndpoint.GetBySystemName(_queueAddress.RegionName)), - new PublishMessageConverter(bus.MessageBodySerializerFactory.GetSerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject), + new PublishMessageConverter(PublishDestinationType.Queue, bus.MessageBodySerializerFactory.GetSerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject, _isRawMessage), loggerFactory) { MessageResponseLogger = config.MessageResponseLogger diff --git a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs index e68517bd5..e4d62ccb5 100644 --- a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs @@ -110,7 +110,7 @@ void IPublicationBuilder.Configure( var eventPublisher = new SqsMessagePublisher( sqsClient, - new PublishMessageConverter(bus.MessageBodySerializerFactory.GetSerializer(), compressionRegistry, compressionOptions, subject), + new PublishMessageConverter(PublishDestinationType.Queue, bus.MessageBodySerializerFactory.GetSerializer(), compressionRegistry, compressionOptions, subject, writeConfiguration.IsRawMessage), loggerFactory) { MessageResponseLogger = config.MessageResponseLogger diff --git a/src/JustSaying/Fluent/SqsEndpointHelper.cs b/src/JustSaying/Fluent/SqsEndpointHelper.cs index b2e409e0f..9b5d637a2 100644 --- a/src/JustSaying/Fluent/SqsEndpointHelper.cs +++ b/src/JustSaying/Fluent/SqsEndpointHelper.cs @@ -9,7 +9,7 @@ public static string GetSqsHostname(string partition, string region) "aws-cn" => $"sqs.{region}.amazonaws.com.cn", "aws-us-gov" => $"sqs.{region}.amazonaws.com", "aws" => $"sqs.{region}.amazonaws.com", - _ => throw new ArgumentException("Unknown partition.", nameof(partition)) + _ => throw new ArgumentException($"Unknown partition: {partition}", nameof(partition)) }; } } diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 7ff886c56..b82375714 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -80,16 +80,14 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa var subjectProvider = bus.Config.MessageSubjectProvider; var subject = _subject ?? subjectProvider.GetSubjectForType(typeof(T)); - var eventPublisher = new TopicAddressPublisher( + var eventPublisher = new SnsMessagePublisher( + _topicAddress.TopicArn, proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(arn.Region)), + new PublishMessageConverter(PublishDestinationType.Topic, serializer, compressionRegistry, compressionOptions, subject, true), loggerFactory, - config.MessageSubjectProvider, - new PublishMessageConverter(serializer, compressionRegistry, compressionOptions, subject), - _exceptionHandler, - _topicAddress) - { - MessageResponseLogger = config.MessageResponseLogger - }; + subjectProvider, + _exceptionHandler); + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, compressionOptions); bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/TopicAddressPublisher.cs b/src/JustSaying/Fluent/TopicAddressPublisher.cs deleted file mode 100644 index dc2292a73..000000000 --- a/src/JustSaying/Fluent/TopicAddressPublisher.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Amazon.SimpleNotificationService; -using JustSaying.AwsTools.MessageHandling; -using JustSaying.Messaging; -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; -using Microsoft.Extensions.Logging; - -namespace JustSaying.Fluent; - -/// -/// An SNS message publisher for a . -/// -internal sealed class TopicAddressPublisher( - IAmazonSimpleNotificationService snsClient, - ILoggerFactory loggerFactory, - IMessageSubjectProvider subjectProvider, - IPublishMessageConverter messageConverter, - Func handleException, - TopicAddress topicAddress) : SnsMessagePublisher(topicAddress.TopicArn, snsClient, messageConverter, loggerFactory, subjectProvider, handleException) -{ -} diff --git a/src/JustSaying/JustSaying.csproj.DotSettings b/src/JustSaying/JustSaying.csproj.DotSettings deleted file mode 100644 index 6f06f2100..000000000 --- a/src/JustSaying/JustSaying.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - True \ No newline at end of file diff --git a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs index 95976d5d0..1c200c7be 100644 --- a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs +++ b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs @@ -23,6 +23,6 @@ public MessageCompressionRegistry(IList compressions = /// An instance for the specified encoding, or null if not found. public IMessageBodyCompression GetCompression(string contentEncoding) { - return _compressions.FirstOrDefault(x => x.ContentEncoding == contentEncoding); + return _compressions.FirstOrDefault(x => string.Equals(x.ContentEncoding, contentEncoding, StringComparison.OrdinalIgnoreCase)); } } diff --git a/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt index fe4afcff0..edc504236 100644 --- a/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt @@ -10,6 +10,10 @@ JustSaying.AwsTools.MessageHandling.PublishDestinationType.Queue = 2 -> JustSayi JustSaying.AwsTools.MessageHandling.PublishDestinationType.Topic = 1 -> JustSaying.AwsTools.MessageHandling.PublishDestinationType JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.IsRawMessage.get -> bool +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.IsRawMessage.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.IsRawMessage.get -> bool +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.IsRawMessage.set -> void JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions @@ -46,9 +50,9 @@ JustSaying.Messaging.Compression.MessageCompressionRegistry JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void JustSaying.Messaging.IPublishMessageConverter -JustSaying.Messaging.IPublishMessageConverter.ConvertForPublish(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, JustSaying.AwsTools.MessageHandling.PublishDestinationType destinationType) -> JustSaying.Messaging.MessageSerialization.PublishMessage +JustSaying.Messaging.IPublishMessageConverter.ConvertForPublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata) -> System.Threading.Tasks.ValueTask JustSaying.Messaging.IReceivedMessageConverter -JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceive(Amazon.SQS.Model.Message message) -> JustSaying.Messaging.MessageSerialization.ReceivedMessage +JustSaying.Messaging.IReceivedMessageConverter.ConvertForReceiveAsync(Amazon.SQS.Model.Message message) -> System.Threading.Tasks.ValueTask JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer @@ -167,3 +171,4 @@ JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void *REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult *REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher static JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions +JustSaying.Fluent.QueueAddressPublicationBuilder.WithRawMessages() -> JustSaying.Fluent.QueueAddressPublicationBuilder diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs index f7c846aba..765973765 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs @@ -17,7 +17,7 @@ public class WhenPublishing : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage)); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage), false); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs index 5da6d7570..d1353ba52 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs @@ -21,7 +21,7 @@ public class WhenPublishingAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage)); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage), false); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs index 49ad48281..4b2de7b67 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs @@ -16,7 +16,7 @@ public class WhenPublishingAsyncExceptionCanBeHandled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); return Task.FromResult(topic); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs index 360306c38..c2b37a819 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs @@ -17,7 +17,7 @@ public class WhenPublishingAsyncExceptionCanBeThrown : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs index d9530fe01..8f7be5265 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs @@ -25,7 +25,7 @@ public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For()) { MessageResponseLogger = (r, m) => diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs index fb2bd8e85..9772ffbc0 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs @@ -20,7 +20,7 @@ public class MessageWithTypeParameters : Message; private protected override Task CreateSystemUnderTestAsync() { var subject = new GenericMessageSubjectProvider().GetSubjectForType(typeof(MessageWithTypeParameters)); - var messageConverter = new PublishMessageConverter(new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), subject); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), subject, false); var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 0af479466..0ad49793f 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -12,7 +12,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishing : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private const string QueueName = "queuename"; @@ -45,7 +45,9 @@ public void MessageIsPublishedToQueue() { _capturedMessageBody.ShouldNotBeNull(); var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); - var content = jsonNode["Content"].ShouldNotBeNull().GetValue(); + var messageBody = jsonNode["Message"]!.GetValue(); + var message = JsonNode.Parse(messageBody).ShouldNotBeNull(); + var content = message["Content"].ShouldNotBeNull().GetValue(); content.ShouldBe("Hello"); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index ca957297f..7d48f75c0 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -12,7 +12,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsync : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private string _capturedMessageBody; @@ -45,7 +45,9 @@ public void MessageIsPublishedToQueue() { _capturedMessageBody.ShouldNotBeNull(); var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); - var content = jsonNode["Content"].ShouldNotBeNull().GetValue(); + var messageBody = jsonNode["Message"]!.GetValue(); + var message = JsonNode.Parse(messageBody).ShouldNotBeNull(); + var content = message["Content"].ShouldNotBeNull().GetValue(); content.ShouldBe("Hello"); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index 71d57d08e..3ed85fa70 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -15,7 +15,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _testMessage = new() { Content = "Hello" }; private const string QueueName = "queuename"; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index 8e3aae0ba..109ed6400 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -11,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessage : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); private const string Url = "https://testurl.com/" + QueueName; private readonly SimpleMessage _message = new(); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index 0579ee3ab..096d470c5 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -11,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase { - private readonly PublishMessageConverter _publishMessageConverter = new(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject"); + private readonly PublishMessageConverter _publishMessageConverter = new(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new(); private readonly PublishMetadata _metadata = new() diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs new file mode 100644 index 000000000..8fe59809d --- /dev/null +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs @@ -0,0 +1,57 @@ +using System.Text.Json.Nodes; +using Amazon.SQS.Model; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.Logging; +using NSubstitute; + +namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; + +public class WhenPublishingRawMessage : WhenPublishingTestBase +{ + private readonly PublishMessageConverter _publishMessageConverter = new(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", true); + private const string Url = "https://blablabla/" + QueueName; + private readonly SimpleMessage _message = new() { Content = "Hello" }; + private const string QueueName = "queuename"; + private string _capturedMessageBody; + + private protected override Task CreateSystemUnderTestAsync() + { + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _publishMessageConverter, Substitute.For()); + return Task.FromResult(sqs); + } + + protected override void Given() + { + Sqs.GetQueueUrlAsync(Arg.Any()) + .Returns(new GetQueueUrlResponse { QueueUrl = Url }); + + Sqs.GetQueueAttributesAsync(Arg.Any()) + .Returns(new GetQueueAttributesResponse()); + + Sqs.SendMessageAsync(Arg.Do(x => _capturedMessageBody = x.MessageBody)); + } + + protected override async Task WhenAsync() + { + await SystemUnderTest.PublishAsync(_message); + } + + [Fact] + public void MessageIsPublishedToQueue() + { + _capturedMessageBody.ShouldNotBeNull(); + var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); + var content = jsonNode["Content"].ShouldNotBeNull().GetValue(); + content.ShouldBe("Hello"); + } + + [Fact] + public void MessageIsPublishedToCorrectLocation() + { + Sqs.Received().SendMessageAsync(Arg.Is(x => x.QueueUrl == Url)); + } +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index 02810d87e..53bc52c39 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -47,8 +47,8 @@ public async Task Add_Different_Handler_Per_Queue() bus.AddMessageMiddleware(queueName1, middleware1); bus.AddMessageMiddleware(queueName2, middleware2); - ISqsQueue queue1 = TestQueue(queueName1); - ISqsQueue queue2 = TestQueue(queueName2); + ISqsQueue queue1 = await TestQueue(queueName1); + ISqsQueue queue2 = await TestQueue(queueName2); bus.AddQueue(group1, new SqsSource { @@ -106,7 +106,7 @@ private JustSaying.JustSayingBus CreateBus() return bus; } - private static FakeSqsQueue TestQueue( + private static async Task TestQueue( string queueName, Action spy = null) { @@ -115,9 +115,9 @@ private static FakeSqsQueue TestQueue( QueueName = queueName, }; - var messageConverter = new PublishMessageConverter(new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "TestJustSayingMessage"); + var messageConverter = new PublishMessageConverter(PublishDestinationType.Queue, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "TestJustSayingMessage", false); - List messages = [new TestMessage { Body = messageConverter.ConvertForPublish(message, null, PublishDestinationType.Queue).Body }]; + List messages = [new TestMessage { Body = (await messageConverter.ConvertForPublishAsync(message, null)).Body }]; var queue = new FakeSqsQueue(async ct => { diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs index 19d9de754..9088836af 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs @@ -9,9 +9,14 @@ public class DealingWithPotentiallyMissingConversation : XBehaviourTest CreateSystemUnderTest() + { + return new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); + } + protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() @@ -19,7 +24,7 @@ protected override void WhenAction() _jsonMessage = SystemUnderTest.Serialize(_messageOut); // Add extra property to see what happens: - _jsonMessage = _jsonMessage.Replace("{__", "{\"New\":\"Property\",__", StringComparison.OrdinalIgnoreCase); + _jsonMessage = _jsonMessage.Replace("{__", """{"New":"Property",__""", StringComparison.OrdinalIgnoreCase); _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs index dae073b1f..62f2903e4 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs @@ -9,9 +9,14 @@ public class WhenSerializingAndDeserializing : XBehaviourTest CreateSystemUnderTest() + { + return new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); + } + protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() From 3872c83a2e3b060b093c8ee38d6a5466e3197faf Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Mon, 7 Oct 2024 16:54:06 +0100 Subject: [PATCH 39/41] Fix json encoding issues --- .../MessageHandling/ReceivedMessageConverter.cs | 2 +- .../MessageHandling/SnsMessagePublisher.cs | 14 +++++--------- .../StaticPublicationConfiguration.cs | 3 +-- .../Fluent/TopicAddressPublicationBuilder`1.cs | 2 -- .../Fluent/AwsTools/WhenUsingABasicThrottle.cs | 3 ++- .../Sns/TopicByName/WhenPublishing.cs | 2 +- .../Sns/TopicByName/WhenPublishingAsync.cs | 2 +- .../WhenPublishingAsyncExceptionCanBeHandled.cs | 2 +- .../WhenPublishingAsyncExceptionCanBeThrown.cs | 2 +- .../WhenPublishingAsyncResponseLoggerIsCalled.cs | 2 +- ...ishingAsyncWithGenericMessageSubjectProvider.cs | 2 +- .../WhenExactlyOnceIsAppliedToHandler.cs | 10 ++++++---- ...OnceIsAppliedToHandlerWithoutExplicitTimeout.cs | 10 ++++++---- 13 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs index 5a4e6b726..250463bcf 100644 --- a/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs +++ b/src/JustSaying/AwsTools/MessageHandling/ReceivedMessageConverter.cs @@ -30,7 +30,7 @@ public ValueTask ConvertForReceiveAsync(Amazon.SQS.Model.Messag var jsonNode = JsonNode.Parse(body); if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) { - body = messageNode?.ToString(); + body = messageNode?.GetValue(); } } body = ApplyBodyDecompression(body, attributes); diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index 4cf3b980d..e85677ae5 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -3,26 +3,23 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.Messaging; using JustSaying.Messaging.Interrogation; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; using MessageAttributeValue = Amazon.SimpleNotificationService.Model.MessageAttributeValue; namespace JustSaying.AwsTools.MessageHandling; -internal class SnsMessagePublisher( +internal sealed class SnsMessagePublisher( IAmazonSimpleNotificationService client, IPublishMessageConverter messageConverter, ILoggerFactory loggerFactory, - IMessageSubjectProvider messageSubjectProvider, Func handleException = null) : IMessagePublisher, IInterrogable { private readonly IPublishMessageConverter _messageConverter = messageConverter; - private readonly IMessageSubjectProvider _messageSubjectProvider = messageSubjectProvider; private readonly Func _handleException = handleException; + private readonly IAmazonSimpleNotificationService _client = client; public Action MessageResponseLogger { get; set; } public string Arn { get; internal set; } - protected IAmazonSimpleNotificationService Client { get; } = client; private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); public SnsMessagePublisher( @@ -30,9 +27,8 @@ public SnsMessagePublisher( IAmazonSimpleNotificationService client, IPublishMessageConverter messageConverter, ILoggerFactory loggerFactory, - IMessageSubjectProvider messageSubjectProvider, Func handleException = null) - : this(client, messageConverter, loggerFactory, messageSubjectProvider, handleException) + : this(client, messageConverter, loggerFactory,handleException) { Arn = topicArn; } @@ -51,7 +47,7 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel PublishResponse response = null; try { - response = await Client.PublishAsync(request, cancellationToken).ConfigureAwait(false); + response = await _client.PublishAsync(request, cancellationToken).ConfigureAwait(false); } catch (AmazonServiceException ex) { @@ -138,7 +134,7 @@ private static MessageAttributeValue BuildMessageAttributeValue(Messaging.Messag }; } - public virtual InterrogationResult Interrogate() + public InterrogationResult Interrogate() { return new InterrogationResult(new { diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index d77fbf459..5ab4750f3 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -41,8 +41,7 @@ public static StaticPublicationConfiguration Build( var eventPublisher = new SnsMessagePublisher( snsClient, new PublishMessageConverter(PublishDestinationType.Topic, serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject, writeConfiguration.IsRawMessage), - loggerFactory, - bus.Config.MessageSubjectProvider) + loggerFactory) { MessageResponseLogger = bus.Config.MessageResponseLogger, }; diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index b82375714..e317edfaa 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -71,7 +71,6 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa logger.LogInformation("Adding SNS publisher for message type '{MessageType}'", typeof(T)); - var config = bus.Config; var arn = Arn.Parse(_topicAddress.TopicArn); var compressionRegistry = bus.CompressionRegistry; @@ -85,7 +84,6 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(arn.Region)), new PublishMessageConverter(PublishDestinationType.Topic, serializer, compressionRegistry, compressionOptions, subject, true), loggerFactory, - subjectProvider, _exceptionHandler); CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, compressionOptions); diff --git a/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs b/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs index a84bb5761..ce951afb0 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Text.Json; using Amazon.SQS.Model; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; @@ -72,7 +73,7 @@ public async Task Messages_Are_Throttled_But_Still_Delivered(int throttleMessage { var batchEntry = new SendMessageBatchRequestEntry { - MessageBody = $$"""{"Subject":"SimpleMessage", "Message": { "Content": "{{entriesAdded}}"} }""", + MessageBody = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode($$"""{ "Content": "{{entriesAdded}}" }""")}}" }""", Id = Guid.NewGuid().ToString() }; diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs index 765973765..4475d8e72 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs @@ -18,7 +18,7 @@ public class WhenPublishing : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage), false); - var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs index d1353ba52..ca4139252 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs @@ -22,7 +22,7 @@ public class WhenPublishingAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), nameof(SimpleMessage), false); - var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs index 4b2de7b67..4baa8a735 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs @@ -17,7 +17,7 @@ public class WhenPublishingAsyncExceptionCanBeHandled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); - var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, (_, _) => true); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs index c2b37a819..63867e3ce 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs @@ -18,7 +18,7 @@ public class WhenPublishingAsyncExceptionCanBeThrown : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); - var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, (_, _) => false); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs index 8f7be5265..adae5ef15 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs @@ -26,7 +26,7 @@ public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new NewtonsoftMessageBodySerializer(), new MessageCompressionRegistry(), new PublishCompressionOptions(), "Subject", false); - var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, Substitute.For()) + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance) { MessageResponseLogger = (r, m) => { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs index 9772ffbc0..d25976aa9 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs @@ -21,7 +21,7 @@ private protected override Task CreateSystemUnderTestAsync( { var subject = new GenericMessageSubjectProvider().GetSubjectForType(typeof(MessageWithTypeParameters)); var messageConverter = new PublishMessageConverter(PublishDestinationType.Topic, new FakeBodySerializer(Message), new MessageCompressionRegistry(), new PublishCompressionOptions(), subject, false); - var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs index be3599766..39390a4c1 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageHandling; @@ -18,10 +19,11 @@ public class WhenExactlyOnceIsAppliedToHandler(ITestOutputHelper testOutputHelpe protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", new TestMessage - { - Body = """{"Subject":"SimpleMessage", "Message": { "Content": "Hi"} }""" - }); + _queue = CreateSuccessfulTestQueue("TestQueue", + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode("""{ "Content": "Hi"} }""")}}"}""" + }); Queues.Add(_queue); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs index fb27abdf2..15e43a779 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageHandling; @@ -18,10 +19,11 @@ public class WhenExactlyOnceIsAppliedWithoutSpecificTimeout(ITestOutputHelper te protected override void Given() { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage - { - Body = """{"Subject":"SimpleMessage", "Message": { "Content": "Hi"} }""" - }); + _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode("""{ "Content": "Hi" }""")}}"}""" + }); Queues.Add(_queue); _messageLock = new FakeMessageLock(); From 7e016e6284c51982828bdbff50d4ff7621b4829e Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Tue, 8 Oct 2024 10:49:28 +0100 Subject: [PATCH 40/41] Tidy up a few bits --- .../AwsTools/QueueCreation/RedrivePolicy.cs | 18 +++++------------- src/JustSaying/PublicAPI/PublicAPI.Shipped.txt | 9 --------- .../JustSaying.TestingFramework/TaskHelpers.cs | 15 +-------------- .../Messaging/Channels/ChannelsTests.cs | 2 +- 4 files changed, 7 insertions(+), 37 deletions(-) diff --git a/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs b/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs index ea6b1af25..b43e9894a 100644 --- a/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs +++ b/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs @@ -1,15 +1,13 @@ +using System.Text.Json; using System.Text.Json.Serialization; -using Newtonsoft.Json; namespace JustSaying.AwsTools.QueueCreation; -public class RedrivePolicy +internal sealed class RedrivePolicy { - [JsonProperty("maxReceiveCount")] [JsonPropertyName("maxReceiveCount")] public int MaximumReceives { get; set; } - [JsonProperty("deadLetterTargetArn")] [JsonPropertyName("deadLetterTargetArn")] public string DeadLetterQueue { get; set; } @@ -19,15 +17,9 @@ public RedrivePolicy(int maximumReceives, string deadLetterQueue) DeadLetterQueue = deadLetterQueue; } - protected RedrivePolicy() - { - } - - // Cannot use System.Text.Json below as no public parameterless constructor. Change for v7? - public override string ToString() - => JsonConvert.SerializeObject(this); + => JsonSerializer.Serialize(this); public static RedrivePolicy ConvertFromString(string policy) - => JsonConvert.DeserializeObject(policy); -} \ No newline at end of file + => JsonSerializer.Deserialize(policy); +} diff --git a/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt index a1c0546c3..94c03c7aa 100644 --- a/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt @@ -127,13 +127,6 @@ JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErro JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void JustSaying.AwsTools.QueueCreation.ServerSideEncryption JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void @@ -693,7 +686,6 @@ override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.Aws override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task @@ -710,7 +702,6 @@ static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> Syste static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int diff --git a/tests/JustSaying.TestingFramework/TaskHelpers.cs b/tests/JustSaying.TestingFramework/TaskHelpers.cs index e7a8b6e30..a2d779a9b 100644 --- a/tests/JustSaying.TestingFramework/TaskHelpers.cs +++ b/tests/JustSaying.TestingFramework/TaskHelpers.cs @@ -2,24 +2,11 @@ namespace JustSaying.TestingFramework; public static class TaskHelpers { - public static async Task WaitWithTimeoutAsync(Task task) - => await WaitWithTimeoutAsync(task, TimeSpan.FromMilliseconds(10000)) - .ConfigureAwait(false); - - public static async Task WaitWithTimeoutAsync(Task task, TimeSpan timeoutDuration) - { - var timeoutTask = Task.Delay(timeoutDuration); - var firstToComplete = await Task.WhenAny(task, timeoutTask).ConfigureAwait(false); - - if (firstToComplete != timeoutTask) return true; - return false; - } - public static void DelaySendDone(TaskCompletionSource doneSignal) { Task.Run(async () => { - await Task.Delay(200).ConfigureAwait(false); + await Task.Delay(10).ConfigureAwait(false); doneSignal.SetResult(null); }); } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs index b7d10bf08..84e58c7a2 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs @@ -200,7 +200,7 @@ public async Task WhenSubscriberNotStarted_BufferShouldFillUp_AndStopDownloading var multiplexerCompletion = multiplexer.RunAsync(cts.Token); var bufferCompletion = buffer.RunAsync(cts.Token); - cts.CancelAfter(3.Seconds()); + cts.CancelAfter(1.Seconds()); await multiplexerCompletion.HandleCancellation(); await bufferCompletion.HandleCancellation(); From d549a5c47c821bd4c8f1ac59b4e2796e984d14c2 Mon Sep 17 00:00:00 2001 From: Stuart Lang Date: Tue, 8 Oct 2024 14:26:17 +0100 Subject: [PATCH 41/41] Apply some feedback --- .../IServiceCollectionExtensions.cs | 3 ++- .../JustSayingRegistry.cs | 4 +++- .../MessageHandling/Compression/PublishCompressionOptions.cs | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index b795e3b13..9b3c9d7ac 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -139,7 +139,8 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); - services.TryAddSingleton((p) => new MessageCompressionRegistry([new GzipMessageBodyCompression()])); + services.TryAddEnumerable(ServiceDescriptor.Singleton()); + services.TryAddSingleton(); services.TryAddSingleton(); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index 45f873db0..ecebdc734 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -10,6 +10,7 @@ using JustSaying.Messaging.Monitoring; using JustSaying.Naming; using StructureMap; +using StructureMap.Pipeline; namespace JustSaying; @@ -42,7 +43,8 @@ public JustSayingRegistry() For().Transient(); For().Transient(); - For().Use((p) => new MessageCompressionRegistry(new List { new GzipMessageBodyCompression() })).Singleton(); + For().Add().Singleton(); + For().Singleton(); For().Use().Singleton(); For().Singleton(); diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs index aed06d91a..9f6cc38a5 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs @@ -1,3 +1,5 @@ +using JustSaying.Messaging.Compression; + namespace JustSaying.AwsTools.MessageHandling; /// @@ -18,7 +20,7 @@ public sealed class PublishCompressionOptions /// Gets or sets the compression encoding to be used. /// /// - /// This should correspond to a registered compression algorithm in the .. + /// This should correspond to a registered compression algorithm in the . /// public string CompressionEncoding { get; set; } }