@tramvai/module-server 1.95.1 → 1.97.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -183,6 +183,31 @@ By default server starts at `3000` port. You have next options to override this
183
183
  - **in dev environment** port in fully controlled by `@tramvai/cli` and should be specified by [`-p` option](references/cli/start.md#-p---port)
184
184
  - **in prod environment** it can be specified explicitly as an environment variable `PORT` e.g. `PORT=8080`
185
185
 
186
+ ### Specify port for utility paths
187
+
188
+ It includes: health checks, liveness checks, metrics.
189
+
190
+ By default port for utility paths equals [base server port](#specify-server-port) and they will use the same http server.
191
+
192
+ If you want to change this and run utility routes on different server with different port, use token `UTILITY_SERVER_PORT_TOKEN`:
193
+
194
+ ```ts
195
+ import { UTILITY_SERVER_PORT_TOKEN } from '@tramvai/tokens-server';
196
+
197
+ const providers = [
198
+ {
199
+ provide: UTILITY_SERVER_PORT_TOKEN,
200
+ useValue: 6532,
201
+ },
202
+ ];
203
+ ```
204
+
205
+ Or use env variable `UTILITY_SERVER_PORT` with defined value.
206
+
207
+ ```sh
208
+ env UTILITY_SERVER_PORT=6532 tramvai start app
209
+ ```
210
+
186
211
  ## Exportable tokens
187
212
 
188
213
  [Link](references/tokens/server.md)
@@ -4,3 +4,4 @@ export * from './gracefulShutdown';
4
4
  export * from './debugRequests';
5
5
  export * from './proxy';
6
6
  export * from './dependenciesVersion';
7
+ export * from './utilityServer';
@@ -0,0 +1,2 @@
1
+ export declare class UtilityServerModule {
2
+ }
package/lib/server.es.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Scope, APP_INFO_TOKEN, Module, provide, DI_TOKEN, COMMAND_LINE_RUNNER_TOKEN, commandLineListTokens } from '@tramvai/core';
3
- import { SERVER_MODULE_PAPI_PUBLIC_ROUTE, SERVER_MODULE_PAPI_PUBLIC_URL, SERVER_MODULE_PAPI_PRIVATE_URL, WEB_APP_BEFORE_INIT_TOKEN, WEB_APP_TOKEN, SERVER_MODULE_PAPI_PRIVATE_ROUTE, SERVER_MODULE_STATICS_OPTIONS, SERVER_TOKEN, READINESS_PROBE_TOKEN, LIVENESS_PROBE_TOKEN, SPECIAL_SERVER_PATHS, PROXY_CONFIG_TOKEN, DEPENDENCIES_VERSION_FILTER_TOKEN, WEB_APP_INIT_TOKEN, WEB_APP_AFTER_INIT_TOKEN, WEB_APP_LIMITER_TOKEN } from '@tramvai/tokens-server';
2
+ import { Scope, APP_INFO_TOKEN, Module, provide, DI_TOKEN, COMMAND_LINE_RUNNER_TOKEN, commandLineListTokens, createToken } from '@tramvai/core';
3
+ import { SERVER_MODULE_PAPI_PUBLIC_ROUTE, SERVER_MODULE_PAPI_PUBLIC_URL, SERVER_MODULE_PAPI_PRIVATE_URL, WEB_APP_BEFORE_INIT_TOKEN, WEB_APP_TOKEN, SERVER_MODULE_PAPI_PRIVATE_ROUTE, SERVER_MODULE_STATICS_OPTIONS, SERVER_TOKEN, READINESS_PROBE_TOKEN, LIVENESS_PROBE_TOKEN, UTILITY_SERVER_PATHS, PROXY_CONFIG_TOKEN, DEPENDENCIES_VERSION_FILTER_TOKEN, UTILITY_SERVER_PORT_TOKEN, WEB_APP_INIT_TOKEN, WEB_APP_AFTER_INIT_TOKEN, WEB_APP_LIMITER_TOKEN } from '@tramvai/tokens-server';
4
4
  export * from '@tramvai/tokens-server';
5
- import { WEB_FASTIFY_APP_BEFORE_INIT_TOKEN, SERVER_FACTORY_TOKEN, WEB_FASTIFY_APP_FACTORY_TOKEN, WEB_FASTIFY_APP_TOKEN, WEB_FASTIFY_APP_INIT_TOKEN, WEB_FASTIFY_APP_AFTER_INIT_TOKEN, WEB_FASTIFY_APP_LIMITER_TOKEN, WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN, WEB_FASTIFY_APP_PROCESS_ERROR_TOKEN, WEB_FASTIFY_APP_AFTER_ERROR_TOKEN } from '@tramvai/tokens-server-private';
5
+ import { WEB_FASTIFY_APP_BEFORE_INIT_TOKEN, UTILITY_WEB_FASTIFY_APP_TOKEN, UTILITY_SERVER_TOKEN, SERVER_FACTORY_TOKEN, WEB_FASTIFY_APP_TOKEN, WEB_FASTIFY_APP_FACTORY_TOKEN, WEB_FASTIFY_APP_INIT_TOKEN, WEB_FASTIFY_APP_AFTER_INIT_TOKEN, WEB_FASTIFY_APP_LIMITER_TOKEN, WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN, WEB_FASTIFY_APP_PROCESS_ERROR_TOKEN, WEB_FASTIFY_APP_AFTER_ERROR_TOKEN } from '@tramvai/tokens-server-private';
6
6
  import { REQUEST, RESPONSE, FASTIFY_REQUEST, FASTIFY_RESPONSE, RESPONSE_MANAGER_TOKEN, LOGGER_TOKEN, ENV_MANAGER_TOKEN, ENV_USED_TOKEN } from '@tramvai/tokens-common';
7
7
  import { MetricsModule } from '@tramvai/module-metrics';
8
8
  import { CacheWarmupModule } from '@tramvai/module-cache-warmup';
@@ -579,13 +579,13 @@ let ServerGracefulShutdownModule = class ServerGracefulShutdownModule {
579
579
  ServerGracefulShutdownModule = __decorate([
580
580
  Module({
581
581
  providers: [
582
- {
582
+ provide({
583
583
  provide: WEB_FASTIFY_APP_BEFORE_INIT_TOKEN,
584
584
  multi: true,
585
- useFactory: ({ server, logger, commandLineRunner, livenessProbe, readinessProbe, }) => {
585
+ useFactory: ({ app, server, logger, commandLineRunner, livenessProbe, readinessProbe, }) => {
586
586
  const log = logger('server');
587
- return function serverListen(instance) {
588
- createTerminus(server, instance, {
587
+ return function serverListen() {
588
+ createTerminus(server, app, {
589
589
  signal: 'SIGTERM',
590
590
  timeout: GRACEFUL_SHUTDOWN_TIMEOUT,
591
591
  logger: (msg, error) => {
@@ -625,15 +625,16 @@ ServerGracefulShutdownModule = __decorate([
625
625
  };
626
626
  },
627
627
  deps: {
628
+ app: UTILITY_WEB_FASTIFY_APP_TOKEN,
628
629
  server: SERVER_TOKEN,
629
630
  logger: LOGGER_TOKEN,
630
631
  commandLineRunner: COMMAND_LINE_RUNNER_TOKEN,
631
632
  readinessProbe: { token: READINESS_PROBE_TOKEN, optional: true },
632
633
  livenessProbe: { token: LIVENESS_PROBE_TOKEN, optional: true },
633
634
  },
634
- },
635
+ }),
635
636
  {
636
- provide: SPECIAL_SERVER_PATHS,
637
+ provide: UTILITY_SERVER_PATHS,
637
638
  useValue: [readyzPath, healthzPath],
638
639
  multi: true,
639
640
  },
@@ -878,6 +879,96 @@ DependenciesVersionModule = __decorate([
878
879
  })
879
880
  ], DependenciesVersionModule);
880
881
 
882
+ const IS_CUSTOM_SERVER_TOKEN = createToken('server utility isCustomServer');
883
+ let UtilityServerModule = class UtilityServerModule {
884
+ };
885
+ UtilityServerModule = __decorate([
886
+ Module({
887
+ providers: [
888
+ provide({
889
+ provide: ENV_USED_TOKEN,
890
+ multi: true,
891
+ useValue: [{ key: 'UTILITY_SERVER_PORT', optional: true }],
892
+ }),
893
+ provide({
894
+ provide: UTILITY_SERVER_PORT_TOKEN,
895
+ useFactory: ({ envManager }) => {
896
+ return +(envManager.get('UTILITY_SERVER_PORT') || envManager.get('PORT'));
897
+ },
898
+ deps: {
899
+ envManager: ENV_MANAGER_TOKEN,
900
+ },
901
+ }),
902
+ provide({
903
+ provide: IS_CUSTOM_SERVER_TOKEN,
904
+ useFactory: ({ port, envManager }) => {
905
+ return +envManager.get('PORT') !== port;
906
+ },
907
+ deps: {
908
+ envManager: ENV_MANAGER_TOKEN,
909
+ port: UTILITY_SERVER_PORT_TOKEN,
910
+ },
911
+ }),
912
+ provide({
913
+ provide: UTILITY_SERVER_TOKEN,
914
+ scope: Scope.SINGLETON,
915
+ useFactory: ({ isCustomServer, serverFactory, server }) => {
916
+ return isCustomServer ? serverFactory() : server;
917
+ },
918
+ deps: {
919
+ isCustomServer: IS_CUSTOM_SERVER_TOKEN,
920
+ server: SERVER_TOKEN,
921
+ serverFactory: SERVER_FACTORY_TOKEN,
922
+ },
923
+ }),
924
+ provide({
925
+ provide: UTILITY_WEB_FASTIFY_APP_TOKEN,
926
+ scope: Scope.SINGLETON,
927
+ useFactory: ({ isCustomServer, app, appFactory, server }) => {
928
+ return isCustomServer ? appFactory({ server }) : app;
929
+ },
930
+ deps: {
931
+ isCustomServer: IS_CUSTOM_SERVER_TOKEN,
932
+ app: WEB_FASTIFY_APP_TOKEN,
933
+ appFactory: WEB_FASTIFY_APP_FACTORY_TOKEN,
934
+ server: UTILITY_SERVER_TOKEN,
935
+ },
936
+ }),
937
+ provide({
938
+ provide: commandLineListTokens.listen,
939
+ multi: true,
940
+ scope: Scope.SINGLETON,
941
+ useFactory: ({ logger, isCustomServer, port, app, server }) => {
942
+ return async function utilityServerListen() {
943
+ if (!isCustomServer) {
944
+ return;
945
+ }
946
+ const log = logger('server:utility');
947
+ await app.ready();
948
+ return new Promise((resolve, reject) => {
949
+ server.once('error', (error) => {
950
+ log.error({ event: 'server-listen-port', error });
951
+ reject(error);
952
+ });
953
+ server.listen(port, () => {
954
+ log.warn({ event: 'server-listen-port', message: `Server listen ${port} port` });
955
+ resolve();
956
+ });
957
+ });
958
+ };
959
+ },
960
+ deps: {
961
+ logger: LOGGER_TOKEN,
962
+ isCustomServer: IS_CUSTOM_SERVER_TOKEN,
963
+ port: UTILITY_SERVER_PORT_TOKEN,
964
+ app: UTILITY_WEB_FASTIFY_APP_TOKEN,
965
+ server: UTILITY_SERVER_TOKEN,
966
+ },
967
+ }),
968
+ ],
969
+ })
970
+ ], UtilityServerModule);
971
+
881
972
  let ServerModule = class ServerModule {
882
973
  };
883
974
  ServerModule = __decorate([
@@ -890,6 +981,7 @@ ServerModule = __decorate([
890
981
  ServerGracefulShutdownModule,
891
982
  ServerProxyModule,
892
983
  DependenciesVersionModule,
984
+ UtilityServerModule,
893
985
  process.env.NODE_ENV !== 'production' && DebugHttpRequestsModule,
894
986
  ].filter(Boolean),
895
987
  providers: [
package/lib/server.js CHANGED
@@ -604,13 +604,13 @@ let ServerGracefulShutdownModule = class ServerGracefulShutdownModule {
604
604
  ServerGracefulShutdownModule = tslib.__decorate([
605
605
  core.Module({
606
606
  providers: [
607
- {
607
+ core.provide({
608
608
  provide: tokensServerPrivate.WEB_FASTIFY_APP_BEFORE_INIT_TOKEN,
609
609
  multi: true,
610
- useFactory: ({ server, logger, commandLineRunner, livenessProbe, readinessProbe, }) => {
610
+ useFactory: ({ app, server, logger, commandLineRunner, livenessProbe, readinessProbe, }) => {
611
611
  const log = logger('server');
612
- return function serverListen(instance) {
613
- terminus.createTerminus(server, instance, {
612
+ return function serverListen() {
613
+ terminus.createTerminus(server, app, {
614
614
  signal: 'SIGTERM',
615
615
  timeout: GRACEFUL_SHUTDOWN_TIMEOUT,
616
616
  logger: (msg, error) => {
@@ -650,15 +650,16 @@ ServerGracefulShutdownModule = tslib.__decorate([
650
650
  };
651
651
  },
652
652
  deps: {
653
+ app: tokensServerPrivate.UTILITY_WEB_FASTIFY_APP_TOKEN,
653
654
  server: tokensServer.SERVER_TOKEN,
654
655
  logger: tokensCommon.LOGGER_TOKEN,
655
656
  commandLineRunner: core.COMMAND_LINE_RUNNER_TOKEN,
656
657
  readinessProbe: { token: tokensServer.READINESS_PROBE_TOKEN, optional: true },
657
658
  livenessProbe: { token: tokensServer.LIVENESS_PROBE_TOKEN, optional: true },
658
659
  },
659
- },
660
+ }),
660
661
  {
661
- provide: tokensServer.SPECIAL_SERVER_PATHS,
662
+ provide: tokensServer.UTILITY_SERVER_PATHS,
662
663
  useValue: [readyzPath, healthzPath],
663
664
  multi: true,
664
665
  },
@@ -903,6 +904,96 @@ DependenciesVersionModule = tslib.__decorate([
903
904
  })
904
905
  ], DependenciesVersionModule);
905
906
 
907
+ const IS_CUSTOM_SERVER_TOKEN = core.createToken('server utility isCustomServer');
908
+ let UtilityServerModule = class UtilityServerModule {
909
+ };
910
+ UtilityServerModule = tslib.__decorate([
911
+ core.Module({
912
+ providers: [
913
+ core.provide({
914
+ provide: tokensCommon.ENV_USED_TOKEN,
915
+ multi: true,
916
+ useValue: [{ key: 'UTILITY_SERVER_PORT', optional: true }],
917
+ }),
918
+ core.provide({
919
+ provide: tokensServer.UTILITY_SERVER_PORT_TOKEN,
920
+ useFactory: ({ envManager }) => {
921
+ return +(envManager.get('UTILITY_SERVER_PORT') || envManager.get('PORT'));
922
+ },
923
+ deps: {
924
+ envManager: tokensCommon.ENV_MANAGER_TOKEN,
925
+ },
926
+ }),
927
+ core.provide({
928
+ provide: IS_CUSTOM_SERVER_TOKEN,
929
+ useFactory: ({ port, envManager }) => {
930
+ return +envManager.get('PORT') !== port;
931
+ },
932
+ deps: {
933
+ envManager: tokensCommon.ENV_MANAGER_TOKEN,
934
+ port: tokensServer.UTILITY_SERVER_PORT_TOKEN,
935
+ },
936
+ }),
937
+ core.provide({
938
+ provide: tokensServerPrivate.UTILITY_SERVER_TOKEN,
939
+ scope: core.Scope.SINGLETON,
940
+ useFactory: ({ isCustomServer, serverFactory, server }) => {
941
+ return isCustomServer ? serverFactory() : server;
942
+ },
943
+ deps: {
944
+ isCustomServer: IS_CUSTOM_SERVER_TOKEN,
945
+ server: tokensServer.SERVER_TOKEN,
946
+ serverFactory: tokensServerPrivate.SERVER_FACTORY_TOKEN,
947
+ },
948
+ }),
949
+ core.provide({
950
+ provide: tokensServerPrivate.UTILITY_WEB_FASTIFY_APP_TOKEN,
951
+ scope: core.Scope.SINGLETON,
952
+ useFactory: ({ isCustomServer, app, appFactory, server }) => {
953
+ return isCustomServer ? appFactory({ server }) : app;
954
+ },
955
+ deps: {
956
+ isCustomServer: IS_CUSTOM_SERVER_TOKEN,
957
+ app: tokensServerPrivate.WEB_FASTIFY_APP_TOKEN,
958
+ appFactory: tokensServerPrivate.WEB_FASTIFY_APP_FACTORY_TOKEN,
959
+ server: tokensServerPrivate.UTILITY_SERVER_TOKEN,
960
+ },
961
+ }),
962
+ core.provide({
963
+ provide: core.commandLineListTokens.listen,
964
+ multi: true,
965
+ scope: core.Scope.SINGLETON,
966
+ useFactory: ({ logger, isCustomServer, port, app, server }) => {
967
+ return async function utilityServerListen() {
968
+ if (!isCustomServer) {
969
+ return;
970
+ }
971
+ const log = logger('server:utility');
972
+ await app.ready();
973
+ return new Promise((resolve, reject) => {
974
+ server.once('error', (error) => {
975
+ log.error({ event: 'server-listen-port', error });
976
+ reject(error);
977
+ });
978
+ server.listen(port, () => {
979
+ log.warn({ event: 'server-listen-port', message: `Server listen ${port} port` });
980
+ resolve();
981
+ });
982
+ });
983
+ };
984
+ },
985
+ deps: {
986
+ logger: tokensCommon.LOGGER_TOKEN,
987
+ isCustomServer: IS_CUSTOM_SERVER_TOKEN,
988
+ port: tokensServer.UTILITY_SERVER_PORT_TOKEN,
989
+ app: tokensServerPrivate.UTILITY_WEB_FASTIFY_APP_TOKEN,
990
+ server: tokensServerPrivate.UTILITY_SERVER_TOKEN,
991
+ },
992
+ }),
993
+ ],
994
+ })
995
+ ], UtilityServerModule);
996
+
906
997
  exports.ServerModule = class ServerModule {
907
998
  };
908
999
  exports.ServerModule = tslib.__decorate([
@@ -915,6 +1006,7 @@ exports.ServerModule = tslib.__decorate([
915
1006
  ServerGracefulShutdownModule,
916
1007
  ServerProxyModule,
917
1008
  DependenciesVersionModule,
1009
+ UtilityServerModule,
918
1010
  process.env.NODE_ENV !== 'production' && DebugHttpRequestsModule,
919
1011
  ].filter(Boolean),
920
1012
  providers: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-server",
3
- "version": "1.95.1",
3
+ "version": "1.97.0",
4
4
  "description": "",
5
5
  "browser": "lib/browser.js",
6
6
  "main": "lib/server.js",
@@ -23,11 +23,11 @@
23
23
  "@tinkoff/monkeypatch": "1.3.3",
24
24
  "@tinkoff/terminus": "0.0.2",
25
25
  "@tinkoff/url": "0.7.37",
26
- "@tramvai/module-cache-warmup": "1.95.1",
27
- "@tramvai/module-metrics": "1.95.1",
28
- "@tramvai/papi": "1.95.1",
29
- "@tramvai/tokens-server": "1.95.1",
30
- "@tramvai/tokens-server-private": "1.95.1",
26
+ "@tramvai/module-cache-warmup": "1.97.0",
27
+ "@tramvai/module-metrics": "1.97.0",
28
+ "@tramvai/papi": "1.97.0",
29
+ "@tramvai/tokens-server": "1.97.0",
30
+ "@tramvai/tokens-server-private": "1.97.0",
31
31
  "compression": "^1.7.4",
32
32
  "express": "^4.17.1",
33
33
  "fastify": "^3.27.4",
@@ -40,11 +40,11 @@
40
40
  "peerDependencies": {
41
41
  "@tinkoff/dippy": "0.7.39",
42
42
  "@tinkoff/utils": "^2.1.2",
43
- "@tramvai/cli": "1.95.1",
44
- "@tramvai/core": "1.95.1",
45
- "@tramvai/module-common": "1.95.1",
46
- "@tramvai/module-environment": "1.95.1",
47
- "@tramvai/tokens-common": "1.95.1",
43
+ "@tramvai/cli": "1.97.0",
44
+ "@tramvai/core": "1.97.0",
45
+ "@tramvai/module-common": "1.97.0",
46
+ "@tramvai/module-environment": "1.97.0",
47
+ "@tramvai/tokens-common": "1.97.0",
48
48
  "tslib": "^2.0.3"
49
49
  },
50
50
  "devDependencies": {