From 899d17592ccfb79875fd32d84435b4b47b8a2688 Mon Sep 17 00:00:00 2001 From: GuticaStefan Date: Fri, 29 May 2026 17:04:36 +0300 Subject: [PATCH 1/3] add scheduleModule in public app --- src/public.app.module.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/public.app.module.ts b/src/public.app.module.ts index 524185e66..eb70311e7 100644 --- a/src/public.app.module.ts +++ b/src/public.app.module.ts @@ -11,9 +11,11 @@ import { DynamicModuleUtils } from './utils/dynamic.module.utils'; import { LocalCacheController } from './endpoints/caching/local.cache.controller'; import { RestrictedRoutesMiddleware } from './utils/restricted.routes.middleware'; import { ApiMetricsModule } from './common/metrics/api.metrics.module'; +import { ScheduleModule } from '@nestjs/schedule'; @Module({ imports: [ + ScheduleModule.forRoot(), // for plugins, best practice not to have crons in public API LoggingModule, EndpointsServicesModule, EndpointsControllersModule.forRoot(), From 751139e26105abd483c6e1cf994260e77eb25381 Mon Sep 17 00:00:00 2001 From: GuticaStefan Date: Fri, 29 May 2026 17:23:48 +0300 Subject: [PATCH 2/3] import event emitter at each app root level module --- src/common/metrics/api.metrics.module.ts | 2 -- src/common/pubsub/pub.sub.listener.module.ts | 2 ++ src/common/websockets/web-socket-publisher-module.ts | 2 ++ src/crons/cache.warmer/cache.warmer.module.ts | 2 ++ src/crons/elastic.updater/elastic.updater.module.ts | 2 ++ src/crons/status.checker/status.checker.module.ts | 2 ++ .../transaction.processor/batch.transaction.processor.module.ts | 2 ++ src/crons/transaction.processor/transaction.completed.module.ts | 2 ++ src/crons/transaction.processor/transaction.processor.module.ts | 2 ++ src/crons/websocket/websocket.subscription.module.ts | 2 ++ src/endpoints/vm.query/vm.query.module.ts | 2 ++ src/private.app.module.ts | 2 ++ src/public.app.module.ts | 2 ++ src/queue.worker/nft.worker/queue/nft.queue.module.ts | 2 ++ 14 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/common/metrics/api.metrics.module.ts b/src/common/metrics/api.metrics.module.ts index 452f287cc..69b99cb3c 100644 --- a/src/common/metrics/api.metrics.module.ts +++ b/src/common/metrics/api.metrics.module.ts @@ -1,6 +1,5 @@ import { MetricsModule } from "@multiversx/sdk-nestjs-monitoring"; import { Global, Module } from "@nestjs/common"; -import { EventEmitterModule } from "@nestjs/event-emitter"; import { ApiMetricsService } from "./api.metrics.service"; import { ApiConfigModule } from "src/common/api-config/api.config.module"; import { GatewayModule } from "src/common/gateway/gateway.module"; @@ -10,7 +9,6 @@ import { ProtocolModule } from "src/common/protocol/protocol.module"; @Module({ imports: [ MetricsModule, - EventEmitterModule.forRoot({ maxListeners: 1 }), ApiConfigModule, GatewayModule, ProtocolModule, diff --git a/src/common/pubsub/pub.sub.listener.module.ts b/src/common/pubsub/pub.sub.listener.module.ts index 7ca1a80c0..5f1dc224f 100644 --- a/src/common/pubsub/pub.sub.listener.module.ts +++ b/src/common/pubsub/pub.sub.listener.module.ts @@ -3,11 +3,13 @@ import { DynamicModuleUtils } from 'src/utils/dynamic.module.utils'; import { PubSubListenerController } from './pub.sub.listener.controller'; import { LoggingModule } from '@multiversx/sdk-nestjs-common'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ DynamicModuleUtils.getCacheModule(), LoggingModule, + EventEmitterModule.forRoot({ maxListeners: 1 }), ApiMetricsModule, ], controllers: [ diff --git a/src/common/websockets/web-socket-publisher-module.ts b/src/common/websockets/web-socket-publisher-module.ts index 3a7971915..cc0266249 100644 --- a/src/common/websockets/web-socket-publisher-module.ts +++ b/src/common/websockets/web-socket-publisher-module.ts @@ -4,10 +4,12 @@ import { WebSocketPublisherService } from "./web-socket-publisher-service"; import { WebSocketPublisherController } from "./web-socket-publisher-controller"; import { DynamicModuleUtils } from "src/utils/dynamic.module.utils"; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from "@nestjs/event-emitter"; @Module({ imports: [ TransactionActionModule, + EventEmitterModule.forRoot({ maxListeners: 1 }), ApiMetricsModule, ], controllers: [ diff --git a/src/crons/cache.warmer/cache.warmer.module.ts b/src/crons/cache.warmer/cache.warmer.module.ts index 1561d888b..005c887fb 100644 --- a/src/crons/cache.warmer/cache.warmer.module.ts +++ b/src/crons/cache.warmer/cache.warmer.module.ts @@ -12,10 +12,12 @@ import { PluginModule } from 'src/plugins/plugin.module'; import { TpsWarmerService } from '../tps/tps-warmer.service'; import { TpsModule } from 'src/endpoints/tps/tps.module'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), EndpointsServicesModule, KeybaseModule, MexModule.forRoot(), diff --git a/src/crons/elastic.updater/elastic.updater.module.ts b/src/crons/elastic.updater/elastic.updater.module.ts index 3558388d6..787a305de 100644 --- a/src/crons/elastic.updater/elastic.updater.module.ts +++ b/src/crons/elastic.updater/elastic.updater.module.ts @@ -5,10 +5,12 @@ import { PersistenceModule } from 'src/common/persistence/persistence.module'; import { EndpointsServicesModule } from 'src/endpoints/endpoints.services.module'; import { ElasticUpdaterService } from './elastic.updater.service'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), EndpointsServicesModule, AssetsModule, forwardRef(() => PersistenceModule), diff --git a/src/crons/status.checker/status.checker.module.ts b/src/crons/status.checker/status.checker.module.ts index 0586952ba..d9bd48cff 100644 --- a/src/crons/status.checker/status.checker.module.ts +++ b/src/crons/status.checker/status.checker.module.ts @@ -5,10 +5,12 @@ import { EndpointsServicesModule } from "src/endpoints/endpoints.services.module import { DynamicModuleUtils } from "src/utils/dynamic.module.utils"; import { StatusCheckerService } from "./status.checker.service"; import { ApiMetricsModule } from "src/common/metrics/api.metrics.module"; +import { EventEmitterModule } from "@nestjs/event-emitter"; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), EndpointsServicesModule, ApiMetricsModule, ], diff --git a/src/crons/transaction.processor/batch.transaction.processor.module.ts b/src/crons/transaction.processor/batch.transaction.processor.module.ts index 10dfece28..9811c9d33 100644 --- a/src/crons/transaction.processor/batch.transaction.processor.module.ts +++ b/src/crons/transaction.processor/batch.transaction.processor.module.ts @@ -6,10 +6,12 @@ import { TransactionModule } from "src/endpoints/transactions/transaction.module import { DynamicModuleUtils } from "src/utils/dynamic.module.utils"; import { BatchTransactionProcessorService } from "./batch.transaction.processor.service"; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from "@nestjs/event-emitter"; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), ApiConfigModule, DynamicModuleUtils.getCacheModule(), TransactionsBatchModule, diff --git a/src/crons/transaction.processor/transaction.completed.module.ts b/src/crons/transaction.processor/transaction.completed.module.ts index 4bf021c84..fef98b90c 100644 --- a/src/crons/transaction.processor/transaction.completed.module.ts +++ b/src/crons/transaction.processor/transaction.completed.module.ts @@ -6,10 +6,12 @@ import { TransactionCompletedService } from './transaction.completed.service'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; import { GatewayModule } from 'src/common/gateway/gateway.module'; import { ProtocolModule } from 'src/common/protocol/protocol.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), ApiConfigModule, ApiMetricsModule, GatewayModule, diff --git a/src/crons/transaction.processor/transaction.processor.module.ts b/src/crons/transaction.processor/transaction.processor.module.ts index ef3df67c6..add0f1be2 100644 --- a/src/crons/transaction.processor/transaction.processor.module.ts +++ b/src/crons/transaction.processor/transaction.processor.module.ts @@ -8,10 +8,12 @@ import { NftWorkerModule } from 'src/queue.worker/nft.worker/nft.worker.module'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; import { DynamicModuleUtils } from 'src/utils/dynamic.module.utils'; import { TransactionProcessorService } from './transaction.processor.service'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), TransactionModule, ShardModule, NodeModule, diff --git a/src/crons/websocket/websocket.subscription.module.ts b/src/crons/websocket/websocket.subscription.module.ts index 8146dc3a6..d6cbd505d 100644 --- a/src/crons/websocket/websocket.subscription.module.ts +++ b/src/crons/websocket/websocket.subscription.module.ts @@ -19,10 +19,12 @@ import { ApiConfigModule } from 'src/common/api-config/api.config.module'; import { TransfersCustomGateway } from './transfers.custom.gateway'; import { TransferModule } from 'src/endpoints/transfers/transfer.module'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), TransactionModule, BlockModule, NetworkModule, diff --git a/src/endpoints/vm.query/vm.query.module.ts b/src/endpoints/vm.query/vm.query.module.ts index 01937df2e..f88cb45d4 100644 --- a/src/endpoints/vm.query/vm.query.module.ts +++ b/src/endpoints/vm.query/vm.query.module.ts @@ -5,6 +5,7 @@ import { ProtocolModule } from "src/common/protocol/protocol.module"; import { SettingsModule } from "src/common/settings/settings.module"; import { DynamicModuleUtils } from "src/utils/dynamic.module.utils"; import { VmQueryService } from "./vm.query.service"; +import { EventEmitterModule } from "@nestjs/event-emitter"; @Module({ imports: [ @@ -13,6 +14,7 @@ import { VmQueryService } from "./vm.query.service"; ProtocolModule, ApiConfigModule, SettingsModule, + EventEmitterModule.forRoot(), ], providers: [ VmQueryService, diff --git a/src/private.app.module.ts b/src/private.app.module.ts index 92428731e..f79db59b1 100644 --- a/src/private.app.module.ts +++ b/src/private.app.module.ts @@ -7,10 +7,12 @@ import { ProcessNftsModule } from './endpoints/process-nfts/process.nfts.module' import { LoggingModule } from '@multiversx/sdk-nestjs-common'; import { DynamicModuleUtils } from './utils/dynamic.module.utils'; import { ApiMetricsModule } from './common/metrics/api.metrics.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ LoggingModule, + EventEmitterModule.forRoot({ maxListeners: 1 }), ProcessNftsModule, ApiMetricsModule, ], diff --git a/src/public.app.module.ts b/src/public.app.module.ts index eb70311e7..7c083f1ba 100644 --- a/src/public.app.module.ts +++ b/src/public.app.module.ts @@ -12,10 +12,12 @@ import { LocalCacheController } from './endpoints/caching/local.cache.controller import { RestrictedRoutesMiddleware } from './utils/restricted.routes.middleware'; import { ApiMetricsModule } from './common/metrics/api.metrics.module'; import { ScheduleModule } from '@nestjs/schedule'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ ScheduleModule.forRoot(), // for plugins, best practice not to have crons in public API + EventEmitterModule.forRoot({ maxListeners: 1 }), LoggingModule, EndpointsServicesModule, EndpointsControllersModule.forRoot(), diff --git a/src/queue.worker/nft.worker/queue/nft.queue.module.ts b/src/queue.worker/nft.worker/queue/nft.queue.module.ts index e2e42c4da..3f3b13de3 100644 --- a/src/queue.worker/nft.worker/queue/nft.queue.module.ts +++ b/src/queue.worker/nft.worker/queue/nft.queue.module.ts @@ -4,11 +4,13 @@ import { NftJobProcessorModule } from './job-services/nft.job.processor.module'; import { NftModule } from 'src/endpoints/nfts/nft.module'; import { DynamicModuleUtils } from 'src/utils/dynamic.module.utils'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; +import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ NftJobProcessorModule, NftModule, + EventEmitterModule.forRoot({ maxListeners: 1 }), ApiMetricsModule, ], providers: [ From 47b279f7ceb205f89fba7af649f039333f6c5c89 Mon Sep 17 00:00:00 2001 From: GuticaStefan Date: Fri, 29 May 2026 17:44:02 +0300 Subject: [PATCH 3/3] refactor modules --- src/common/pubsub/pub.sub.listener.module.ts | 4 +++- src/common/rabbitmq/rabbitmq.module.ts | 4 ++++ src/common/websockets/web-socket-publisher-module.ts | 4 +++- src/endpoints/vm.query/vm.query.module.ts | 2 -- src/private.app.module.ts | 4 +++- src/queue.worker/nft.worker/queue/nft.queue.module.ts | 4 +++- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/common/pubsub/pub.sub.listener.module.ts b/src/common/pubsub/pub.sub.listener.module.ts index 5f1dc224f..7c72bedb2 100644 --- a/src/common/pubsub/pub.sub.listener.module.ts +++ b/src/common/pubsub/pub.sub.listener.module.ts @@ -4,12 +4,14 @@ import { PubSubListenerController } from './pub.sub.listener.controller'; import { LoggingModule } from '@multiversx/sdk-nestjs-common'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ScheduleModule } from '@nestjs/schedule'; @Module({ imports: [ + ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), DynamicModuleUtils.getCacheModule(), LoggingModule, - EventEmitterModule.forRoot({ maxListeners: 1 }), ApiMetricsModule, ], controllers: [ diff --git a/src/common/rabbitmq/rabbitmq.module.ts b/src/common/rabbitmq/rabbitmq.module.ts index 11eea01dd..ec5e445ac 100644 --- a/src/common/rabbitmq/rabbitmq.module.ts +++ b/src/common/rabbitmq/rabbitmq.module.ts @@ -9,9 +9,13 @@ import { ApiConfigService } from '../api-config/api.config.service'; import { RabbitMqConsumer } from './rabbitmq.consumer'; import { RabbitMqNftHandlerService } from './rabbitmq.nft.handler.service'; import { RabbitMqTokenHandlerService } from './rabbitmq.token.handler.service'; +import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ScheduleModule } from '@nestjs/schedule'; @Module({ imports: [ + ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), ApiConfigModule, NftModule, NftWorkerModule, diff --git a/src/common/websockets/web-socket-publisher-module.ts b/src/common/websockets/web-socket-publisher-module.ts index cc0266249..a5b9c66df 100644 --- a/src/common/websockets/web-socket-publisher-module.ts +++ b/src/common/websockets/web-socket-publisher-module.ts @@ -5,11 +5,13 @@ import { WebSocketPublisherController } from "./web-socket-publisher-controller" import { DynamicModuleUtils } from "src/utils/dynamic.module.utils"; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; import { EventEmitterModule } from "@nestjs/event-emitter"; +import { ScheduleModule } from "@nestjs/schedule"; @Module({ imports: [ - TransactionActionModule, + ScheduleModule.forRoot(), EventEmitterModule.forRoot({ maxListeners: 1 }), + TransactionActionModule, ApiMetricsModule, ], controllers: [ diff --git a/src/endpoints/vm.query/vm.query.module.ts b/src/endpoints/vm.query/vm.query.module.ts index f88cb45d4..01937df2e 100644 --- a/src/endpoints/vm.query/vm.query.module.ts +++ b/src/endpoints/vm.query/vm.query.module.ts @@ -5,7 +5,6 @@ import { ProtocolModule } from "src/common/protocol/protocol.module"; import { SettingsModule } from "src/common/settings/settings.module"; import { DynamicModuleUtils } from "src/utils/dynamic.module.utils"; import { VmQueryService } from "./vm.query.service"; -import { EventEmitterModule } from "@nestjs/event-emitter"; @Module({ imports: [ @@ -14,7 +13,6 @@ import { EventEmitterModule } from "@nestjs/event-emitter"; ProtocolModule, ApiConfigModule, SettingsModule, - EventEmitterModule.forRoot(), ], providers: [ VmQueryService, diff --git a/src/private.app.module.ts b/src/private.app.module.ts index f79db59b1..1ea44382f 100644 --- a/src/private.app.module.ts +++ b/src/private.app.module.ts @@ -8,11 +8,13 @@ import { LoggingModule } from '@multiversx/sdk-nestjs-common'; import { DynamicModuleUtils } from './utils/dynamic.module.utils'; import { ApiMetricsModule } from './common/metrics/api.metrics.module'; import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ScheduleModule } from '@nestjs/schedule'; @Module({ imports: [ - LoggingModule, + ScheduleModule.forRoot(), EventEmitterModule.forRoot({ maxListeners: 1 }), + LoggingModule, ProcessNftsModule, ApiMetricsModule, ], diff --git a/src/queue.worker/nft.worker/queue/nft.queue.module.ts b/src/queue.worker/nft.worker/queue/nft.queue.module.ts index 3f3b13de3..277d2e8ac 100644 --- a/src/queue.worker/nft.worker/queue/nft.queue.module.ts +++ b/src/queue.worker/nft.worker/queue/nft.queue.module.ts @@ -5,12 +5,14 @@ import { NftModule } from 'src/endpoints/nfts/nft.module'; import { DynamicModuleUtils } from 'src/utils/dynamic.module.utils'; import { ApiMetricsModule } from 'src/common/metrics/api.metrics.module'; import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ScheduleModule } from '@nestjs/schedule'; @Module({ imports: [ + ScheduleModule.forRoot(), + EventEmitterModule.forRoot({ maxListeners: 1 }), NftJobProcessorModule, NftModule, - EventEmitterModule.forRoot({ maxListeners: 1 }), ApiMetricsModule, ], providers: [