@omnitronix/game-engine-sdk 1.0.1

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.
Files changed (177) hide show
  1. package/dist/bootstrap/index.d.ts +15 -0
  2. package/dist/bootstrap/index.d.ts.map +1 -0
  3. package/dist/bootstrap/index.js +156 -0
  4. package/dist/common/api-docs/setup-documentation.d.ts +3 -0
  5. package/dist/common/api-docs/setup-documentation.d.ts.map +1 -0
  6. package/dist/common/api-docs/setup-documentation.js +27 -0
  7. package/dist/common/application-bootstrap-options.interface.d.ts +4 -0
  8. package/dist/common/application-bootstrap-options.interface.d.ts.map +1 -0
  9. package/dist/common/application-bootstrap-options.interface.js +2 -0
  10. package/dist/common/error-handling/all-exceptions.filter.d.ts +22 -0
  11. package/dist/common/error-handling/all-exceptions.filter.d.ts.map +1 -0
  12. package/dist/common/error-handling/all-exceptions.filter.js +131 -0
  13. package/dist/common/error-handling/domain.exception.d.ts +8 -0
  14. package/dist/common/error-handling/domain.exception.d.ts.map +1 -0
  15. package/dist/common/error-handling/domain.exception.js +14 -0
  16. package/dist/common/error-handling/error-code-mapper.d.ts +6 -0
  17. package/dist/common/error-handling/error-code-mapper.d.ts.map +1 -0
  18. package/dist/common/error-handling/error-code-mapper.js +93 -0
  19. package/dist/common/error-handling/internal-error-code.d.ts +67 -0
  20. package/dist/common/error-handling/internal-error-code.d.ts.map +1 -0
  21. package/dist/common/error-handling/internal-error-code.js +80 -0
  22. package/dist/common/index.d.ts +21 -0
  23. package/dist/common/index.d.ts.map +1 -0
  24. package/dist/common/index.js +51 -0
  25. package/dist/common/logger/logger.d.ts +24 -0
  26. package/dist/common/logger/logger.d.ts.map +1 -0
  27. package/dist/common/logger/logger.js +137 -0
  28. package/dist/common/logger/logger.module.d.ts +3 -0
  29. package/dist/common/logger/logger.module.d.ts.map +1 -0
  30. package/dist/common/logger/logger.module.js +19 -0
  31. package/dist/common/logger/logging.middleware.d.ts +8 -0
  32. package/dist/common/logger/logging.middleware.d.ts.map +1 -0
  33. package/dist/common/logger/logging.middleware.js +44 -0
  34. package/dist/common/metrics/database-metrics.service.d.ts +8 -0
  35. package/dist/common/metrics/database-metrics.service.d.ts.map +1 -0
  36. package/dist/common/metrics/database-metrics.service.js +39 -0
  37. package/dist/common/metrics/helpers/metrics.helpers.d.ts +5 -0
  38. package/dist/common/metrics/helpers/metrics.helpers.d.ts.map +1 -0
  39. package/dist/common/metrics/helpers/metrics.helpers.js +38 -0
  40. package/dist/common/metrics/metrics.module.d.ts +3 -0
  41. package/dist/common/metrics/metrics.module.d.ts.map +1 -0
  42. package/dist/common/metrics/metrics.module.js +207 -0
  43. package/dist/common/metrics/metrics.port.d.ts +22 -0
  44. package/dist/common/metrics/metrics.port.d.ts.map +1 -0
  45. package/dist/common/metrics/metrics.port.js +4 -0
  46. package/dist/common/metrics/prometheus.service.d.ts +25 -0
  47. package/dist/common/metrics/prometheus.service.d.ts.map +1 -0
  48. package/dist/common/metrics/prometheus.service.js +105 -0
  49. package/dist/common/retry/retry-policies.d.ts +8 -0
  50. package/dist/common/retry/retry-policies.d.ts.map +1 -0
  51. package/dist/common/retry/retry-policies.js +43 -0
  52. package/dist/common/retry/retry-policy.d.ts +25 -0
  53. package/dist/common/retry/retry-policy.d.ts.map +1 -0
  54. package/dist/common/retry/retry-policy.js +65 -0
  55. package/dist/common/secrets-provider/secrets-provider.aws.d.ts +13 -0
  56. package/dist/common/secrets-provider/secrets-provider.aws.d.ts.map +1 -0
  57. package/dist/common/secrets-provider/secrets-provider.aws.js +72 -0
  58. package/dist/common/secrets-provider/secrets-provider.d.ts +5 -0
  59. package/dist/common/secrets-provider/secrets-provider.d.ts.map +1 -0
  60. package/dist/common/secrets-provider/secrets-provider.js +4 -0
  61. package/dist/common/secrets-provider/secrets-provider.local.d.ts +8 -0
  62. package/dist/common/secrets-provider/secrets-provider.local.d.ts.map +1 -0
  63. package/dist/common/secrets-provider/secrets-provider.local.js +75 -0
  64. package/dist/common/secrets-provider/secrets-provider.module.d.ts +5 -0
  65. package/dist/common/secrets-provider/secrets-provider.module.d.ts.map +1 -0
  66. package/dist/common/secrets-provider/secrets-provider.module.js +47 -0
  67. package/dist/esm/bootstrap/index.js +120 -0
  68. package/dist/esm/common/api-docs/setup-documentation.js +23 -0
  69. package/dist/esm/common/application-bootstrap-options.interface.js +1 -0
  70. package/dist/esm/common/error-handling/all-exceptions.filter.js +128 -0
  71. package/dist/esm/common/error-handling/domain.exception.js +10 -0
  72. package/dist/esm/common/error-handling/error-code-mapper.js +89 -0
  73. package/dist/esm/common/error-handling/internal-error-code.js +77 -0
  74. package/dist/esm/common/index.js +25 -0
  75. package/dist/esm/common/logger/logger.js +133 -0
  76. package/dist/esm/common/logger/logger.module.js +16 -0
  77. package/dist/esm/common/logger/logging.middleware.js +41 -0
  78. package/dist/esm/common/metrics/database-metrics.service.js +36 -0
  79. package/dist/esm/common/metrics/helpers/metrics.helpers.js +32 -0
  80. package/dist/esm/common/metrics/metrics.module.js +204 -0
  81. package/dist/esm/common/metrics/metrics.port.js +1 -0
  82. package/dist/esm/common/metrics/prometheus.service.js +102 -0
  83. package/dist/esm/common/retry/retry-policies.js +39 -0
  84. package/dist/esm/common/retry/retry-policy.js +61 -0
  85. package/dist/esm/common/secrets-provider/secrets-provider.aws.js +69 -0
  86. package/dist/esm/common/secrets-provider/secrets-provider.js +1 -0
  87. package/dist/esm/common/secrets-provider/secrets-provider.local.js +39 -0
  88. package/dist/esm/common/secrets-provider/secrets-provider.module.js +44 -0
  89. package/dist/esm/generated/game-engine-registry_pb.js +28 -0
  90. package/dist/esm/generated/game-engine_pb.js +57 -0
  91. package/dist/esm/grpc/connect-router.middleware.js +16 -0
  92. package/dist/esm/grpc/game-engine.grpc.in-adapter.js +109 -0
  93. package/dist/esm/grpc/index.js +2 -0
  94. package/dist/esm/health/application/ports/in/health-in.port.js +1 -0
  95. package/dist/esm/health/application/ports/out/database-health.out-port.js +1 -0
  96. package/dist/esm/health/application/ports/out/shutdown.out-port.js +1 -0
  97. package/dist/esm/health/application/ports/out/system-health.out-port.js +1 -0
  98. package/dist/esm/health/application/services/health.service.js +81 -0
  99. package/dist/esm/health/domain/health.js +7 -0
  100. package/dist/esm/health/health.module.js +65 -0
  101. package/dist/esm/health/index.js +15 -0
  102. package/dist/esm/health/infrastructure/adapters/in/health.http.in-adapter.js +96 -0
  103. package/dist/esm/health/infrastructure/adapters/out/shutdown/shutdown.out-adapter.js +45 -0
  104. package/dist/esm/health/infrastructure/adapters/out/system/system-health.out-adapter.js +43 -0
  105. package/dist/esm/index.js +15 -0
  106. package/dist/esm/registration/adapters/game-engine-registry.grpc.out-adapter.js +59 -0
  107. package/dist/esm/registration/index.js +3 -0
  108. package/dist/esm/registration/ports/game-engine-registry.out-port.js +1 -0
  109. package/dist/esm/registration/services/game-engine-auto-register.service.js +78 -0
  110. package/dist/esm/types.js +8 -0
  111. package/dist/generated/game-engine-registry_pb.d.ts +76 -0
  112. package/dist/generated/game-engine-registry_pb.d.ts.map +1 -0
  113. package/dist/generated/game-engine-registry_pb.js +31 -0
  114. package/dist/generated/game-engine_pb.d.ts +171 -0
  115. package/dist/generated/game-engine_pb.d.ts.map +1 -0
  116. package/dist/generated/game-engine_pb.js +60 -0
  117. package/dist/grpc/connect-router.middleware.d.ts +7 -0
  118. package/dist/grpc/connect-router.middleware.d.ts.map +1 -0
  119. package/dist/grpc/connect-router.middleware.js +19 -0
  120. package/dist/grpc/game-engine.grpc.in-adapter.d.ts +21 -0
  121. package/dist/grpc/game-engine.grpc.in-adapter.d.ts.map +1 -0
  122. package/dist/grpc/game-engine.grpc.in-adapter.js +112 -0
  123. package/dist/grpc/index.d.ts +3 -0
  124. package/dist/grpc/index.d.ts.map +1 -0
  125. package/dist/grpc/index.js +7 -0
  126. package/dist/health/application/ports/in/health-in.port.d.ts +7 -0
  127. package/dist/health/application/ports/in/health-in.port.d.ts.map +1 -0
  128. package/dist/health/application/ports/in/health-in.port.js +4 -0
  129. package/dist/health/application/ports/out/database-health.out-port.d.ts +6 -0
  130. package/dist/health/application/ports/out/database-health.out-port.d.ts.map +1 -0
  131. package/dist/health/application/ports/out/database-health.out-port.js +4 -0
  132. package/dist/health/application/ports/out/shutdown.out-port.d.ts +6 -0
  133. package/dist/health/application/ports/out/shutdown.out-port.d.ts.map +1 -0
  134. package/dist/health/application/ports/out/shutdown.out-port.js +4 -0
  135. package/dist/health/application/ports/out/system-health.out-port.d.ts +7 -0
  136. package/dist/health/application/ports/out/system-health.out-port.d.ts.map +1 -0
  137. package/dist/health/application/ports/out/system-health.out-port.js +4 -0
  138. package/dist/health/application/services/health.service.d.ts +13 -0
  139. package/dist/health/application/services/health.service.d.ts.map +1 -0
  140. package/dist/health/application/services/health.service.js +84 -0
  141. package/dist/health/domain/health.d.ts +15 -0
  142. package/dist/health/domain/health.d.ts.map +1 -0
  143. package/dist/health/domain/health.js +11 -0
  144. package/dist/health/health.module.d.ts +10 -0
  145. package/dist/health/health.module.d.ts.map +1 -0
  146. package/dist/health/health.module.js +68 -0
  147. package/dist/health/index.d.ts +11 -0
  148. package/dist/health/index.d.ts.map +1 -0
  149. package/dist/health/index.js +28 -0
  150. package/dist/health/infrastructure/adapters/in/health.http.in-adapter.d.ts +16 -0
  151. package/dist/health/infrastructure/adapters/in/health.http.in-adapter.d.ts.map +1 -0
  152. package/dist/health/infrastructure/adapters/in/health.http.in-adapter.js +99 -0
  153. package/dist/health/infrastructure/adapters/out/shutdown/shutdown.out-adapter.d.ts +13 -0
  154. package/dist/health/infrastructure/adapters/out/shutdown/shutdown.out-adapter.d.ts.map +1 -0
  155. package/dist/health/infrastructure/adapters/out/shutdown/shutdown.out-adapter.js +48 -0
  156. package/dist/health/infrastructure/adapters/out/system/system-health.out-adapter.d.ts +12 -0
  157. package/dist/health/infrastructure/adapters/out/system/system-health.out-adapter.d.ts.map +1 -0
  158. package/dist/health/infrastructure/adapters/out/system/system-health.out-adapter.js +46 -0
  159. package/dist/index.d.ts +9 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +43 -0
  162. package/dist/registration/adapters/game-engine-registry.grpc.out-adapter.d.ts +12 -0
  163. package/dist/registration/adapters/game-engine-registry.grpc.out-adapter.d.ts.map +1 -0
  164. package/dist/registration/adapters/game-engine-registry.grpc.out-adapter.js +62 -0
  165. package/dist/registration/index.d.ts +4 -0
  166. package/dist/registration/index.d.ts.map +1 -0
  167. package/dist/registration/index.js +9 -0
  168. package/dist/registration/ports/game-engine-registry.out-port.d.ts +9 -0
  169. package/dist/registration/ports/game-engine-registry.out-port.d.ts.map +1 -0
  170. package/dist/registration/ports/game-engine-registry.out-port.js +4 -0
  171. package/dist/registration/services/game-engine-auto-register.service.d.ts +14 -0
  172. package/dist/registration/services/game-engine-auto-register.service.d.ts.map +1 -0
  173. package/dist/registration/services/game-engine-auto-register.service.js +81 -0
  174. package/dist/types.d.ts +53 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +11 -0
  177. package/package.json +159 -0
@@ -0,0 +1,21 @@
1
+ import { Logger } from '../common/logger/logger';
2
+ import { GetGameEngineInfoRequest, GetGameEngineInfoResponse, ProcessCommandRequest, ProcessCommandResponse } from '../generated/game-engine_pb';
3
+ import { GameEngineInPort } from '../types';
4
+ export declare class GameEngineGrpcInAdapter {
5
+ private readonly gameEngineInPort;
6
+ logger: Logger;
7
+ constructor(gameEngineInPort: GameEngineInPort);
8
+ processCommand(request: ProcessCommandRequest): Promise<ProcessCommandResponse>;
9
+ private extractCommandFromRequest;
10
+ private createSuccessResponse;
11
+ private createErrorResponse;
12
+ /**
13
+ * Convert RNG outcome from internal format (seed: number) to wire format (seed: string).
14
+ *
15
+ * This conversion happens at the gRPC boundary to match the proto definition.
16
+ */
17
+ private convertRngOutcome;
18
+ private safeStringify;
19
+ getGameEngineInfo(_request: GetGameEngineInfoRequest): Promise<GetGameEngineInfoResponse>;
20
+ }
21
+ //# sourceMappingURL=game-engine.grpc.in-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-engine.grpc.in-adapter.d.ts","sourceRoot":"","sources":["../../src/grpc/game-engine.grpc.in-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EAEzB,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,gBAAgB,EAIjB,MAAM,UAAU,CAAC;AAGlB,qBACa,uBAAuB;IAIhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAHnC,MAAM,EAAE,MAAM,CAAC;gBAGI,gBAAgB,EAAE,gBAAgB;IAK/C,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAerF,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,mBAAmB;IAS3B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,aAAa;IAMf,iBAAiB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAYhG"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var GameEngineGrpcInAdapter_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.GameEngineGrpcInAdapter = void 0;
17
+ const protobuf_1 = require("@bufbuild/protobuf");
18
+ const logger_1 = require("../common/logger/logger");
19
+ const game_engine_pb_1 = require("../generated/game-engine_pb");
20
+ const types_1 = require("../types");
21
+ const common_1 = require("@nestjs/common");
22
+ let GameEngineGrpcInAdapter = GameEngineGrpcInAdapter_1 = class GameEngineGrpcInAdapter {
23
+ constructor(gameEngineInPort) {
24
+ this.gameEngineInPort = gameEngineInPort;
25
+ this.logger = new logger_1.Logger(GameEngineGrpcInAdapter_1.name);
26
+ }
27
+ async processCommand(request) {
28
+ try {
29
+ const command = this.extractCommandFromRequest(request);
30
+ const publicState = request.publicState ?? {};
31
+ const privateState = request.privateState ?? {};
32
+ const result = await this.gameEngineInPort.processCommand(publicState, privateState, command);
33
+ return this.createSuccessResponse(result);
34
+ }
35
+ catch (error) {
36
+ this.logger.error('Error in processCommand', error);
37
+ return this.createErrorResponse(request, error);
38
+ }
39
+ }
40
+ extractCommandFromRequest(request) {
41
+ return {
42
+ id: request.command?.id ?? '',
43
+ type: request.command?.type ?? '',
44
+ payload: request.command?.payload,
45
+ };
46
+ }
47
+ createSuccessResponse(result) {
48
+ const rngOutcome = this.convertRngOutcome(result.rngOutcome);
49
+ return (0, protobuf_1.create)(game_engine_pb_1.ProcessCommandResponseSchema, {
50
+ success: result.success ?? true,
51
+ publicState: result.publicState,
52
+ privateState: result.privateState,
53
+ outcome: result.outcome,
54
+ message: result.message,
55
+ rngOutcome: rngOutcome,
56
+ });
57
+ }
58
+ createErrorResponse(request, error) {
59
+ return (0, protobuf_1.create)(game_engine_pb_1.ProcessCommandResponseSchema, {
60
+ success: false,
61
+ publicState: request.publicState,
62
+ privateState: request.privateState,
63
+ message: error.errorCode ? error.message : 'Command processing failed',
64
+ });
65
+ }
66
+ /**
67
+ * Convert RNG outcome from internal format (seed: number) to wire format (seed: string).
68
+ *
69
+ * This conversion happens at the gRPC boundary to match the proto definition.
70
+ */
71
+ convertRngOutcome(rngOutcome) {
72
+ if (!rngOutcome) {
73
+ return undefined;
74
+ }
75
+ try {
76
+ return Object.fromEntries(Object.entries(rngOutcome).map(([key, value]) => [
77
+ key,
78
+ {
79
+ result: value.result,
80
+ // Convert seed to string for wire format (gRPC proto uses string)
81
+ seed: String(value.seed),
82
+ min: value.min,
83
+ max: value.max,
84
+ },
85
+ ]));
86
+ }
87
+ catch (e) {
88
+ this.logger.error('Error while formatting rngOutcome', e);
89
+ throw e;
90
+ }
91
+ }
92
+ safeStringify(obj) {
93
+ return JSON.stringify(obj, (key, value) => typeof value === 'bigint' ? value.toString() : value);
94
+ }
95
+ async getGameEngineInfo(_request) {
96
+ const gameEngineInfo = await this.gameEngineInPort.getGameEngineInfo();
97
+ // TODO: gameName and provider are available in GameEngineInfo but not in the proto schema.
98
+ // Update game-engine.proto to add these fields in GetGameEngineInfoResponse.
99
+ return (0, protobuf_1.create)(game_engine_pb_1.GetGameEngineInfoResponseSchema, {
100
+ gameCode: gameEngineInfo.gameCode,
101
+ version: gameEngineInfo.version,
102
+ rtp: gameEngineInfo.rtp,
103
+ gameType: gameEngineInfo.gameType,
104
+ });
105
+ }
106
+ };
107
+ exports.GameEngineGrpcInAdapter = GameEngineGrpcInAdapter;
108
+ exports.GameEngineGrpcInAdapter = GameEngineGrpcInAdapter = GameEngineGrpcInAdapter_1 = __decorate([
109
+ (0, common_1.Injectable)(),
110
+ __param(0, (0, common_1.Inject)(types_1.GAME_ENGINE_IN_PORT)),
111
+ __metadata("design:paramtypes", [Object])
112
+ ], GameEngineGrpcInAdapter);
@@ -0,0 +1,3 @@
1
+ export { GameEngineGrpcInAdapter } from './game-engine.grpc.in-adapter';
2
+ export { createConnectRouter } from './connect-router.middleware';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/grpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConnectRouter = exports.GameEngineGrpcInAdapter = void 0;
4
+ var game_engine_grpc_in_adapter_1 = require("./game-engine.grpc.in-adapter");
5
+ Object.defineProperty(exports, "GameEngineGrpcInAdapter", { enumerable: true, get: function () { return game_engine_grpc_in_adapter_1.GameEngineGrpcInAdapter; } });
6
+ var connect_router_middleware_1 = require("./connect-router.middleware");
7
+ Object.defineProperty(exports, "createConnectRouter", { enumerable: true, get: function () { return connect_router_middleware_1.createConnectRouter; } });
@@ -0,0 +1,7 @@
1
+ import { ApplicationHealthStatus } from '../../../domain/health';
2
+ export declare const HEALTH_IN_PORT: unique symbol;
3
+ export interface HealthInPort {
4
+ checkHealth(): Promise<ApplicationHealthStatus>;
5
+ isApplicationShuttingDown(): boolean;
6
+ }
7
+ //# sourceMappingURL=health-in.port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-in.port.d.ts","sourceRoot":"","sources":["../../../../../src/health/application/ports/in/health-in.port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAChD,yBAAyB,IAAI,OAAO,CAAC;CACtC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HEALTH_IN_PORT = void 0;
4
+ exports.HEALTH_IN_PORT = Symbol('HEALTH_IN_PORT');
@@ -0,0 +1,6 @@
1
+ import { HealthStatus } from '../../../domain/health';
2
+ export declare const DATABASE_HEALTH_OUT_PORT: unique symbol;
3
+ export interface DatabaseHealthOutPort {
4
+ checkDatabaseConnection(): Promise<HealthStatus>;
5
+ }
6
+ //# sourceMappingURL=database-health.out-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-health.out-port.d.ts","sourceRoot":"","sources":["../../../../../src/health/application/ports/out/database-health.out-port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,eAAO,MAAM,wBAAwB,eAAqC,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,uBAAuB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DATABASE_HEALTH_OUT_PORT = void 0;
4
+ exports.DATABASE_HEALTH_OUT_PORT = Symbol('DATABASE_HEALTH_OUT_PORT');
@@ -0,0 +1,6 @@
1
+ export declare const SHUTDOWN_OUT_PORT: unique symbol;
2
+ export interface ShutdownOutPort {
3
+ isShuttingDown(): boolean;
4
+ startGracefulShutdown(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=shutdown.out-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.out-port.d.ts","sourceRoot":"","sources":["../../../../../src/health/application/ports/out/shutdown.out-port.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,cAAc,IAAI,OAAO,CAAC;IAC1B,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SHUTDOWN_OUT_PORT = void 0;
4
+ exports.SHUTDOWN_OUT_PORT = Symbol('SHUTDOWN_OUT_PORT');
@@ -0,0 +1,7 @@
1
+ import { HealthStatus } from '../../../domain/health';
2
+ export declare const SYSTEM_HEALTH_OUT_PORT: unique symbol;
3
+ export interface SystemHealthOutPort {
4
+ checkMemoryUsage(): HealthStatus;
5
+ checkSystemResources(): HealthStatus;
6
+ }
7
+ //# sourceMappingURL=system-health.out-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-health.out-port.d.ts","sourceRoot":"","sources":["../../../../../src/health/application/ports/out/system-health.out-port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,eAAO,MAAM,sBAAsB,eAAmC,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,IAAI,YAAY,CAAC;IACjC,oBAAoB,IAAI,YAAY,CAAC;CACtC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SYSTEM_HEALTH_OUT_PORT = void 0;
4
+ exports.SYSTEM_HEALTH_OUT_PORT = Symbol('SYSTEM_HEALTH_OUT_PORT');
@@ -0,0 +1,13 @@
1
+ import { HealthInPort } from '../ports/in/health-in.port';
2
+ import { ShutdownOutPort } from '../ports/out/shutdown.out-port';
3
+ import { SystemHealthOutPort } from '../ports/out/system-health.out-port';
4
+ import { ApplicationHealthStatus } from '../../domain/health';
5
+ export declare class HealthService implements HealthInPort {
6
+ private readonly systemHealthOutPort;
7
+ private readonly shutdownOutPort;
8
+ private readonly logger;
9
+ constructor(systemHealthOutPort: SystemHealthOutPort, shutdownOutPort: ShutdownOutPort);
10
+ checkHealth(): Promise<ApplicationHealthStatus>;
11
+ isApplicationShuttingDown(): boolean;
12
+ }
13
+ //# sourceMappingURL=health.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.service.d.ts","sourceRoot":"","sources":["../../../../src/health/application/services/health.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAqB,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAA0B,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,EACL,uBAAuB,EAGxB,MAAM,qBAAqB,CAAC;AAG7B,qBACa,aAAc,YAAW,YAAY;IAK9C,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,eAAe;IANlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAItC,mBAAmB,EAAE,mBAAmB,EAExC,eAAe,EAAE,eAAe;IAG7C,WAAW,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAoDrD,yBAAyB,IAAI,OAAO;CAGrC"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var HealthService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.HealthService = void 0;
17
+ const logger_1 = require("../../../common/logger/logger");
18
+ const shutdown_out_port_1 = require("../ports/out/shutdown.out-port");
19
+ const system_health_out_port_1 = require("../ports/out/system-health.out-port");
20
+ const health_1 = require("../../domain/health");
21
+ const common_1 = require("@nestjs/common");
22
+ let HealthService = HealthService_1 = class HealthService {
23
+ constructor(systemHealthOutPort, shutdownOutPort) {
24
+ this.systemHealthOutPort = systemHealthOutPort;
25
+ this.shutdownOutPort = shutdownOutPort;
26
+ this.logger = new logger_1.Logger(HealthService_1.name);
27
+ }
28
+ async checkHealth() {
29
+ this.logger.debug('Starting health check...');
30
+ try {
31
+ const healthChecks = await Promise.allSettled([
32
+ Promise.resolve(this.systemHealthOutPort.checkMemoryUsage()),
33
+ Promise.resolve(this.systemHealthOutPort.checkSystemResources()),
34
+ ]);
35
+ const components = [];
36
+ let overallHealth = true;
37
+ healthChecks.forEach((result, index) => {
38
+ const componentNames = ['memory', 'system'];
39
+ const componentName = componentNames[index];
40
+ if (result.status === 'fulfilled') {
41
+ components.push(result.value);
42
+ if (!result.value.healthy) {
43
+ overallHealth = false;
44
+ }
45
+ }
46
+ else {
47
+ const failedComponent = {
48
+ healthy: false,
49
+ component: componentName,
50
+ };
51
+ components.push(failedComponent);
52
+ overallHealth = false;
53
+ }
54
+ });
55
+ const isShuttingDown = this.isApplicationShuttingDown();
56
+ const healthStatus = {
57
+ overall: overallHealth,
58
+ components,
59
+ uptime: process.uptime(),
60
+ shutdownStatus: isShuttingDown ? 'draining' : 'active',
61
+ };
62
+ if (!overallHealth) {
63
+ this.logger.error('Health check failed', { components });
64
+ throw new health_1.HealthCheckFailedException('application', healthStatus);
65
+ }
66
+ this.logger.debug('Health check passed');
67
+ return healthStatus;
68
+ }
69
+ catch (error) {
70
+ this.logger.error('Health check error:', error);
71
+ throw error;
72
+ }
73
+ }
74
+ isApplicationShuttingDown() {
75
+ return this.shutdownOutPort.isShuttingDown();
76
+ }
77
+ };
78
+ exports.HealthService = HealthService;
79
+ exports.HealthService = HealthService = HealthService_1 = __decorate([
80
+ (0, common_1.Injectable)(),
81
+ __param(0, (0, common_1.Inject)(system_health_out_port_1.SYSTEM_HEALTH_OUT_PORT)),
82
+ __param(1, (0, common_1.Inject)(shutdown_out_port_1.SHUTDOWN_OUT_PORT)),
83
+ __metadata("design:paramtypes", [Object, Object])
84
+ ], HealthService);
@@ -0,0 +1,15 @@
1
+ import { DomainException } from '../../common/error-handling/domain.exception';
2
+ export interface HealthStatus {
3
+ healthy: boolean;
4
+ component: string;
5
+ }
6
+ export interface ApplicationHealthStatus {
7
+ overall: boolean;
8
+ components: HealthStatus[];
9
+ uptime: number;
10
+ shutdownStatus?: 'active' | 'draining';
11
+ }
12
+ export declare class HealthCheckFailedException extends DomainException {
13
+ constructor(component: string, details?: any);
14
+ }
15
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/health/domain/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAG/E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACxC;AAED,qBAAa,0BAA2B,SAAQ,eAAe;gBACjD,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAO7C"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HealthCheckFailedException = void 0;
4
+ const domain_exception_1 = require("../../common/error-handling/domain.exception");
5
+ const internal_error_code_1 = require("../../common/error-handling/internal-error-code");
6
+ class HealthCheckFailedException extends domain_exception_1.DomainException {
7
+ constructor(component, details) {
8
+ super(internal_error_code_1.InternalErrorCode.HEALTH_CHECK_FAILED, `Health check failed for component: ${component}`, details);
9
+ }
10
+ }
11
+ exports.HealthCheckFailedException = HealthCheckFailedException;
@@ -0,0 +1,10 @@
1
+ import { BeforeApplicationShutdown, OnModuleInit } from '@nestjs/common';
2
+ import { ShutdownOutPort } from './application/ports/out/shutdown.out-port';
3
+ export declare class HealthModule implements BeforeApplicationShutdown, OnModuleInit {
4
+ private readonly shutdownOutPort;
5
+ private readonly logger;
6
+ constructor(shutdownOutPort: ShutdownOutPort);
7
+ onModuleInit(): void;
8
+ beforeApplicationShutdown(signal?: string): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=health.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.module.d.ts","sourceRoot":"","sources":["../../src/health/health.module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAkB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAAqB,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAM/F,qBAqBa,YAAa,YAAW,yBAAyB,EAAE,YAAY;IAKxE,OAAO,CAAC,QAAQ,CAAC,eAAe;IAJlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAIrC,eAAe,EAAE,eAAe;IAGnD,YAAY;IAIN,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMhE"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var HealthModule_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.HealthModule = void 0;
17
+ const logger_1 = require("../common/logger/logger");
18
+ const secrets_provider_module_1 = require("../common/secrets-provider/secrets-provider.module");
19
+ const health_in_port_1 = require("./application/ports/in/health-in.port");
20
+ const health_http_in_adapter_1 = require("./infrastructure/adapters/in/health.http.in-adapter");
21
+ const common_1 = require("@nestjs/common");
22
+ const config_1 = require("@nestjs/config");
23
+ const shutdown_out_port_1 = require("./application/ports/out/shutdown.out-port");
24
+ const system_health_out_port_1 = require("./application/ports/out/system-health.out-port");
25
+ const health_service_1 = require("./application/services/health.service");
26
+ const shutdown_out_adapter_1 = require("./infrastructure/adapters/out/shutdown/shutdown.out-adapter");
27
+ const system_health_out_adapter_1 = require("./infrastructure/adapters/out/system/system-health.out-adapter");
28
+ let HealthModule = HealthModule_1 = class HealthModule {
29
+ constructor(shutdownOutPort) {
30
+ this.shutdownOutPort = shutdownOutPort;
31
+ this.logger = new logger_1.Logger(HealthModule_1.name);
32
+ }
33
+ onModuleInit() {
34
+ this.logger.log('HealthModule initialized successfully');
35
+ }
36
+ async beforeApplicationShutdown(signal) {
37
+ this.logger.log(`Received signal: ${signal}`);
38
+ if (signal === 'SIGTERM' || signal === 'SIGINT') {
39
+ await this.shutdownOutPort.startGracefulShutdown();
40
+ }
41
+ }
42
+ };
43
+ exports.HealthModule = HealthModule;
44
+ exports.HealthModule = HealthModule = HealthModule_1 = __decorate([
45
+ (0, common_1.Module)({
46
+ imports: [config_1.ConfigModule, secrets_provider_module_1.SecretsModule],
47
+ controllers: [health_http_in_adapter_1.HealthHttpInAdapter],
48
+ providers: [
49
+ system_health_out_adapter_1.SystemHealthOutAdapter,
50
+ health_service_1.HealthService,
51
+ {
52
+ provide: system_health_out_port_1.SYSTEM_HEALTH_OUT_PORT,
53
+ useClass: system_health_out_adapter_1.SystemHealthOutAdapter,
54
+ },
55
+ {
56
+ provide: shutdown_out_port_1.SHUTDOWN_OUT_PORT,
57
+ useClass: shutdown_out_adapter_1.ShutdownOutAdapter,
58
+ },
59
+ {
60
+ provide: health_in_port_1.HEALTH_IN_PORT,
61
+ useExisting: health_service_1.HealthService,
62
+ },
63
+ ],
64
+ exports: [],
65
+ }),
66
+ __param(0, (0, common_1.Inject)(shutdown_out_port_1.SHUTDOWN_OUT_PORT)),
67
+ __metadata("design:paramtypes", [Object])
68
+ ], HealthModule);
@@ -0,0 +1,11 @@
1
+ export { HealthStatus, ApplicationHealthStatus, HealthCheckFailedException } from './domain/health';
2
+ export { HEALTH_IN_PORT, HealthInPort } from './application/ports/in/health-in.port';
3
+ export { SYSTEM_HEALTH_OUT_PORT, SystemHealthOutPort, } from './application/ports/out/system-health.out-port';
4
+ export { SHUTDOWN_OUT_PORT, ShutdownOutPort } from './application/ports/out/shutdown.out-port';
5
+ export { DATABASE_HEALTH_OUT_PORT, DatabaseHealthOutPort, } from './application/ports/out/database-health.out-port';
6
+ export { HealthService } from './application/services/health.service';
7
+ export { HealthHttpInAdapter } from './infrastructure/adapters/in/health.http.in-adapter';
8
+ export { SystemHealthOutAdapter } from './infrastructure/adapters/out/system/system-health.out-adapter';
9
+ export { ShutdownOutAdapter } from './infrastructure/adapters/out/shutdown/shutdown.out-adapter';
10
+ export { HealthModule } from './health.module';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAGpG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC/F,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kDAAkD,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAGtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAGjG,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HealthModule = exports.ShutdownOutAdapter = exports.SystemHealthOutAdapter = exports.HealthHttpInAdapter = exports.HealthService = exports.DATABASE_HEALTH_OUT_PORT = exports.SHUTDOWN_OUT_PORT = exports.SYSTEM_HEALTH_OUT_PORT = exports.HEALTH_IN_PORT = exports.HealthCheckFailedException = void 0;
4
+ // Domain
5
+ var health_1 = require("./domain/health");
6
+ Object.defineProperty(exports, "HealthCheckFailedException", { enumerable: true, get: function () { return health_1.HealthCheckFailedException; } });
7
+ // Ports
8
+ var health_in_port_1 = require("./application/ports/in/health-in.port");
9
+ Object.defineProperty(exports, "HEALTH_IN_PORT", { enumerable: true, get: function () { return health_in_port_1.HEALTH_IN_PORT; } });
10
+ var system_health_out_port_1 = require("./application/ports/out/system-health.out-port");
11
+ Object.defineProperty(exports, "SYSTEM_HEALTH_OUT_PORT", { enumerable: true, get: function () { return system_health_out_port_1.SYSTEM_HEALTH_OUT_PORT; } });
12
+ var shutdown_out_port_1 = require("./application/ports/out/shutdown.out-port");
13
+ Object.defineProperty(exports, "SHUTDOWN_OUT_PORT", { enumerable: true, get: function () { return shutdown_out_port_1.SHUTDOWN_OUT_PORT; } });
14
+ var database_health_out_port_1 = require("./application/ports/out/database-health.out-port");
15
+ Object.defineProperty(exports, "DATABASE_HEALTH_OUT_PORT", { enumerable: true, get: function () { return database_health_out_port_1.DATABASE_HEALTH_OUT_PORT; } });
16
+ // Services
17
+ var health_service_1 = require("./application/services/health.service");
18
+ Object.defineProperty(exports, "HealthService", { enumerable: true, get: function () { return health_service_1.HealthService; } });
19
+ // Infrastructure
20
+ var health_http_in_adapter_1 = require("./infrastructure/adapters/in/health.http.in-adapter");
21
+ Object.defineProperty(exports, "HealthHttpInAdapter", { enumerable: true, get: function () { return health_http_in_adapter_1.HealthHttpInAdapter; } });
22
+ var system_health_out_adapter_1 = require("./infrastructure/adapters/out/system/system-health.out-adapter");
23
+ Object.defineProperty(exports, "SystemHealthOutAdapter", { enumerable: true, get: function () { return system_health_out_adapter_1.SystemHealthOutAdapter; } });
24
+ var shutdown_out_adapter_1 = require("./infrastructure/adapters/out/shutdown/shutdown.out-adapter");
25
+ Object.defineProperty(exports, "ShutdownOutAdapter", { enumerable: true, get: function () { return shutdown_out_adapter_1.ShutdownOutAdapter; } });
26
+ // Module
27
+ var health_module_1 = require("./health.module");
28
+ Object.defineProperty(exports, "HealthModule", { enumerable: true, get: function () { return health_module_1.HealthModule; } });
@@ -0,0 +1,16 @@
1
+ import { HealthInPort } from '../../../application/ports/in/health-in.port';
2
+ import { Response } from 'express';
3
+ export declare class HealthHttpInAdapter {
4
+ private readonly healthInPort;
5
+ constructor(healthInPort: HealthInPort);
6
+ checkHealth(): Promise<{
7
+ status: string;
8
+ overall: boolean;
9
+ uptime: number;
10
+ shutdownStatus: "active" | "draining" | undefined;
11
+ components: import("../../../domain/health").HealthStatus[];
12
+ timestamp: string;
13
+ }>;
14
+ readyHealth(res: Response): Promise<Response<any, Record<string, any>>>;
15
+ }
16
+ //# sourceMappingURL=health.http.in-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.http.in-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/health/infrastructure/adapters/in/health.http.in-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAI5F,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,qBAEa,mBAAmB;IAG5B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAiCvC,WAAW;;;;;;;;IAuBX,WAAW,CAAQ,GAAG,EAAE,QAAQ;CAQvC"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.HealthHttpInAdapter = void 0;
16
+ const health_in_port_1 = require("../../../application/ports/in/health-in.port");
17
+ const common_1 = require("@nestjs/common");
18
+ const swagger_1 = require("@nestjs/swagger");
19
+ let HealthHttpInAdapter = class HealthHttpInAdapter {
20
+ constructor(healthInPort) {
21
+ this.healthInPort = healthInPort;
22
+ }
23
+ async checkHealth() {
24
+ const healthStatus = await this.healthInPort.checkHealth();
25
+ return {
26
+ status: 'ok',
27
+ overall: healthStatus.overall,
28
+ uptime: healthStatus.uptime,
29
+ shutdownStatus: healthStatus.shutdownStatus,
30
+ components: healthStatus.components,
31
+ timestamp: new Date().toISOString(),
32
+ };
33
+ }
34
+ async readyHealth(res) {
35
+ const isReady = !this.healthInPort.isApplicationShuttingDown();
36
+ if (isReady) {
37
+ return res.status(common_1.HttpStatus.OK).send();
38
+ }
39
+ return res.status(common_1.HttpStatus.SERVICE_UNAVAILABLE).send();
40
+ }
41
+ };
42
+ exports.HealthHttpInAdapter = HealthHttpInAdapter;
43
+ __decorate([
44
+ (0, common_1.Get)('health'),
45
+ (0, swagger_1.ApiOperation)({ summary: 'Health check endpoint' }),
46
+ (0, swagger_1.ApiResponse)({
47
+ status: 200,
48
+ description: 'Application is healthy',
49
+ schema: {
50
+ type: 'object',
51
+ properties: {
52
+ status: { type: 'string', example: 'ok' },
53
+ overall: { type: 'boolean' },
54
+ uptime: { type: 'number' },
55
+ shutdownStatus: { type: 'string', example: 'running' },
56
+ components: {
57
+ type: 'array',
58
+ items: {
59
+ type: 'object',
60
+ properties: {
61
+ healthy: { type: 'boolean' },
62
+ component: { type: 'string' },
63
+ },
64
+ },
65
+ },
66
+ timestamp: { type: 'string', format: 'date-time' },
67
+ },
68
+ },
69
+ }),
70
+ (0, swagger_1.ApiResponse)({
71
+ status: 500,
72
+ description: 'Application is unhealthy or shutting down',
73
+ }),
74
+ __metadata("design:type", Function),
75
+ __metadata("design:paramtypes", []),
76
+ __metadata("design:returntype", Promise)
77
+ ], HealthHttpInAdapter.prototype, "checkHealth", null);
78
+ __decorate([
79
+ (0, common_1.Get)('ready'),
80
+ (0, swagger_1.ApiOperation)({ summary: 'Application readiness to take traffic endpoint' }),
81
+ (0, swagger_1.ApiResponse)({
82
+ status: 200,
83
+ description: 'Application is ready',
84
+ }),
85
+ (0, swagger_1.ApiResponse)({
86
+ status: 503,
87
+ description: 'Application is shutting down',
88
+ }),
89
+ __param(0, (0, common_1.Res)()),
90
+ __metadata("design:type", Function),
91
+ __metadata("design:paramtypes", [Object]),
92
+ __metadata("design:returntype", Promise)
93
+ ], HealthHttpInAdapter.prototype, "readyHealth", null);
94
+ exports.HealthHttpInAdapter = HealthHttpInAdapter = __decorate([
95
+ (0, swagger_1.ApiTags)('Application - health'),
96
+ (0, common_1.Controller)(''),
97
+ __param(0, (0, common_1.Inject)(health_in_port_1.HEALTH_IN_PORT)),
98
+ __metadata("design:paramtypes", [Object])
99
+ ], HealthHttpInAdapter);
@@ -0,0 +1,13 @@
1
+ import { ShutdownOutPort } from '../../../../application/ports/out/shutdown.out-port';
2
+ import { ConfigService } from '@nestjs/config';
3
+ export declare class ShutdownOutAdapter implements ShutdownOutPort {
4
+ private readonly configService;
5
+ private readonly logger;
6
+ private shuttingDown;
7
+ constructor(configService: ConfigService);
8
+ isShuttingDown(): boolean;
9
+ startGracefulShutdown(): Promise<void>;
10
+ private cleanup;
11
+ private delay;
12
+ }
13
+ //# sourceMappingURL=shutdown.out-adapter.d.ts.map