@nestjstools/messaging
Version:
Simplifies asynchronous and synchronous message handling with support for buses, handlers, channels, and consumers. Build scalable, decoupled applications with ease and reliability.
99 lines • 4.85 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); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HandlerMiddleware = void 0;
const message_handler_registry_1 = require("../handler/message-handler.registry");
const common_1 = require("@nestjs/common");
const service_1 = require("../dependency-injection/service");
const decorator_1 = require("../dependency-injection/decorator");
const log_1 = require("../logger/log");
const handlers_exception_1 = require("../exception/handlers.exception");
const class_transformer_1 = require("class-transformer");
let HandlerMiddleware = class HandlerMiddleware {
constructor(handlerRegistry, logger) {
this.handlerRegistry = handlerRegistry;
this.logger = logger;
}
async process(message, context) {
const handlers = this.handlerRegistry.getByRoutingKey(message.messageRoutingKey);
return this.handleParallel(message, handlers);
}
async handleParallel(message, handlers) {
const errors = [];
if (1 === handlers.length) {
const handler = handlers[0];
this.logHandlerMessage(handler.constructor.name, message.messageRoutingKey);
try {
const result = await handler.handle(this.convertToInstance(handler, message.message));
return Promise.resolve(result);
}
catch (error) {
const exception = new handlers_exception_1.HandlersException([
new handlers_exception_1.HandlerError(handler.constructor.name, error),
]);
this.logHandlerErrorMessage(handler.constructor.name, message, exception);
return Promise.reject(exception);
}
}
const results = await Promise.allSettled(handlers.map((handler) => {
try {
this.logHandlerMessage(handler.constructor.name, message.messageRoutingKey);
return handler.handle(this.convertToInstance(handler, message.message));
}
catch (err) {
return Promise.reject({
handler: handler.constructor.name,
error: err,
});
}
}));
for (const result of results) {
if (result.status === 'rejected') {
const exception = result.reason.error;
this.logHandlerErrorMessage(result.reason.handler, message, exception);
errors.push(new handlers_exception_1.HandlerError(result.reason.handler, exception));
}
}
if (errors.length > 0) {
throw new handlers_exception_1.HandlersException(errors);
}
return Promise.resolve(null);
}
convertToInstance(handler, message) {
const instance = Reflect.getMetadata('design:paramtypes', handler, 'handle');
if (!instance) {
return message;
}
return (0, class_transformer_1.plainToInstance)(instance[0], message);
}
logHandlerMessage(handler, messageRoutingKey) {
this.logger.debug(log_1.Log.create(`Found a handler [${handler}] for message [${messageRoutingKey}]`));
}
logHandlerErrorMessage(handler, message, exception) {
this.logger.error(log_1.Log.create(`Some error occurred in Handler [${handler}]`, {
error: exception.message,
exception,
message: JSON.stringify(message.message),
}));
}
};
exports.HandlerMiddleware = HandlerMiddleware;
exports.HandlerMiddleware = HandlerMiddleware = __decorate([
(0, common_1.Injectable)(),
(0, decorator_1.MessagingMiddleware)(),
__param(0, (0, common_1.Inject)(service_1.Service.MESSAGE_HANDLERS_REGISTRY)),
__param(1, (0, common_1.Inject)(service_1.Service.LOGGER)),
__metadata("design:paramtypes", [message_handler_registry_1.MessageHandlerRegistry, Object])
], HandlerMiddleware);
//# sourceMappingURL=handler-middleware.js.map