forked from nestjs/nest
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmicroservices-module.ts
More file actions
105 lines (97 loc) · 3.67 KB
/
Copy pathmicroservices-module.ts
File metadata and controls
105 lines (97 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface';
import { ApplicationConfig } from '@nestjs/core/application-config';
import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception';
import { GuardsConsumer } from '@nestjs/core/guards/guards-consumer';
import { GuardsContextCreator } from '@nestjs/core/guards/guards-context-creator';
import { NestContainer } from '@nestjs/core/injector/container';
import { Injector } from '@nestjs/core/injector/injector';
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
import { InterceptorsConsumer } from '@nestjs/core/interceptors/interceptors-consumer';
import { InterceptorsContextCreator } from '@nestjs/core/interceptors/interceptors-context-creator';
import { PipesConsumer } from '@nestjs/core/pipes/pipes-consumer';
import { PipesContextCreator } from '@nestjs/core/pipes/pipes-context-creator';
import { ClientProxyFactory } from './client';
import { ClientsContainer } from './container';
import { ExceptionFiltersContext } from './context/exception-filters-context';
import { RpcContextCreator } from './context/rpc-context-creator';
import { RpcProxy } from './context/rpc-proxy';
import { CustomTransportStrategy } from './interfaces';
import { ListenersController } from './listeners-controller';
import { Server } from './server/server';
export class MicroservicesModule {
private readonly clientsContainer = new ClientsContainer();
private listenersController: ListenersController;
public register(container: NestContainer, config: ApplicationConfig) {
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(),
);
const injector = new Injector();
this.listenersController = new ListenersController(
this.clientsContainer,
contextCreator,
container,
injector,
ClientProxyFactory,
exceptionFiltersContext,
);
}
public setupListeners(
container: NestContainer,
server: Server & CustomTransportStrategy,
) {
if (!this.listenersController) {
throw new RuntimeException();
}
const modules = container.getModules();
modules.forEach(({ controllers }, moduleRef) =>
this.bindListeners(controllers, server, moduleRef),
);
}
public setupClients(container: NestContainer) {
if (!this.listenersController) {
throw new RuntimeException();
}
const modules = container.getModules();
modules.forEach(({ controllers, providers }) => {
this.bindClients(controllers);
this.bindClients(providers);
});
}
public bindListeners(
controllers: Map<string | symbol | Function, InstanceWrapper<Controller>>,
server: Server & CustomTransportStrategy,
moduleName: string,
) {
controllers.forEach(wrapper =>
this.listenersController.registerPatternHandlers(
wrapper,
server,
moduleName,
),
);
}
public bindClients(
items: Map<string | symbol | Function, InstanceWrapper<unknown>>,
) {
items.forEach(({ instance, isNotMetatype }) => {
!isNotMetatype &&
this.listenersController.assignClientsToProperties(instance);
});
}
public async close() {
const clients = this.clientsContainer.getAllClients();
await Promise.all(clients.map(client => client.close()));
this.clientsContainer.clear();
}
}