event-message-broker
Version:
A Message Bus that uses AWS Stack and RabbitMQ
100 lines (99 loc) • 4.29 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AWSBus = void 0;
const o11y_1 = require("../../application/utils/o11y");
const EventBridgeService_1 = require("./EventBridgeService");
const SNSService_1 = require("./SNSService");
const SQSService_1 = require("./SQSService");
const api_1 = require("@opentelemetry/api");
class AWSBus {
constructor() {
this.eventBridge = new EventBridgeService_1.EventBridgeService();
this.sqs = new SQSService_1.SQSService();
this.sns = new SNSService_1.SNSService();
}
publish(topicName, message) {
return __awaiter(this, void 0, void 0, function* () {
yield this.handleSpan((span) => __awaiter(this, void 0, void 0, function* () {
span.setAttribute('topic', topicName);
const messageId = yield this.sns.publish(topicName, message);
span.addEvent('message-published', {
provider: 'aws-sns',
messageId,
correlationId: message.CorrelationId
});
}));
});
}
send(queueName, message, params) {
return __awaiter(this, void 0, void 0, function* () {
yield this.handleSpan((span) => __awaiter(this, void 0, void 0, function* () {
span.setAttribute('queue', queueName);
const messageId = yield this.sqs.send(queueName, message, params);
span.addEvent('message-sent', {
provider: 'aws-sqs',
messageId,
correlationId: message.CorrelationId
});
}));
});
}
redelivery(params) {
return __awaiter(this, void 0, void 0, function* () {
yield this.handleSpan((span) => __awaiter(this, void 0, void 0, function* () {
span.setAttribute('queue', params.QueueName);
const output = yield this.sqs.redelivery(params);
span.addEvent('message-redelivered', {
provider: 'aws-sqs',
messageId: output.messageId,
correlationId: params.Message.Object.CorrelationId,
delay: params.DelaySeconds + 's',
attempt: output.attempt,
startsAt: output.startsAt
});
}));
});
}
schedule(params) {
return __awaiter(this, void 0, void 0, function* () {
yield this.handleSpan((span) => __awaiter(this, void 0, void 0, function* () {
span.setAttribute('topic', params.TopicName);
const output = yield this.eventBridge.schedule(params);
span.addEvent('message-scheduled', {
correlationId: params.Message.CorrelationId,
scheduleName: output.Id,
scheduleArn: output.ScheduleArn
});
}));
});
}
consume(params) {
this.sqs.consume(params);
}
handleSpan(func) {
return __awaiter(this, void 0, void 0, function* () {
const span = (0, o11y_1.startSpan)('bus', api_1.SpanKind.PRODUCER);
try {
yield func(span);
}
catch (error) {
span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: error.message });
span.recordException(error);
throw error;
}
finally {
span.end();
}
});
}
}
exports.AWSBus = AWSBus;