@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.
190 lines • 10.1 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 MessagingModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessagingModule = void 0;
const common_1 = require("@nestjs/common");
const config_1 = require("./config");
const service_1 = require("./dependency-injection/service");
const composite_channel_factory_1 = require("./channel/factory/composite-channel.factory");
const channel_registry_1 = require("./channel/channel.registry");
const composite_message_bus_factory_1 = require("./bus/composite-message-bus.factory");
const distributed_message_bus_1 = require("./bus/distributed-message.bus");
const core_1 = require("@nestjs/core");
const in_memory_message_bus_1 = require("./bus/in-memory-message.bus");
const message_handler_registry_1 = require("./handler/message-handler.registry");
const nest_logger_1 = require("./logger/nest-logger");
const in_memory_channel_factory_1 = require("./channel/factory/in-memory-channel.factory");
const distributed_consumer_1 = require("./consumer/distributed.consumer");
const register_1 = require("./dependency-injection/register");
const middleware_registry_1 = require("./middleware/middleware.registry");
const in_memory_message_bus_factory_1 = require("./bus/in-memory-message-bus.factory");
const in_memory_channel_1 = require("./channel/in-memory.channel");
const handler_middleware_1 = require("./middleware/handler-middleware");
const message_bus_collection_1 = require("./bus/message-bus.collection");
const normalizer_registry_1 = require("./normalizer/normalizer.registry");
const object_forward_message_normalizer_1 = require("./normalizer/object-forward-message.normalizer");
const exception_listener_registry_1 = require("./exception-listener/exception-listener.registry");
const exception_listener_handler_1 = require("./exception-listener/exception-listener-handler");
let MessagingModule = MessagingModule_1 = class MessagingModule {
static forRoot(options) {
const channels = options.channels ?? [];
const registerChannels = {
provide: service_1.Service.CHANNELS,
useFactory: (compositeChannelFactory) => {
return channels.map((channelConfig) => compositeChannelFactory.create(channelConfig));
},
inject: [composite_channel_factory_1.CompositeChannelFactory],
};
return MessagingModule_1.createDynamicModule(options, [registerChannels]);
}
static forRootAsync(options) {
const registerAsyncConfig = {
provide: service_1.Service.MESSAGING_MODULE_ASYNC_CHANNEL_OPTIONS,
useFactory: options.useChannelFactory,
inject: options.inject ?? [],
};
const registerChannels = {
provide: service_1.Service.CHANNELS,
useFactory: (compositeChannelFactory, channels) => {
return (channels ?? []).map((channelConfig) => compositeChannelFactory.create(channelConfig));
},
inject: [
composite_channel_factory_1.CompositeChannelFactory,
service_1.Service.MESSAGING_MODULE_ASYNC_CHANNEL_OPTIONS,
],
};
return MessagingModule_1.createDynamicModule(options, [registerAsyncConfig, registerChannels], options.imports ?? []);
}
static createDynamicModule(options, providers = [], imports = []) {
const buses = options.buses ?? [];
const registerBuses = () => {
return buses.map((bus) => ({
provide: `${bus.name}`,
useFactory: (channelRegistry, busFactory, logger, normalizerRegistry) => {
const messageBusCollection = new message_bus_collection_1.MessageBusCollection();
for (const channelName of bus.channels) {
const channel = channelRegistry.getByName(channelName);
messageBusCollection.add({
messageBus: busFactory.create(channel),
channel: channel,
});
}
const messageBus = new distributed_message_bus_1.DistributedMessageBus(messageBusCollection, normalizerRegistry);
logger.log(`MessageBus [${bus.name}] was created successfully`);
return messageBus;
},
inject: [
service_1.Service.CHANNEL_REGISTRY,
composite_message_bus_factory_1.CompositeMessageBusFactory,
service_1.Service.LOGGER,
service_1.Service.MESSAGE_NORMALIZERS_REGISTRY,
],
}));
};
const defaultMessageBus = () => {
return {
provide: service_1.Service.DEFAULT_MESSAGE_BUS,
useFactory: (messageHandlerRegistry, middlewareRegistry, normalizerRegistry) => {
return new in_memory_message_bus_1.InMemoryMessageBus(messageHandlerRegistry, middlewareRegistry, new in_memory_channel_1.InMemoryChannel(new config_1.InMemoryChannelConfig({
name: 'default.bus',
middlewares: [],
avoidErrorsForNotExistedHandlers: true,
})), normalizerRegistry);
},
inject: [
service_1.Service.MESSAGE_HANDLERS_REGISTRY,
service_1.Service.MIDDLEWARE_REGISTRY,
service_1.Service.MESSAGE_NORMALIZERS_REGISTRY,
],
};
};
return {
global: options.global ?? true,
module: MessagingModule_1,
imports: [core_1.DiscoveryModule, ...imports],
providers: [
...providers,
defaultMessageBus(),
...registerBuses(),
{
provide: service_1.Service.MESSAGE_HANDLERS_REGISTRY,
useClass: message_handler_registry_1.MessageHandlerRegistry,
},
{
provide: service_1.Service.EXCEPTION_LISTENER_REGISTRY,
useClass: exception_listener_registry_1.ExceptionListenerRegistry,
},
{
provide: service_1.Service.MESSAGE_NORMALIZERS_REGISTRY,
useClass: normalizer_registry_1.NormalizerRegistry,
},
{
provide: service_1.Service.MIDDLEWARE_REGISTRY,
useClass: middleware_registry_1.MiddlewareRegistry,
},
{
provide: service_1.Service.EXCEPTION_LISTENER_HANDLER,
useClass: exception_listener_handler_1.ExceptionListenerHandler,
},
{
provide: service_1.Service.CHANNEL_REGISTRY,
useFactory: (channels, logger) => {
return new channel_registry_1.ChannelRegistry(channels, logger);
},
inject: [service_1.Service.CHANNELS, service_1.Service.LOGGER],
},
{
provide: service_1.Service.LOGGER,
useValue: new nest_logger_1.NestLogger(new common_1.Logger(), options.debug ?? false, options.logging ?? true),
},
handler_middleware_1.HandlerMiddleware,
composite_channel_factory_1.CompositeChannelFactory,
composite_message_bus_factory_1.CompositeMessageBusFactory,
in_memory_message_bus_factory_1.InMemoryMessageBusFactory,
in_memory_channel_factory_1.InMemoryChannelFactory,
distributed_consumer_1.DistributedConsumer,
object_forward_message_normalizer_1.ObjectForwardMessageNormalizer,
],
exports: [
service_1.Service.DEFAULT_MESSAGE_BUS,
...registerBuses().map((bus) => bus.provide),
distributed_consumer_1.DistributedConsumer,
object_forward_message_normalizer_1.ObjectForwardMessageNormalizer,
],
};
}
constructor(moduleRef, discoveryService) {
this.moduleRef = moduleRef;
this.discoveryService = discoveryService;
}
onApplicationBootstrap() {
(0, register_1.registerHandlers)(this.moduleRef, this.discoveryService);
(0, register_1.registerMiddlewares)(this.moduleRef, this.discoveryService);
(0, register_1.registerMessageNormalizers)(this.moduleRef, this.discoveryService);
(0, register_1.registerExceptionListener)(this.moduleRef, this.discoveryService);
const consumer = this.moduleRef.get(distributed_consumer_1.DistributedConsumer);
consumer.run();
}
async onModuleDestroy() {
const channels = this.moduleRef.get(service_1.Service.CHANNELS);
for (const channel of channels) {
await channel.onChannelDestroy();
}
}
};
exports.MessagingModule = MessagingModule;
exports.MessagingModule = MessagingModule = MessagingModule_1 = __decorate([
(0, common_1.Module)({}),
__metadata("design:paramtypes", [core_1.ModuleRef,
core_1.DiscoveryService])
], MessagingModule);
//# sourceMappingURL=messaging.module.js.map