Skip to content

Improve support to AWS SQS/SNS#3437

Merged
iancooper merged 27 commits into
BrighterCommand:masterfrom
lillo42:GH-1294.add.aws.fifo
Jan 15, 2025
Merged

Improve support to AWS SQS/SNS#3437
iancooper merged 27 commits into
BrighterCommand:masterfrom
lillo42:GH-1294.add.aws.fifo

Conversation

@lillo42

@lillo42 lillo42 commented Dec 22, 2024

Copy link
Copy Markdown
Contributor

Hohohoho 🎅

  • Add support to SNS/SQS FIFO
  • Improve support for LocalStack
  • Rename some classes from Sqs to Sns (breaking changes)
  • Add support to SQS publication
  • Add Sample for SQS publication & FIFO

How should I handle the tests? My current approach is to duplicate them. Should I continue on this path?
Duplicate the test

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: -0.12 (9.65 -> 9.53)

  • Declining Code Health: 4 findings(s) 🚩

View detailed results in CodeScene

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: -0.10 (9.46 -> 9.36)

  • Declining Code Health: 8 findings(s) 🚩

View detailed results in CodeScene

@iancooper

Copy link
Copy Markdown
Member

Hi @lillo42 - thanks for this. To lift out of inline above, the usual strategy would be:

Folders for each queue type:

  • Standard
  • Fifo

Put the existing tests in Standard and duplicate the tests in Fifo, but with the changed semantics.

I tend to prefer being explicit in tests, over worrying about duplication there.

@iancooper

Copy link
Copy Markdown
Member

PS @lillo42 if you have time. One weakness in Brighter is that you have to produce to SNS and can't target a queue. It would be good to allow the queue to be the target. We now do something similar for ASB. Probably pop that in a separate PR though?

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.05 (9.61 -> 9.66)

  • Declining Code Health: 6 findings(s) 🚩

View detailed results in CodeScene

@iancooper iancooper left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks great. You may also need to support async approaches, you'll note the increased footprint when you merge in master. It is a little crude, as we just tend to duplicate in tests, but I sort of prefer tests to be explicit

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.10 (9.50 -> 9.60)

  • Declining Code Health: 5 findings(s) 🚩

View detailed results in CodeScene

@lillo42

lillo42 commented Dec 30, 2024

Copy link
Copy Markdown
Contributor Author

PS @lillo42 if you have time. One weakness in Brighter is that you have to produce to SNS and can't target a queue. It would be good to allow the queue to be the target. We now do something similar for ASB. Probably pop that in a separate PR though?

Sure no problem, I can add it to this PR.

@iancooper

Copy link
Copy Markdown
Member

Thanks @lillo42. Apologies in advance for the merge issues caused by the Reactor(Blocking)/Proactor(Non-Blocking) enhancement

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.05 (9.60 -> 9.65)

  • Declining Code Health: 5 findings(s) 🚩

View detailed results in CodeScene

@iancooper

Copy link
Copy Markdown
Member

We still have a credentials issue on the AWS tests, that means they don't show up here. I need to fix that too. Let me see if I can fix that and merge to main, so that we can at least see what is passing

RoutingKey topic,
TopicFindBy topicFindBy,
SnsAttributes? attributes,
OnMissingChannel makeTopic = OnMissingChannel.Create,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make makeTopic the last parameter? That keeps it in sync with other producers

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.43 (9.42 -> 9.85)

  • Declining Code Health: 10 findings(s) 🚩
  • Improving Code Health: 5 findings(s) ✅

View detailed results in CodeScene

|| contentType == CompressPayloadTransformerAsync.BROTLI)
return new MessageBody(sqsMessage.Body, contentType, CharacterEncoding.Base64);

public Message CreateMessage(Amazon.SQS.Model.Message sqsMessage)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ Getting worse: Complex Method
CreateMessage increases in cyclomatic complexity from 10 to 13, threshold = 9

Suppress

Comment on lines +72 to +75
RoutingKey topic,
TopicFindBy topicFindBy,
SnsAttributes? attributes,
OnMissingChannel makeTopic = OnMissingChannel.Create,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ New issue: Code Duplication
The module contains 2 functions with similar structure: EnsureQueueAsync,EnsureTopicAsync

Suppress

