ssut / nestjs-sqs

A project to make SQS easier to use within NestJS, with decorator-based handling and seamless NestJS-way integration.
MIT License
214 stars 53 forks source link

feat: add globalOptions support in SqsService with sqs endpoint property #81

Open marcin-zajac-pc opened 6 months ago

marcin-zajac-pc commented 6 months ago

Context

Related issue: Issue #78.

Problem

Currently, we're unable to set the SQS endpoint when the module is registered. As mentioned in the issue, when using an emulator, we receive warnings because the queueUrl is composed from AWS credentials in the environment, which differs from local URLs such as those used by LocalStack.

QueueUrl=https://localhost.localstack.cloud:4566/000000000000/iam_sync-user-queue differs from SQSClient resolved endpoint=https://sqs.us-east-1.amazonaws.com/, using QueueUrl host as endpoint.
Set [endpoint=string] or [useQueueUrlAsEndpoint=false] on the SQSClient

The error message suggests using the useQueueUrlAsEndpoint property, but I couldn't find that in the SQSClient options. However, setting the endpoint directly resolves the issue.

To provide more background, when running SQS locally using LocalStack, I set the SQS endpoint to http://localhost:4566.

Solution

I added an optional globalOptions object property with an endpoint field to allow setting the endpoint directly on the SQSClient. The condition ensures that if the consumer/producer options have an sqs property, it won't be overwritten by the global one. I decided that consumer/producer options should take priority.

This solution was tested locally and works as expected.

Other Thoughts

We can discuss adding more properties to the globalOptions. I'm open to suggestions, but for now, I wasn't sure if anything else would be necessary.

ssut commented 4 months ago

Thanks for addressing the issue with this PR. All the changes seem LGTM. However I think it would be helpful to write some docs for this change so that new users of this library will know how to use this option. Could you please add some docs for this?