@@ -7,7 +7,7 @@ import { Server } from '@nestjs/microservices/server/server';
77import { MicroserviceConfiguration } from '@nestjs/microservices/interfaces/microservice-configuration.interface' ;
88import { ServerFactory } from '@nestjs/microservices/server/server-factory' ;
99import { Transport } from '@nestjs/microservices/enums/transport.enum' ;
10- import { INestMicroservice , WebSocketAdapter , CanActivate , PipeTransform , NestInterceptor , ExceptionFilter } from '@nestjs/common' ;
10+ import { INestMicroservice , WebSocketAdapter , CanActivate , PipeTransform , NestInterceptor , ExceptionFilter , OnModuleInit } from '@nestjs/common' ;
1111import { ApplicationConfig } from './application-config' ;
1212import { SocketModule } from '@nestjs/websockets/socket-module' ;
1313import { CustomTransportStrategy } from '@nestjs/microservices' ;
@@ -22,6 +22,7 @@ export class NestMicroservice implements INestMicroservice {
2222 private readonly server : Server & CustomTransportStrategy ;
2323 private isTerminated = false ;
2424 private isInitialized = false ;
25+ private isInitHookCalled = false ;
2526
2627 constructor (
2728 private container : NestContainer ,
@@ -39,9 +40,11 @@ export class NestMicroservice implements INestMicroservice {
3940 public setupModules ( ) {
4041 SocketModule . setup ( this . container , this . config ) ;
4142 MicroservicesModule . setupClients ( this . container ) ;
43+
4244 this . setupListeners ( ) ;
45+ this . setIsInitialized ( true ) ;
4346
44- this . isInitialized = true ;
47+ ! this . isInitHookCalled && this . callInitHook ( ) ;
4548 }
4649
4750 public setupListeners ( ) {
@@ -88,12 +91,37 @@ export class NestMicroservice implements INestMicroservice {
8891 this . isTerminated = isTerminaed ;
8992 }
9093
94+ public setIsInitHookCalled ( isInitHookCalled : boolean ) {
95+ this . isInitHookCalled = isInitHookCalled ;
96+ }
97+
9198 private closeApplication ( ) {
9299 SocketModule . close ( ) ;
100+
93101 this . callDestroyHook ( ) ;
94102 this . setIsTerminated ( true ) ;
95103 }
96104
105+ private callInitHook ( ) {
106+ const modules = this . container . getModules ( ) ;
107+ modules . forEach ( ( module ) => {
108+ this . callModuleInitHook ( module ) ;
109+ } ) ;
110+ this . setIsInitHookCalled ( true ) ;
111+ }
112+
113+ private callModuleInitHook ( module : Module ) {
114+ const components = [ ...module . routes , ...module . components ] ;
115+ iterate ( components ) . map ( ( [ key , { instance} ] ) => instance )
116+ . filter ( ( instance ) => ! isNil ( instance ) )
117+ . filter ( this . hasOnModuleInitHook )
118+ . forEach ( ( instance ) => ( instance as OnModuleInit ) . onModuleInit ( ) ) ;
119+ }
120+
121+ private hasOnModuleInitHook ( instance ) : instance is OnModuleInit {
122+ return ! isUndefined ( ( instance as OnModuleInit ) . onModuleInit ) ;
123+ }
124+
97125 private callDestroyHook ( ) {
98126 const modules = this . container . getModules ( ) ;
99127 modules . forEach ( ( module ) => {
0 commit comments