< Summary - AsyncResponse (Release / net8.0+net10.0 / unit+integration)

Information
Class: Microsoft.Extensions.DependencyInjection.SqsAsyncResponseServiceCollectionExtensions
Assembly: AsyncResponse.Transports.SQS
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.SQS/ServiceCollectionExtensions.cs
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 66
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
WithSqsTransport(...)100%66100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.SQS/ServiceCollectionExtensions.cs

#LineLine coverage
 1using AsyncResponse;
 2using AsyncResponse.Transports.SQS;
 3using Microsoft.Extensions.DependencyInjection.Extensions;
 4
 5namespace Microsoft.Extensions.DependencyInjection;
 6
 7/// <summary>DI registration for the AWS SQS AsyncResponse transport.</summary>
 8public static class SqsAsyncResponseServiceCollectionExtensions
 9{
 10    /// <summary>
 11    /// Registers AWS SQS as the worker transport and response ingress in one call:
 12    /// <list type="bullet">
 13    /// <item><description>worker jobs are published to <see cref="SqsAsyncResponseOptions.WorkerQueue"/>;</description>
 14    /// <item><description>a hosted subscriber long-polls that worker queue and executes worker jobs;</description></ite
 15    /// <item><description>a hosted subscriber long-polls <see cref="SqsAsyncResponseOptions.ResponseQueue"/> and feeds 
 16    /// </list>
 17    /// Redelivery and dead-lettering stay native: a failed handler leaves the message for the
 18    /// visibility timeout, and the queue's redrive policy moves it to the dead-letter queue after
 19    /// <c>maxReceiveCount</c> receives (provision both with
 20    /// <see cref="SqsAsyncResponseOptions.CreateQueues"/> or your infrastructure tooling). SQS is a
 21    /// transport, not a recovery store: pair it with a channel (<c>.WithInMemoryChannel()</c> for
 22    /// simple apps, or a durable channel such as <c>.WithRedisChannel()</c>,
 23    /// <c>.WithPostgreSqlChannel()</c>, or <c>.WithNatsChannel()</c> when late responses must
 24    /// survive redeploys). An application-registered <c>Amazon.SQS.IAmazonSQS</c> singleton (for
 25    /// example from <c>AWSSDK.Extensions.NETCore.Setup</c>) is reused when present.
 26    /// </summary>
 27    public static AsyncResponseRegistrationBuilder WithSqsTransport(
 28        this AsyncResponseRegistrationBuilder builder,
 29        Action<SqsAsyncResponseOptions> configure)
 30    {
 331        ArgumentNullException.ThrowIfNull(configure);
 32
 333        var services = builder.Services;
 334        services.AddOptions();
 335        services.Configure(configure);
 36
 337        services.TryAddSingleton(SqsClientResolver.Create);
 338        services.TryAddSingleton(provider => new SqsWorkerTransport(
 339            provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqsAsyncResponseOptions>>(),
 340            provider.GetRequiredService<ISqsClient>()));
 341        services.Replace(ServiceDescriptor.Singleton<IWorkerTransport>(provider =>
 342            provider.GetRequiredService<SqsWorkerTransport>()));
 343        services.Replace(ServiceDescriptor.Singleton<IAsyncResponseReplyTargetProvider, SqsReplyTargetProvider>());
 344        services.AddSingleton(provider =>
 345        {
 346            // Resolved ack modes declared to the Core startup validator, which vetoes early ACK on
 347            // the worker queue durable-flow wake-ups ride (see AsyncResponseStartupValidator).
 348            var options = provider.GetRequiredService<Microsoft.Extensions.Options.IOptions<SqsAsyncResponseOptions>>().
 349            return new AsyncResponseTransportMarker(SqsAsyncResponseOptions.TransportName)
 350            {
 351                WorkerSubscriberUsesEarlyAck = options.WorkerSubscriber.AckMode == SqsAckMode.AckAfterEnqueue,
 352                WorkerAckModePath = $"{nameof(SqsAsyncResponseOptions)}.{nameof(options.WorkerSubscriber)}.{nameof(optio
 353                ResponseSubscriberUsesEarlyAck = options.ResponseSubscriber.AckMode == SqsAckMode.AckAfterEnqueue,
 354                ResponseAckModePath = $"{nameof(SqsAsyncResponseOptions)}.{nameof(options.ResponseSubscriber)}.{nameof(o
 355            };
 356        });
 57
 58        // Registered before the subscribers: hosted services start in registration order, so
 59        // CreateQueues provisioning completes before the first ReceiveMessage loop begins.
 360        services.AddHostedService<SqsQueueProvisioningService>();
 361        services.AddHostedService<SqsWorkerSubscriber>();
 362        services.AddHostedService<SqsResponseIngressSubscriber>();
 63
 364        return builder;
 65    }
 66}