@nestjs/microservices
Version:
Nest - modern, fast, powerful node.js web framework (@microservices)
57 lines (56 loc) • 2.89 kB
JavaScript
import { ClientProxyFactory } from './client/index.js';
import { ClientsContainer } from './container.js';
import { ExceptionFiltersContext } from './context/exception-filters-context.js';
import { RpcContextCreator } from './context/rpc-context-creator.js';
import { RpcProxy } from './context/rpc-proxy.js';
import { ListenersController } from './listeners-controller.js';
import { RuntimeException, GuardsConsumer, GuardsContextCreator, Injector, InterceptorsConsumer, InterceptorsContextCreator, PipesConsumer, PipesContextCreator, } from '@nestjs/core/internal';
export class MicroservicesModule {
clientsContainer = new ClientsContainer();
listenersController;
appOptions;
register(container, graphInspector, config, options) {
this.appOptions = options;
const exceptionFiltersContext = new ExceptionFiltersContext(container, config);
const contextCreator = new RpcContextCreator(new RpcProxy(), exceptionFiltersContext, new PipesContextCreator(container, config), new PipesConsumer(), new GuardsContextCreator(container, config), new GuardsConsumer(), new InterceptorsContextCreator(container, config), new InterceptorsConsumer(), config);
const injector = new Injector({
preview: container.contextOptions?.preview ?? false,
instanceDecorator: container.contextOptions?.instrument?.instanceDecorator,
});
this.listenersController = new ListenersController(this.clientsContainer, contextCreator, container, injector, ClientProxyFactory, exceptionFiltersContext, graphInspector);
}
setupListeners(container, serverInstance) {
if (!this.listenersController) {
throw new RuntimeException();
}
const modules = container.getModules();
modules.forEach(({ controllers }, moduleRef) => this.bindListeners(controllers, serverInstance, moduleRef));
}
setupClients(container) {
if (!this.listenersController) {
throw new RuntimeException();
}
if (this.appOptions?.preview) {
return;
}
const modules = container.getModules();
modules.forEach(({ controllers, providers }) => {
this.bindClients(controllers);
this.bindClients(providers);
});
}
bindListeners(controllers, serverInstance, moduleName) {
controllers.forEach(wrapper => this.listenersController.registerPatternHandlers(wrapper, serverInstance, moduleName));
}
bindClients(items) {
items.forEach(({ instance, isNotMetatype }) => {
!isNotMetatype &&
this.listenersController.assignClientsToProperties(instance);
});
}
async close() {
const clients = this.clientsContainer.getAllClients();
await Promise.all(clients.map(client => client.close()));
this.clientsContainer.clear();
}
}