UNPKG

@nodeboot/starter-aws

Version:

Node-Boot starter package for AWS services

99 lines 5.64 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SqsListenerAdapter = void 0; const context_1 = require("@nodeboot/context"); const types_1 = require("../types"); const client_sqs_1 = require("@aws-sdk/client-sqs"); const sqs_consumer_1 = require("sqs-consumer"); const SQS_URL_PATTERN = /^https:\/\/sqs\.(?<region>[a-z0-9-]+)\.amazonaws\.com\/(?<accountId>\d{12})\/(?<queueName>[a-zA-Z0-9_-]+)$/; let SqsListenerAdapter = class SqsListenerAdapter { options; constructor(options) { this.options = options; } isValidSqsUrl(url) { return SQS_URL_PATTERN.test(url); } getQueueUrl(config, queueUrlOrConfigPlaceholder) { const configPlaceholder = (0, context_1.extractPlaceholderKey)(queueUrlOrConfigPlaceholder); if (configPlaceholder) { return config.getString(configPlaceholder); } else { return queueUrlOrConfigPlaceholder; } } bind({ logger, iocContainer, config }) { const { target, queueUrlOrConfigPlaceholder, listenerFunction } = this.options; // Check if SQS feature is enabled if (context_1.ApplicationContext.get().applicationFeatures[types_1.AWS_SQS_FEATURE]) { // Check if the current active profiles allow this SQS listener // This is useful for conditional listener registration based on environment profiles // e.g., only register certain listeners in production or development environments. if ((0, context_1.allowedProfiles)(target)) { // Retrieve the class instance (bean) from the DI container const componentBean = iocContainer.get(target.constructor); const queueUrl = this.getQueueUrl(config, queueUrlOrConfigPlaceholder); // Validate SQS Queue url if (this.isValidSqsUrl(queueUrl)) { logger.info(`Registering SQS Listener "${queueUrl}" --> "${target.constructor.name}:::${listenerFunction.name}()"`); // "@ts-expect-error" SQSClient have a strange way to pass arguments to constructor that can make ts fail const sqsClient = iocContainer.get(client_sqs_1.SQSClient); const app = sqs_consumer_1.Consumer.create({ queueUrl: queueUrl, pollingWaitTimeMs: 1000, handleMessage: async (msg) => { const body = JSON.parse(msg.Body); const message = { messageId: body.MessageId, signature: body.Signature, timestamp: body.Timestamp, message: JSON.parse(body.Message), }; await listenerFunction.bind(componentBean)(message); }, sqs: sqsClient, }); app.on("error", err => { logger.error(`SQS Generic Error: ${err.message}`); }); app.on("processing_error", err => { logger.error(`SQS Processing Error: ${err.message}`); }); app.on("timeout_error", err => { logger.error(`SQS Timeout Error: ${err.message}`); }); app.start(); } else { logger.warn(`Invalid SQS queue URL for @SqsListener at function "${target.constructor.name}:::${listenerFunction.name}()". Please provide a valid URL in the format "https://sqs.aws-region.amazonaws.com/account-id/queue-name"`); } } else { logger.warn(`SqsListener ${target.constructor.name}:::${listenerFunction.name}() with queueUrl ${queueUrlOrConfigPlaceholder} registered but the active profiles ${(0, context_1.getActiveProfiles)()} do not match the required profiles defined in the component/service class.`); } } else { logger.warn(`⏰ SqsListener ${target.constructor.name}:::${listenerFunction.name}() with queueUrl ${queueUrlOrConfigPlaceholder} registered but AWS SQS is disabled. To enable AWS SQS, please decorate your Node-Boot application class with @EnableAws() and provide SQS region the configuration at "integrations.aws.sqs.region" config path.`); } } }; exports.SqsListenerAdapter = SqsListenerAdapter; exports.SqsListenerAdapter = SqsListenerAdapter = __decorate([ (0, context_1.Lifecycle)("persistence.started"), __metadata("design:paramtypes", [Object]) ], SqsListenerAdapter); //# sourceMappingURL=SqsListenerAdapter.js.map