bb-inspired
Version:
Core library for BB-inspired NestJS backend
96 lines • 4.37 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);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var MessagingService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessagingService = void 0;
const common_1 = require("@nestjs/common");
const rabbitmq_service_1 = require("./rabbitmq.service");
const event_bus_service_1 = require("./event-bus.service");
const logger_1 = require("../../utils/logger");
let MessagingService = MessagingService_1 = class MessagingService {
constructor(options, rabbitMQService, eventBusService) {
this.options = options;
this.rabbitMQService = rabbitMQService;
this.eventBusService = eventBusService;
this.logger = new logger_1.AppLogger(MessagingService_1.name);
}
async publish(topic, payload, options = {}) {
const { metadata = {}, localOnly = false, externalOnly = false } = options;
const messageType = topic.includes('.') ? topic.split('.').pop() : topic;
if (!externalOnly) {
const event = {
name: topic,
payload,
timestamp: new Date(),
metadata,
};
this.eventBusService.publish(event);
}
if (!localOnly) {
const message = {
type: messageType,
payload,
metadata,
};
await this.rabbitMQService.publish(topic, message);
}
this.logger.verbose(`Published message to ${topic}`, { metadata: { localOnly, externalOnly, type: messageType } });
}
async subscribe(topic, handler, options = {}) {
const { localOnly = false, externalOnly = false, messageType } = options;
const derivedMessageType = messageType || (topic.includes('.') ? topic.split('.').pop() : topic);
if (!externalOnly) {
this.eventBusService.register(topic, (event) => {
return handler(event.payload, event.metadata);
});
}
if (!localOnly) {
const messageHandler = {
messageType: derivedMessageType,
handle: async (message) => {
return handler(message.payload, message.metadata);
},
};
await this.rabbitMQService.subscribe(topic, messageHandler);
}
this.logger.verbose(`Subscribed to ${topic}`, { metadata: { localOnly, externalOnly, type: derivedMessageType } });
}
async unsubscribe(topic, handler, options = {}) {
const { localOnly = false, externalOnly = false } = options;
if (!externalOnly && handler) {
this.eventBusService.unregister(topic, handler);
}
if (!localOnly) {
await this.rabbitMQService.unsubscribe(topic);
}
this.logger.verbose(`Unsubscribed from ${topic}`, { metadata: { localOnly, externalOnly } });
}
isConnected() {
return this.rabbitMQService.getConnectionStatus();
}
getEventBus() {
return this.eventBusService;
}
getRabbitMQ() {
return this.rabbitMQService;
}
};
exports.MessagingService = MessagingService;
exports.MessagingService = MessagingService = MessagingService_1 = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, common_1.Inject)('MESSAGING_OPTIONS')),
__metadata("design:paramtypes", [Object, rabbitmq_service_1.RabbitMQService,
event_bus_service_1.EventBusService])
], MessagingService);
//# sourceMappingURL=messaging.service.js.map