Comment on lines +184 to +188
private async Task<string> CreateQueueAsync(
string queueName,
SqsAttributes? sqsAttributes,
OnMissingChannel makeChannel,
CancellationToken cancellationToken)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ New issue: Complex Method
CreateQueueAsync has a cyclomatic complexity of 17, threshold = 9

Suppress

Comment on lines +282 to +342
private async Task<string> CreateDeadLetterQueueAsync(
SqsAttributes sqsAttributes,
CancellationToken cancellationToken)
{
using var sqsClient = _awsClientFactory.CreateSqsClient();

var queueName = sqsAttributes.RedrivePolicy!.DeadlLetterQueueName;

var tags = new Dictionary<string, string> { { "Source", "Brighter" } };
var attributes = new Dictionary<string, string?>();
if (sqsAttributes.Type == SnsSqsType.Fifo)
{
queueName = queueName.ToValidSQSQueueName(true);

attributes.Add(QueueAttributeName.FifoQueue, "true");
if (sqsAttributes.ContentBasedDeduplication)
{
attributes.Add(QueueAttributeName.ContentBasedDeduplication, "true");
}

if (sqsAttributes is { DeduplicationScope: not null, FifoThroughputLimit: not null })
{
attributes.Add(QueueAttributeName.FifoThroughputLimit,
sqsAttributes.FifoThroughputLimit.Value.ToString());
attributes.Add(QueueAttributeName.DeduplicationScope, sqsAttributes.DeduplicationScope switch
{
DeduplicationScope.MessageGroup => "messageGroup",
_ => "queue"
});
}
}

string queueUrl;

try
{
var request = new CreateQueueRequest(queueName) { Attributes = attributes, Tags = tags };
// create queue is idempotent, so safe to call even if queue already exists
var response = await sqsClient.CreateQueueAsync(request, cancellationToken);

queueUrl = response.QueueUrl ?? throw new InvalidOperationException(
$"Could not find create DLQ, status: {response.HttpStatusCode}");
}
catch (QueueNameExistsException)
{
var response = await sqsClient.GetQueueUrlAsync(queueName, cancellationToken);
queueUrl = response.QueueUrl;
}

var attributesResponse = await sqsClient.GetQueueAttributesAsync(
new GetQueueAttributesRequest { QueueUrl = queueUrl, AttributeNames = [QueueAttributeName.QueueArn] },
cancellationToken);

if (attributesResponse.HttpStatusCode != HttpStatusCode.OK)
{
throw new InvalidOperationException(
$"Could not find ARN of DLQ, status: {attributesResponse.HttpStatusCode}");
}

return attributesResponse.QueueARN;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ New issue: Complex Method
CreateDeadLetterQueueAsync has a cyclomatic complexity of 10, threshold = 9

Suppress

Comment on lines +184 to +188
private async Task<string> CreateQueueAsync(
string queueName,
SqsAttributes? sqsAttributes,
OnMissingChannel makeChannel,
CancellationToken cancellationToken)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ New issue: Bumpy Road Ahead
CreateQueueAsync has 3 blocks with nested conditional logic. Any nesting of 2 or deeper is considered. Threshold is one single, nested block per function

Suppress

Comment on lines +402 to +426
private async Task SubscribeToTopicAsync(
string topicArn,
string queueUrl,
SqsAttributes? sqsAttributes,
AmazonSQSClient sqsClient,
AmazonSimpleNotificationServiceClient snsClient)
{
var arn = await snsClient.SubscribeQueueAsync(topicArn, sqsClient, queueUrl);
if (string.IsNullOrEmpty(arn))
{
throw new InvalidOperationException(
$"Could not subscribe to topic: {topicArn} from queue: {queueUrl} in region {AwsConnection.Region}");
}

var response = await snsClient.SetSubscriptionAttributesAsync(
new SetSubscriptionAttributesRequest(arn,
"RawMessageDelivery",
sqsAttributes?.RawMessageDelivery.ToString())
);

if (response.HttpStatusCode != HttpStatusCode.OK)
{
throw new InvalidOperationException("Unable to set subscription attribute for raw message delivery");
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ New issue: Excess Number of Function Arguments
SubscribeToTopicAsync has 5 arguments, threshold = 4

Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/ChannelFactory.cs
Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/ChannelFactory.cs
Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/ChannelFactory.cs
Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/ChannelFactory.cs

@iancooper iancooper left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot here, and it is a great addition. A couple of minor tweaks, which are more o do with style over anything else.

Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/SnsMessageProducer.cs Outdated

var arnElements = s!.Split(':');
var topic = arnElements[(int)ARNAmazonSNS.TopicName];
var topic = topicArn.GetValueInString() ?? string.Empty;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The earlier version reduces nesting by returning early, which is generally preferable

}
}

var messageAttributes = new Dictionary<string, MessageAttributeValue>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typically we factor this into a publisher, to keep the producer clean of all the header manipulation

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.38 (9.48 -> 9.86)

  • Declining Code Health: 8 findings(s) 🚩
  • Improving Code Health: 5 findings(s) ✅

View detailed results in CodeScene

Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/RoutingKeyType.cs Outdated
@lillo42 lillo42 changed the title GH-1294 Add support to FIFO Improve support to AWS SQS/SNS Jan 6, 2025

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.38 (9.48 -> 9.86)

  • Declining Code Health: 8 findings(s) 🚩
  • Improving Code Health: 5 findings(s) ✅

View detailed results in CodeScene

Comment on lines +253 to +290
public SqsSubscription(
SubscriptionName? name = null,
ChannelName? channelName = null,
RoutingKey? routingKey = null,
int bufferSize = 1,
int noOfPerformers = 1,
TimeSpan? timeOut = null,
int requeueCount = -1,
TimeSpan? requeueDelay = null,
int unacceptableMessageLimit = 0,
MessagePumpType messagePumpType = MessagePumpType.Proactor,
IAmAChannelFactory? channelFactory = null,
int lockTimeout = 10,
int delaySeconds = 0,
int messageRetentionPeriod = 345600,
TopicFindBy findTopicBy = TopicFindBy.Name,
string? iAmPolicy = null,
RedrivePolicy? redrivePolicy = null,
SnsAttributes? snsAttributes = null,
Dictionary<string, string>? tags = null,
OnMissingChannel makeChannels = OnMissingChannel.Create,
bool rawMessageDelivery = true,
TimeSpan? emptyChannelDelay = null,
TimeSpan? channelFailureDelay = null,
SnsSqsType sqsType = SnsSqsType.Standard,
bool contentBasedDeduplication = true,
DeduplicationScope? deduplicationScope = null,
int? fifoThroughputLimit = null,
ChannelType channelType = ChannelType.PubSub,
QueueFindBy findQueueBy = QueueFindBy.Name
)
: base(typeof(T), name, channelName, routingKey, bufferSize, noOfPerformers, timeOut, requeueCount,
requeueDelay,
unacceptableMessageLimit, messagePumpType, channelFactory, lockTimeout, delaySeconds,
messageRetentionPeriod, findTopicBy,
iAmPolicy, redrivePolicy, snsAttributes, tags, makeChannels, rawMessageDelivery, emptyChannelDelay,
channelFailureDelay, sqsType, contentBasedDeduplication, deduplicationScope, fifoThroughputLimit,
channelType, findQueueBy)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ Getting worse: Constructor Over-Injection
SqsSubscription increases from 23 to 29 arguments, threshold = 5

Comment thread src/Paramore.Brighter.MessagingGateway.AWSSQS/SqsMessageSender.cs Outdated

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.38 (9.48 -> 9.86)

  • Declining Code Health: 10 findings(s) 🚩
  • Improving Code Health: 5 findings(s) ✅

View detailed results in CodeScene

Comment on lines +158 to +192
public SqsSubscription(
Type dataType,
SubscriptionName? name = null,
ChannelName? channelName = null,
RoutingKey? routingKey = null,
int bufferSize = 1,
int noOfPerformers = 1,
TimeSpan? timeOut = null,
int requeueCount = -1,
TimeSpan? requeueDelay = null,
int unacceptableMessageLimit = 0,
MessagePumpType messagePumpType = MessagePumpType.Unknown,
IAmAChannelFactory? channelFactory = null,
int lockTimeout = 10,
int delaySeconds = 0,
int messageRetentionPeriod = 345600,
TopicFindBy findTopicBy = TopicFindBy.Name,
string? iAmPolicy = null,
RedrivePolicy? redrivePolicy = null,
SnsAttributes? snsAttributes = null,
Dictionary<string, string>? tags = null,
OnMissingChannel makeChannels = OnMissingChannel.Create,
bool rawMessageDelivery = true,
TimeSpan? emptyChannelDelay = null,
TimeSpan? channelFailureDelay = null,
SnsSqsType sqsType = SnsSqsType.Standard,
bool contentBasedDeduplication = true,
DeduplicationScope? deduplicationScope = null,
int? fifoThroughputLimit = null,
ChannelType channelType = ChannelType.PubSub,
QueueFindBy findQueueBy = QueueFindBy.Name
)
: base(dataType, name, channelName, routingKey, bufferSize, noOfPerformers, timeOut, requeueCount,
requeueDelay, unacceptableMessageLimit, messagePumpType, channelFactory, makeChannels, emptyChannelDelay,
channelFailureDelay)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ Getting worse: Constructor Over-Injection
SqsSubscription increases from 24 to 30 arguments, threshold = 5

Comment on lines +46 to +119
public async Task<string?> SendAsync(Message message, TimeSpan? delay, CancellationToken cancellationToken)
{
var request = new SendMessageRequest
{
QueueUrl = _queueUrl,
MessageBody = message.Body.Value
};

delay ??= TimeSpan.Zero;
if (delay > TimeSpan.Zero)
{
// SQS has a hard limit of 15min for Delay in Seconds
if (delay.Value > s_maxDelay)
{
delay = s_maxDelay;
s_logger.LogWarning("Set delay from {CurrentDelay} to 15min (SQS support up to 15min)", delay);
}

request.DelaySeconds = (int)delay.Value.TotalSeconds;
}

if (_queueType == SnsSqsType.Fifo)
{
request.MessageGroupId = message.Header.PartitionKey;
if (message.Header.Bag.TryGetValue(HeaderNames.DeduplicationId, out var deduplicationId))
{
request.MessageDeduplicationId = (string)deduplicationId;
}
}

var messageAttributes = new Dictionary<string, MessageAttributeValue>
{
[HeaderNames.Id] =
new() { StringValue = message.Header.MessageId, DataType = "String" },
[HeaderNames.Topic] = new() { StringValue = _queueUrl, DataType = "String" },
[HeaderNames.ContentType] = new() { StringValue = message.Header.ContentType, DataType = "String" },
[HeaderNames.CorrelationId] =
new() { StringValue = message.Header.CorrelationId, DataType = "String" },
[HeaderNames.HandledCount] =
new() { StringValue = Convert.ToString(message.Header.HandledCount), DataType = "String" },
[HeaderNames.MessageType] =
new() { StringValue = message.Header.MessageType.ToString(), DataType = "String" },
[HeaderNames.Timestamp] = new()
{
StringValue = Convert.ToString(message.Header.TimeStamp), DataType = "String"
}
};

if (!string.IsNullOrEmpty(message.Header.ReplyTo))
{
messageAttributes.Add(HeaderNames.ReplyTo,
new MessageAttributeValue { StringValue = message.Header.ReplyTo, DataType = "String" });
}

if (!string.IsNullOrEmpty(message.Header.Subject))
{
messageAttributes.Add(HeaderNames.Subject,
new MessageAttributeValue { StringValue = message.Header.Subject, DataType = "String" });
}

// we can set up to 10 attributes; we have set 6 above, so use a single JSON object as the bag
var bagJson = JsonSerializer.Serialize(message.Header.Bag, JsonSerialisationOptions.Options);
messageAttributes[HeaderNames.Bag] = new() { StringValue = bagJson, DataType = "String" };
request.MessageAttributes = messageAttributes;

var response = await _client.SendMessageAsync(request, cancellationToken);
if (response.HttpStatusCode is HttpStatusCode.OK or HttpStatusCode.Created
or HttpStatusCode.Accepted)
{
return response.MessageId;
}

return null;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ New issue: Complex Method
SendAsync has a cyclomatic complexity of 9, threshold = 9

Suppress

Comment on lines +46 to +119
public async Task<string?> SendAsync(Message message, TimeSpan? delay, CancellationToken cancellationToken)
{
var request = new SendMessageRequest
{
QueueUrl = _queueUrl,
MessageBody = message.Body.Value
};

delay ??= TimeSpan.Zero;
if (delay > TimeSpan.Zero)
{
// SQS has a hard limit of 15min for Delay in Seconds
if (delay.Value > s_maxDelay)
{
delay = s_maxDelay;
s_logger.LogWarning("Set delay from {CurrentDelay} to 15min (SQS support up to 15min)", delay);
}

request.DelaySeconds = (int)delay.Value.TotalSeconds;
}

if (_queueType == SnsSqsType.Fifo)
{
request.MessageGroupId = message.Header.PartitionKey;
if (message.Header.Bag.TryGetValue(HeaderNames.DeduplicationId, out var deduplicationId))
{
request.MessageDeduplicationId = (string)deduplicationId;
}
}

var messageAttributes = new Dictionary<string, MessageAttributeValue>
{
[HeaderNames.Id] =
new() { StringValue = message.Header.MessageId, DataType = "String" },
[HeaderNames.Topic] = new() { StringValue = _queueUrl, DataType = "String" },
[HeaderNames.ContentType] = new() { StringValue = message.Header.ContentType, DataType = "String" },
[HeaderNames.CorrelationId] =
new() { StringValue = message.Header.CorrelationId, DataType = "String" },
[HeaderNames.HandledCount] =
new() { StringValue = Convert.ToString(message.Header.HandledCount), DataType = "String" },
[HeaderNames.MessageType] =
new() { StringValue = message.Header.MessageType.ToString(), DataType = "String" },
[HeaderNames.Timestamp] = new()
{
StringValue = Convert.ToString(message.Header.TimeStamp), DataType = "String"
}
};

if (!string.IsNullOrEmpty(message.Header.ReplyTo))
{
messageAttributes.Add(HeaderNames.ReplyTo,
new MessageAttributeValue { StringValue = message.Header.ReplyTo, DataType = "String" });
}

if (!string.IsNullOrEmpty(message.Header.Subject))
{
messageAttributes.Add(HeaderNames.Subject,
new MessageAttributeValue { StringValue = message.Header.Subject, DataType = "String" });
}

// we can set up to 10 attributes; we have set 6 above, so use a single JSON object as the bag
var bagJson = JsonSerializer.Serialize(message.Header.Bag, JsonSerialisationOptions.Options);
messageAttributes[HeaderNames.Bag] = new() { StringValue = bagJson, DataType = "String" };
request.MessageAttributes = messageAttributes;

var response = await _client.SendMessageAsync(request, cancellationToken);
if (response.HttpStatusCode is HttpStatusCode.OK or HttpStatusCode.Created
or HttpStatusCode.Accepted)
{
return response.MessageId;
}

return null;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ New issue: Bumpy Road Ahead
SendAsync has 2 blocks with nested conditional logic. Any nesting of 2 or deeper is considered. Threshold is one single, nested block per function

Suppress

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.38 (9.48 -> 9.86)

  • Declining Code Health: 10 findings(s) 🚩
  • Improving Code Health: 5 findings(s) ✅

View detailed results in CodeScene

@codescene-delta-analysis codescene-delta-analysis Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Health Quality Gates: FAILED

Change in average Code Health of affected files: +0.01 (9.29 -> 9.30)

  • Declining Code Health: 10 findings(s) 🚩
  • Improving Code Health: 5 findings(s) ✅
  • Affected Hotspots: 1 files(s) 🔥

View detailed results in CodeScene

@iancooper iancooper merged commit de05cfe into BrighterCommand:master Jan 15, 2025
@iancooper

Copy link
Copy Markdown
Member

Thanks @lillo42

@lillo42 lillo42 deleted the GH-1294.add.aws.fifo branch January 15, 2025 15:55
DevJonny pushed a commit to DevJonny/Brighter that referenced this pull request Feb 28, 2026
* BrighterCommandGH-1294 Add support to FIFO

* BrighterCommandGH-1294 fixes build

* BrighterCommandGH-1294 Add Fifo test

* BrighterCommandGH-1294 fixes unit test

* BrighterCommandGH-1294 Improve support to LocalStack

* BrighterCommandGH-1294 Use AwsFactory

* BrighterCommandGH-1294 Fixes the majority of test, improve support to localstack and rename SQS to SNS

* BrighterCommandGH-1294 Fixes http test

* Add Fifo test

* BrighterCommandGH-1294 fixes DLQ, Get System Attribute & Unit tests

* BrighterCommandGH-1294 Improve Valid SQS/SNS name logic

* BrighterCommandGH-1294 Improve Valid SQS/SNS name logic

* Add support to SQS Publication and add FIFO tests

* Fixes SQS unit tests

* BrighterCommandGH-1294 Add Fifo sample

* Improvements

* Rename ChannelType

* Set max delay
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants