@nodeboot/starter-aws
Version:
Node-Boot starter package for AWS services
99 lines • 5.64 kB
JavaScript
;
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