Skip to content

feat: add support for custom SQS endpoint#2458

Open
maxir143 wants to merge 2 commits intoEvolutionAPI:mainfrom
maxir143:feat/sqs-custom-endpoint
Open

feat: add support for custom SQS endpoint#2458
maxir143 wants to merge 2 commits intoEvolutionAPI:mainfrom
maxir143:feat/sqs-custom-endpoint

Conversation

@maxir143
Copy link

@maxir143 maxir143 commented Mar 3, 2026

📋 Description

Add support for custom endpoint at SQS enabling users to use localstack endpoint, config, set it and clean the endpoint from environment variables, if not, fallback to default behaviour.

🔗 Related Issue

Closes #(issue_number)

🧪 Type of Change

  • 🐛 Bug fix (non-breaking change which fixes an issue)
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📚 Documentation update
  • 🔧 Refactoring (no functional changes)
  • ⚡ Performance improvement
  • 🧹 Code cleanup
  • 🔒 Security fix

🧪 Testing

  • Manual testing completed
  • Functionality verified in development environment
  • No breaking changes introduced
  • Tested with different connection types (if applicable)

📸 Screenshots (if applicable)

✅ Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have manually tested my changes thoroughly
  • I have verified the changes work with different scenarios
  • Any dependent changes have been merged and published

📝 Additional Notes

Summary by Sourcery

Add configurable support for custom SQS endpoints while preserving existing default behavior.

New Features:

  • Allow configuring a custom SQS endpoint via environment variables and propagate it through SQS configuration.
  • Support queue URL generation against a custom SQS endpoint when provided, falling back to the standard AWS SQS URL otherwise.

@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Mar 3, 2026

Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

Adds optional support for a custom SQS endpoint (e.g., Localstack) by wiring a new SQS_ENDPOINT env var through configuration, SQS client initialization, and queue URL construction while preserving existing default AWS behavior when not set.

Sequence diagram for publishing SQS message with optional custom endpoint

sequenceDiagram
  actor User
  participant Service
  participant ConfigService
  participant SqsController
  participant AwsSQS as Aws_SQS_SDK

  User->>Service: triggerEvent(event, payload)
  Service->>ConfigService: getSqsConfig()
  ConfigService-->>Service: Sqs config (includes ENDPOINT)
  Service->>SqsController: publishEvent(event, payload, extra)
  SqsController->>SqsController: initializeSqs() with REGION and ENDPOINT
  alt Custom endpoint provided
    SqsController->>SqsController: buildQueueUrl() using ENDPOINT without trailing slash
  else Default AWS endpoint
    SqsController->>SqsController: buildQueueUrl() using https://sqs.REGION.amazonaws.com
  end
  SqsController->>AwsSQS: sendMessage(queueUrl, message)
  AwsSQS-->>SqsController: sendMessageResult
  SqsController-->>Service: publishEvent result
  Service-->>User: event processed
Loading

Updated class diagram for SQS configuration and controller

classDiagram
  class Sqs {
    +string ACCESS_KEY_ID
    +string SECRET_ACCESS_KEY
    +string ACCOUNT_ID
    +string REGION
    +string ENDPOINT
    +number MAX_PAYLOAD_SIZE
  }

  class ConfigService {
    +getSqsConfig() Sqs
  }

  class SqsController {
    -Sqs awsConfig
    -Sqs sqsConfig
    -SQS sqsClient
    +constructor(configService ConfigService)
    +initializeSqs() void
    +publishEvent(event string, payload any, extra any) Promise~void~
    -buildQueueUrl(event string, prefixName string) string
  }

  ConfigService --> Sqs : returns
  SqsController --> ConfigService : uses
  SqsController --> Sqs : reads configuration
Loading

File-Level Changes

Change Details Files
Wire SQS_ENDPOINT through configuration so it can be used by the SQS integration.
  • Extend the Sqs config type to include an ENDPOINT field
  • Populate the new ENDPOINT field from the SQS_ENDPOINT environment variable with a default empty string
src/config/env.config.ts
Use the optional custom endpoint for SQS client initialization and queue URL construction, falling back to AWS defaults when not provided.
  • Pass awsConfig.ENDPOINT (or undefined if empty) as the endpoint option when constructing the SQS client
  • Build queue URLs against the custom endpoint when configured, stripping any trailing slash, otherwise use the standard AWS SQS regional URL format
src/api/integrations/event/sqs/sqs.controller.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've found 1 issue, and left some high level feedback:

  • Consider making Sqs.ENDPOINT optional (ENDPOINT?: string) and defaulting it to undefined instead of '' in ConfigService so you can avoid relying on truthiness checks and keep the type aligned with how it’s used when passing to the SQS client.
  • The URL construction for custom endpoints assumes the endpoint does not already contain the account ID path; if users might pass a fully qualified LocalStack URL, you may want to either document that constraint or add a small normalization/validation helper to avoid double-appending the account ID.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- Consider making `Sqs.ENDPOINT` optional (`ENDPOINT?: string`) and defaulting it to `undefined` instead of `''` in `ConfigService` so you can avoid relying on truthiness checks and keep the type aligned with how it’s used when passing to the SQS client.
- The URL construction for custom endpoints assumes the endpoint does not already contain the account ID path; if users might pass a fully qualified LocalStack URL, you may want to either document that constraint or add a small normalization/validation helper to avoid double-appending the account ID.

## Individual Comments

### Comment 1
<location path="src/api/integrations/event/sqs/sqs.controller.ts" line_range="129-130" />
<code_context>
             : `${event.replace('.', '_').toLowerCase()}`;
         const queueName = `${prefixName}_${eventFormatted}.fifo`;
-        const sqsUrl = `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`;
+        const sqsUrl = sqsConfig.ENDPOINT
+          ? `${sqsConfig.ENDPOINT.replace(/\/$/, '')}/${sqsConfig.ACCOUNT_ID}/${queueName}`
+          : `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`;

</code_context>
<issue_to_address>
**nitpick:** Normalize endpoint more robustly when stripping trailing slashes.

`replace(/\/$/, '')` only strips one trailing slash, so an endpoint like `http://localhost:4566///` would still produce extra slashes before the account ID. Using `replace(/\/+$/, '')`, the `URL` API, or a small normalization helper would make this more robust and avoid subtle URL issues.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant