@roomkit/gateway 1.0.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.
Files changed (130) hide show
  1. package/README.md +93 -0
  2. package/dist/src/admin/admin.controller.d.ts +187 -0
  3. package/dist/src/admin/admin.controller.d.ts.map +1 -0
  4. package/dist/src/admin/admin.controller.js +187 -0
  5. package/dist/src/admin/admin.controller.js.map +1 -0
  6. package/dist/src/admin/admin.module.d.ts +3 -0
  7. package/dist/src/admin/admin.module.d.ts.map +1 -0
  8. package/dist/src/admin/admin.module.js +28 -0
  9. package/dist/src/admin/admin.module.js.map +1 -0
  10. package/dist/src/admin/admin.service.d.ts +196 -0
  11. package/dist/src/admin/admin.service.d.ts.map +1 -0
  12. package/dist/src/admin/admin.service.js +322 -0
  13. package/dist/src/admin/admin.service.js.map +1 -0
  14. package/dist/src/config/config.module.d.ts +3 -0
  15. package/dist/src/config/config.module.d.ts.map +1 -0
  16. package/dist/src/config/config.module.js +22 -0
  17. package/dist/src/config/config.module.js.map +1 -0
  18. package/dist/src/config/config.service.d.ts +19 -0
  19. package/dist/src/config/config.service.d.ts.map +1 -0
  20. package/dist/src/config/config.service.js +55 -0
  21. package/dist/src/config/config.service.js.map +1 -0
  22. package/dist/src/config/gateway.config.d.ts +64 -0
  23. package/dist/src/config/gateway.config.d.ts.map +1 -0
  24. package/dist/src/config/gateway.config.js +43 -0
  25. package/dist/src/config/gateway.config.js.map +1 -0
  26. package/dist/src/connection/connection.module.d.ts +3 -0
  27. package/dist/src/connection/connection.module.d.ts.map +1 -0
  28. package/dist/src/connection/connection.module.js +22 -0
  29. package/dist/src/connection/connection.module.js.map +1 -0
  30. package/dist/src/connection/connection.service.d.ts +93 -0
  31. package/dist/src/connection/connection.service.d.ts.map +1 -0
  32. package/dist/src/connection/connection.service.js +257 -0
  33. package/dist/src/connection/connection.service.js.map +1 -0
  34. package/dist/src/gateway.module.d.ts +8 -0
  35. package/dist/src/gateway.module.d.ts.map +1 -0
  36. package/dist/src/gateway.module.js +44 -0
  37. package/dist/src/gateway.module.js.map +1 -0
  38. package/dist/src/index.d.ts +38 -0
  39. package/dist/src/index.d.ts.map +1 -0
  40. package/dist/src/index.js +97 -0
  41. package/dist/src/index.js.map +1 -0
  42. package/dist/src/lifecycle/graceful-shutdown.service.d.ts +65 -0
  43. package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -0
  44. package/dist/src/lifecycle/graceful-shutdown.service.js +187 -0
  45. package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -0
  46. package/dist/src/lifecycle/index.d.ts +2 -0
  47. package/dist/src/lifecycle/index.d.ts.map +1 -0
  48. package/dist/src/lifecycle/index.js +18 -0
  49. package/dist/src/lifecycle/index.js.map +1 -0
  50. package/dist/src/main.d.ts +2 -0
  51. package/dist/src/main.d.ts.map +1 -0
  52. package/dist/src/main.js +56 -0
  53. package/dist/src/main.js.map +1 -0
  54. package/dist/src/metrics/metrics.controller.d.ts +13 -0
  55. package/dist/src/metrics/metrics.controller.d.ts.map +1 -0
  56. package/dist/src/metrics/metrics.controller.js +42 -0
  57. package/dist/src/metrics/metrics.controller.js.map +1 -0
  58. package/dist/src/metrics/metrics.module.d.ts +3 -0
  59. package/dist/src/metrics/metrics.module.d.ts.map +1 -0
  60. package/dist/src/metrics/metrics.module.js +26 -0
  61. package/dist/src/metrics/metrics.module.js.map +1 -0
  62. package/dist/src/metrics/metrics.service.d.ts +81 -0
  63. package/dist/src/metrics/metrics.service.d.ts.map +1 -0
  64. package/dist/src/metrics/metrics.service.js +255 -0
  65. package/dist/src/metrics/metrics.service.js.map +1 -0
  66. package/dist/src/ratelimit/rate-limit.module.d.ts +3 -0
  67. package/dist/src/ratelimit/rate-limit.module.d.ts.map +1 -0
  68. package/dist/src/ratelimit/rate-limit.module.js +23 -0
  69. package/dist/src/ratelimit/rate-limit.module.js.map +1 -0
  70. package/dist/src/ratelimit/rate-limiter.service.d.ts +68 -0
  71. package/dist/src/ratelimit/rate-limiter.service.d.ts.map +1 -0
  72. package/dist/src/ratelimit/rate-limiter.service.js +201 -0
  73. package/dist/src/ratelimit/rate-limiter.service.js.map +1 -0
  74. package/dist/src/redis/redis.module.d.ts +3 -0
  75. package/dist/src/redis/redis.module.d.ts.map +1 -0
  76. package/dist/src/redis/redis.module.js +22 -0
  77. package/dist/src/redis/redis.module.js.map +1 -0
  78. package/dist/src/redis/redis.service.d.ts +68 -0
  79. package/dist/src/redis/redis.service.d.ts.map +1 -0
  80. package/dist/src/redis/redis.service.js +281 -0
  81. package/dist/src/redis/redis.service.js.map +1 -0
  82. package/dist/src/session/session.module.d.ts +3 -0
  83. package/dist/src/session/session.module.d.ts.map +1 -0
  84. package/dist/src/session/session.module.js +21 -0
  85. package/dist/src/session/session.module.js.map +1 -0
  86. package/dist/src/session/session.service.d.ts +64 -0
  87. package/dist/src/session/session.service.d.ts.map +1 -0
  88. package/dist/src/session/session.service.js +206 -0
  89. package/dist/src/session/session.service.js.map +1 -0
  90. package/dist/src/ws/message-router.service.d.ts +133 -0
  91. package/dist/src/ws/message-router.service.d.ts.map +1 -0
  92. package/dist/src/ws/message-router.service.js +715 -0
  93. package/dist/src/ws/message-router.service.js.map +1 -0
  94. package/dist/src/ws/response-handler.service.d.ts +53 -0
  95. package/dist/src/ws/response-handler.service.d.ts.map +1 -0
  96. package/dist/src/ws/response-handler.service.js +282 -0
  97. package/dist/src/ws/response-handler.service.js.map +1 -0
  98. package/dist/src/ws/ws.gateway.d.ts +46 -0
  99. package/dist/src/ws/ws.gateway.d.ts.map +1 -0
  100. package/dist/src/ws/ws.gateway.js +244 -0
  101. package/dist/src/ws/ws.gateway.js.map +1 -0
  102. package/dist/src/ws/ws.module.d.ts +8 -0
  103. package/dist/src/ws/ws.module.d.ts.map +1 -0
  104. package/dist/src/ws/ws.module.js +39 -0
  105. package/dist/src/ws/ws.module.js.map +1 -0
  106. package/dist/test/connection/connection.service.spec.d.ts +2 -0
  107. package/dist/test/connection/connection.service.spec.d.ts.map +1 -0
  108. package/dist/test/connection/connection.service.spec.js +204 -0
  109. package/dist/test/connection/connection.service.spec.js.map +1 -0
  110. package/dist/test/e2e/gateway-worker.e2e.spec.d.ts +2 -0
  111. package/dist/test/e2e/gateway-worker.e2e.spec.d.ts.map +1 -0
  112. package/dist/test/e2e/gateway-worker.e2e.spec.js +412 -0
  113. package/dist/test/e2e/gateway-worker.e2e.spec.js.map +1 -0
  114. package/dist/test/integration/admin-api.spec.d.ts +2 -0
  115. package/dist/test/integration/admin-api.spec.d.ts.map +1 -0
  116. package/dist/test/integration/admin-api.spec.js +218 -0
  117. package/dist/test/integration/admin-api.spec.js.map +1 -0
  118. package/dist/test/ratelimit/rate-limiter.service.spec.d.ts +2 -0
  119. package/dist/test/ratelimit/rate-limiter.service.spec.d.ts.map +1 -0
  120. package/dist/test/ratelimit/rate-limiter.service.spec.js +139 -0
  121. package/dist/test/ratelimit/rate-limiter.service.spec.js.map +1 -0
  122. package/dist/test/setup.d.ts +2 -0
  123. package/dist/test/setup.d.ts.map +1 -0
  124. package/dist/test/setup.js +56 -0
  125. package/dist/test/setup.js.map +1 -0
  126. package/dist/test/ws/message-router.service.spec.d.ts +2 -0
  127. package/dist/test/ws/message-router.service.spec.d.ts.map +1 -0
  128. package/dist/test/ws/message-router.service.spec.js +403 -0
  129. package/dist/test/ws/message-router.service.spec.js.map +1 -0
  130. package/package.json +78 -0
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * @roomkit/gateway - Gateway Server for Gateway-Worker Framework
4
+ *
5
+ * Creates a WebSocket gateway server that handles client connections
6
+ * and routes messages to workers via Redis.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { createGateway } from '@roomkit/gateway';
11
+ *
12
+ * const gateway = await createGateway({
13
+ * redis: 'redis://localhost:6379',
14
+ * ws: { port: 18080 },
15
+ * });
16
+ *
17
+ * await gateway.listen();
18
+ * ```
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
32
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.GatewayModule = void 0;
36
+ exports.createGateway = createGateway;
37
+ const core_1 = require("@nestjs/core");
38
+ const platform_ws_1 = require("@nestjs/platform-ws");
39
+ const gateway_module_1 = require("./gateway.module");
40
+ const config_service_1 = require("./config/config.service");
41
+ const gateway_config_1 = require("./config/gateway.config");
42
+ const uuid_1 = require("uuid");
43
+ /**
44
+ * Create a Gateway server instance
45
+ */
46
+ async function createGateway(config) {
47
+ // Normalize configuration
48
+ const gatewayId = config.id || `gateway-${(0, uuid_1.v4)().slice(0, 8)}`;
49
+ const redisConfig = (0, gateway_config_1.normalizeRedisConfig)(config.redis);
50
+ const wsConfig = { ...gateway_config_1.DEFAULT_WS_CONFIG, ...config.ws };
51
+ const rateLimitConfig = { ...gateway_config_1.DEFAULT_RATE_LIMIT_CONFIG, ...config.rateLimit };
52
+ const adminConfig = { ...gateway_config_1.DEFAULT_ADMIN_CONFIG, ...config.admin };
53
+ // 设置环境变量给其他服务使用(使用GW_前缀)
54
+ process.env.GW_GATEWAY_ID = gatewayId;
55
+ process.env.GW_REDIS_HOST = redisConfig.host || 'localhost';
56
+ process.env.GW_REDIS_PORT = String(redisConfig.port || 6379);
57
+ if (redisConfig.password)
58
+ process.env.GW_REDIS_PASSWORD = redisConfig.password;
59
+ process.env.GW_GATEWAY_PORT = String(wsConfig.port);
60
+ process.env.GW_GATEWAY_ADMIN_PORT = String(adminConfig.port);
61
+ process.env.GW_MAX_CONNECTIONS = String(wsConfig.maxConnections);
62
+ process.env.GW_HEARTBEAT_INTERVAL = String(wsConfig.heartbeatInterval);
63
+ process.env.GW_HEARTBEAT_TIMEOUT = String(wsConfig.heartbeatTimeout);
64
+ process.env.GW_CONNECTION_RATE_LIMIT = String(rateLimitConfig.connections);
65
+ process.env.GW_MESSAGE_RATE_LIMIT = String(rateLimitConfig.messages);
66
+ process.env.GW_MESSAGE_BURST_LIMIT = String(rateLimitConfig.burst);
67
+ process.env.GW_GLOBAL_MESSAGE_RATE_LIMIT = String(rateLimitConfig.global);
68
+ // Create NestJS application with dynamic port configuration
69
+ const app = await core_1.NestFactory.create(gateway_module_1.GatewayModule.forRoot({ wsPort: wsConfig.port }), {
70
+ logger: ['error', 'warn', 'log'],
71
+ });
72
+ // 创建WebSocket适配器
73
+ const wsAdapter = new platform_ws_1.WsAdapter(app);
74
+ app.useWebSocketAdapter(wsAdapter);
75
+ const configService = app.get(config_service_1.ConfigService);
76
+ return {
77
+ id: gatewayId,
78
+ wsPort: wsConfig.port,
79
+ adminPort: adminConfig.port,
80
+ async listen() {
81
+ if (adminConfig.enabled) {
82
+ await app.listen(adminConfig.port);
83
+ console.log(`[Gateway] Admin API started on port ${adminConfig.port}`);
84
+ }
85
+ console.log(`[Gateway] WebSocket server started on port ${wsConfig.port}, id: ${gatewayId}`);
86
+ },
87
+ async close() {
88
+ await app.close();
89
+ console.log(`[Gateway] Server stopped`);
90
+ },
91
+ };
92
+ }
93
+ // Re-export types and utilities
94
+ __exportStar(require("./config/gateway.config"), exports);
95
+ var gateway_module_2 = require("./gateway.module");
96
+ Object.defineProperty(exports, "GatewayModule", { enumerable: true, get: function () { return gateway_module_2.GatewayModule; } });
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Gateway优雅关闭服务
3
+ *
4
+ * 功能:
5
+ * 1. 标记节点为draining状态
6
+ * 2. 拒绝新连接
7
+ * 3. 等待现有连接处理完成
8
+ * 4. 清理资源
9
+ */
10
+ import { OnModuleDestroy } from '@nestjs/common';
11
+ import { RedisService } from '../redis/redis.service.js';
12
+ import { ConnectionService } from '../connection/connection.service.js';
13
+ import { ConfigService } from '../config/config.service.js';
14
+ export interface GracefulShutdownOptions {
15
+ /** 优雅关闭超时时间(毫秒) */
16
+ timeout?: number;
17
+ /** 是否强制关闭 */
18
+ force?: boolean;
19
+ }
20
+ export declare class GracefulShutdownService implements OnModuleDestroy {
21
+ private readonly redis;
22
+ private readonly connectionService;
23
+ private readonly config;
24
+ private readonly logger;
25
+ private isShuttingDown;
26
+ private shutdownPromise?;
27
+ constructor(redis: RedisService, connectionService: ConnectionService, config: ConfigService);
28
+ /**
29
+ * 检查是否正在关闭
30
+ */
31
+ get isInShutdown(): boolean;
32
+ /**
33
+ * 开始优雅关闭流程
34
+ */
35
+ startShutdown(options?: GracefulShutdownOptions): Promise<void>;
36
+ /**
37
+ * 执行关闭流程
38
+ */
39
+ private _executeShutdown;
40
+ /**
41
+ * 设置节点为draining状态
42
+ */
43
+ private setDrainingStatus;
44
+ /**
45
+ * 等待所有连接结束
46
+ */
47
+ private waitForConnectionsToFinish;
48
+ /**
49
+ * 断开所有连接
50
+ */
51
+ private disconnectAllConnections;
52
+ /**
53
+ * 清理资源
54
+ */
55
+ private cleanup;
56
+ /**
57
+ * 模块销毁时的钩子
58
+ */
59
+ onModuleDestroy(): Promise<void>;
60
+ /**
61
+ * 工具:Sleep
62
+ */
63
+ private sleep;
64
+ }
65
+ //# sourceMappingURL=graceful-shutdown.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graceful-shutdown.service.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/graceful-shutdown.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAsB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBACa,uBAAwB,YAAW,eAAe;IAM3D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IACnE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAgB;gBAGrB,KAAK,EAAE,YAAY,EACnB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,aAAa;IAGxC;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACG,aAAa,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAazE;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;YACW,0BAA0B;IAsBxC;;OAEG;YACW,wBAAwB;IAuBtC;;OAEG;YACW,OAAO;IAcrB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Gateway优雅关闭服务
4
+ *
5
+ * 功能:
6
+ * 1. 标记节点为draining状态
7
+ * 2. 拒绝新连接
8
+ * 3. 等待现有连接处理完成
9
+ * 4. 清理资源
10
+ */
11
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
12
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
13
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
14
+ 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;
15
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
16
+ };
17
+ var __metadata = (this && this.__metadata) || function (k, v) {
18
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
19
+ };
20
+ var GracefulShutdownService_1;
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.GracefulShutdownService = void 0;
23
+ const common_1 = require("@nestjs/common");
24
+ const redis_service_js_1 = require("../redis/redis.service.js");
25
+ const connection_service_js_1 = require("../connection/connection.service.js");
26
+ const config_service_js_1 = require("../config/config.service.js");
27
+ let GracefulShutdownService = GracefulShutdownService_1 = class GracefulShutdownService {
28
+ redis;
29
+ connectionService;
30
+ config;
31
+ logger = new common_1.Logger(GracefulShutdownService_1.name);
32
+ isShuttingDown = false;
33
+ shutdownPromise;
34
+ constructor(redis, connectionService, config) {
35
+ this.redis = redis;
36
+ this.connectionService = connectionService;
37
+ this.config = config;
38
+ }
39
+ /**
40
+ * 检查是否正在关闭
41
+ */
42
+ get isInShutdown() {
43
+ return this.isShuttingDown;
44
+ }
45
+ /**
46
+ * 开始优雅关闭流程
47
+ */
48
+ async startShutdown(options = {}) {
49
+ if (this.isShuttingDown) {
50
+ this.logger.warn('Shutdown already in progress');
51
+ return this.shutdownPromise;
52
+ }
53
+ this.isShuttingDown = true;
54
+ const { timeout = 60000, force = false } = options;
55
+ this.shutdownPromise = this._executeShutdown(timeout, force);
56
+ return this.shutdownPromise;
57
+ }
58
+ /**
59
+ * 执行关闭流程
60
+ */
61
+ async _executeShutdown(timeout, force) {
62
+ const gatewayId = this.config.gatewayId;
63
+ this.logger.log(`Starting graceful shutdown for gateway ${gatewayId}`);
64
+ try {
65
+ // 1. 标记为draining状态(不接受新连接)
66
+ await this.setDrainingStatus();
67
+ if (force) {
68
+ // 强制关闭:直接断开所有连接
69
+ this.logger.warn('Force shutdown requested');
70
+ await this.disconnectAllConnections();
71
+ await this.cleanup();
72
+ return;
73
+ }
74
+ // 2. 等待现有连接处理完成(带超时)
75
+ const connectionsFinished = await this.waitForConnectionsToFinish(timeout);
76
+ if (!connectionsFinished) {
77
+ const remaining = this.connectionService.getConnectionCount();
78
+ this.logger.warn(`Shutdown timeout after ${timeout}ms, ${remaining} connections remaining`);
79
+ // 超时后强制断开
80
+ await this.disconnectAllConnections();
81
+ }
82
+ // 3. 清理资源
83
+ await this.cleanup();
84
+ this.logger.log('Graceful shutdown completed');
85
+ }
86
+ catch (error) {
87
+ const err = error;
88
+ this.logger.error(`Error during graceful shutdown: ${err.message}`, err.stack);
89
+ throw error;
90
+ }
91
+ }
92
+ /**
93
+ * 设置节点为draining状态
94
+ */
95
+ async setDrainingStatus() {
96
+ const gatewayId = this.config.gatewayId;
97
+ try {
98
+ // 更新Gateway状态为draining
99
+ await this.redis.client.hset(`gw:gateway:${gatewayId}`, 'status', 'draining');
100
+ await this.redis.client.hset(`gw:gateway:${gatewayId}`, 'drainingStartedAt', Date.now().toString());
101
+ // 延长TTL,确保draining期间不会过期
102
+ await this.redis.client.expire(`gw:gateway:${gatewayId}`, 120);
103
+ this.logger.log(`Gateway ${gatewayId} marked as draining`);
104
+ }
105
+ catch (error) {
106
+ const err = error;
107
+ this.logger.error(`Failed to set draining status: ${err.message}`);
108
+ throw error;
109
+ }
110
+ }
111
+ /**
112
+ * 等待所有连接结束
113
+ */
114
+ async waitForConnectionsToFinish(timeout) {
115
+ const startTime = Date.now();
116
+ const checkInterval = 1000; // 每秒检查一次
117
+ while (this.connectionService.getConnectionCount() > 0) {
118
+ const elapsed = Date.now() - startTime;
119
+ if (elapsed >= timeout) {
120
+ return false; // 超时
121
+ }
122
+ const remainingConnections = this.connectionService.getConnectionCount();
123
+ this.logger.log(`Waiting for ${remainingConnections} connections to finish... (${Math.floor(elapsed / 1000)}s elapsed)`);
124
+ await this.sleep(checkInterval);
125
+ }
126
+ return true; // 所有连接已结束
127
+ }
128
+ /**
129
+ * 断开所有连接
130
+ */
131
+ async disconnectAllConnections() {
132
+ const connections = this.connectionService.getAllConnections();
133
+ const count = connections.size;
134
+ if (count === 0) {
135
+ this.logger.log('No connections to disconnect');
136
+ return;
137
+ }
138
+ this.logger.log(`Disconnecting ${count} connections...`);
139
+ for (const [connectionId, connection] of connections.entries()) {
140
+ try {
141
+ this.connectionService.removeConnection(connectionId, 'server_shutdown');
142
+ }
143
+ catch (error) {
144
+ const err = error;
145
+ this.logger.error(`Error disconnecting ${connectionId}: ${err.message}`);
146
+ }
147
+ }
148
+ this.logger.log(`Disconnected ${count} connections`);
149
+ }
150
+ /**
151
+ * 清理资源
152
+ */
153
+ async cleanup() {
154
+ const gatewayId = this.config.gatewayId;
155
+ try {
156
+ // 删除Gateway注册信息
157
+ await this.redis.client.del(`gw:gateway:${gatewayId}`);
158
+ this.logger.log('Cleanup completed');
159
+ }
160
+ catch (error) {
161
+ const err = error;
162
+ this.logger.error(`Error during cleanup: ${err.message}`);
163
+ }
164
+ }
165
+ /**
166
+ * 模块销毁时的钩子
167
+ */
168
+ async onModuleDestroy() {
169
+ if (!this.isShuttingDown) {
170
+ await this.startShutdown({ timeout: 30000 });
171
+ }
172
+ }
173
+ /**
174
+ * 工具:Sleep
175
+ */
176
+ sleep(ms) {
177
+ return new Promise((resolve) => setTimeout(resolve, ms));
178
+ }
179
+ };
180
+ exports.GracefulShutdownService = GracefulShutdownService;
181
+ exports.GracefulShutdownService = GracefulShutdownService = GracefulShutdownService_1 = __decorate([
182
+ (0, common_1.Injectable)(),
183
+ __metadata("design:paramtypes", [redis_service_js_1.RedisService,
184
+ connection_service_js_1.ConnectionService,
185
+ config_service_js_1.ConfigService])
186
+ ], GracefulShutdownService);
187
+ //# sourceMappingURL=graceful-shutdown.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graceful-shutdown.service.js","sourceRoot":"","sources":["../../../src/lifecycle/graceful-shutdown.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './graceful-shutdown.service';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./graceful-shutdown.service"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lifecycle/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dotenv_1 = require("dotenv");
4
+ const path_1 = require("path");
5
+ // 加载根目录的 .env 文件(优先使用 process.cwd(),兼容开发和生产环境)
6
+ // 开发时从 packages/gateway 运行,路径是 ../../.env
7
+ // 生产时从项目根目录运行,路径是 .env
8
+ const envPaths = [
9
+ (0, path_1.resolve)(process.cwd(), '.env'), // 从根目录运行
10
+ (0, path_1.resolve)(process.cwd(), '../../.env'), // 从 packages/gateway 运行
11
+ (0, path_1.resolve)(__dirname, '../../../.env'), // 编译后相对路径
12
+ (0, path_1.resolve)(__dirname, '../../../../.env'), // 编译后备用路径
13
+ ];
14
+ for (const envPath of envPaths) {
15
+ const result = (0, dotenv_1.config)({ path: envPath });
16
+ if (!result.error) {
17
+ console.log(`[Gateway] Loaded env from: ${envPath}`);
18
+ break;
19
+ }
20
+ }
21
+ const core_1 = require("@nestjs/core");
22
+ const platform_ws_1 = require("@nestjs/platform-ws");
23
+ const gateway_module_1 = require("./gateway.module");
24
+ const config_service_1 = require("./config/config.service");
25
+ const graceful_shutdown_service_1 = require("./lifecycle/graceful-shutdown.service");
26
+ async function bootstrap() {
27
+ // 获取WebSocket端口配置
28
+ const wsPort = parseInt(process.env.GW_GATEWAY_PORT || '18080', 10);
29
+ // 创建主应用(WebSocket 服务)
30
+ const app = await core_1.NestFactory.create(gateway_module_1.GatewayModule.forRoot({ wsPort }));
31
+ // 使用 WS 适配器
32
+ app.useWebSocketAdapter(new platform_ws_1.WsAdapter(app));
33
+ const configService = app.get(config_service_1.ConfigService);
34
+ const shutdownService = app.get(graceful_shutdown_service_1.GracefulShutdownService);
35
+ const port = configService.port;
36
+ const adminPort = configService.adminPort;
37
+ // 启动主应用(WebSocket + HTTP Admin API)
38
+ await app.listen(adminPort);
39
+ console.log(`[Gateway] Admin API started on port ${adminPort}`);
40
+ console.log(`[Gateway] WebSocket server started on port ${port}, id: ${configService.gatewayId}`);
41
+ // 优雅关闭
42
+ process.on('SIGINT', async () => {
43
+ console.log('[Gateway] Received SIGINT, starting graceful shutdown...');
44
+ await shutdownService.startShutdown({ timeout: 60000 });
45
+ await app.close();
46
+ process.exit(0);
47
+ });
48
+ process.on('SIGTERM', async () => {
49
+ console.log('[Gateway] Received SIGTERM, starting graceful shutdown...');
50
+ await shutdownService.startShutdown({ timeout: 60000 });
51
+ await app.close();
52
+ process.exit(0);
53
+ });
54
+ }
55
+ bootstrap();
56
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;AAAA,mCAAgC;AAChC,+BAA+B;AAE/B,+CAA+C;AAC/C,0CAA0C;AAC1C,uBAAuB;AACvB,MAAM,QAAQ,GAAG;IACf,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAY,SAAS;IACnD,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAM,wBAAwB;IAClE,IAAA,cAAO,EAAC,SAAS,EAAE,eAAe,CAAC,EAAO,UAAU;IACpD,IAAA,cAAO,EAAC,SAAS,EAAE,kBAAkB,CAAC,EAAI,UAAU;CACrD,CAAC;AAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAA,eAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;QACrD,MAAM;IACR,CAAC;AACH,CAAC;AAED,uCAA2C;AAC3C,qDAAgD;AAChD,qDAAiD;AACjD,4DAAwD;AACxD,qFAAgF;AAEhF,KAAK,UAAU,SAAS;IACtB,kBAAkB;IAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAEpE,sBAAsB;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,8BAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAExE,YAAY;IACZ,GAAG,CAAC,mBAAmB,CAAC,IAAI,uBAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5C,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,GAAG,CAAC,GAAG,CAAC,mDAAuB,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;IAChC,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;IAE1C,oCAAoC;IACpC,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,8CAA8C,IAAI,SAAS,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;IAElG,OAAO;IACP,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,MAAM,eAAe,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,MAAM,eAAe,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { MetricsService } from './metrics.service';
2
+ /**
3
+ * Prometheus 指标端点
4
+ */
5
+ export declare class MetricsController {
6
+ private readonly metricsService;
7
+ constructor(metricsService: MetricsService);
8
+ /**
9
+ * GET /metrics - Prometheus 抓取端点
10
+ */
11
+ getMetrics(): Promise<string>;
12
+ }
13
+ //# sourceMappingURL=metrics.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.controller.d.ts","sourceRoot":"","sources":["../../../src/metrics/metrics.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,qBACa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAE3D;;OAEG;IAGG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAGpC"}
@@ -0,0 +1,42 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MetricsController = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const metrics_service_1 = require("./metrics.service");
15
+ /**
16
+ * Prometheus 指标端点
17
+ */
18
+ let MetricsController = class MetricsController {
19
+ metricsService;
20
+ constructor(metricsService) {
21
+ this.metricsService = metricsService;
22
+ }
23
+ /**
24
+ * GET /metrics - Prometheus 抓取端点
25
+ */
26
+ async getMetrics() {
27
+ return this.metricsService.getMetrics();
28
+ }
29
+ };
30
+ exports.MetricsController = MetricsController;
31
+ __decorate([
32
+ (0, common_1.Get)(),
33
+ (0, common_1.Header)('Cache-Control', 'no-store'),
34
+ __metadata("design:type", Function),
35
+ __metadata("design:paramtypes", []),
36
+ __metadata("design:returntype", Promise)
37
+ ], MetricsController.prototype, "getMetrics", null);
38
+ exports.MetricsController = MetricsController = __decorate([
39
+ (0, common_1.Controller)('metrics'),
40
+ __metadata("design:paramtypes", [metrics_service_1.MetricsService])
41
+ ], MetricsController);
42
+ //# sourceMappingURL=metrics.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.controller.js","sourceRoot":"","sources":["../../../src/metrics/metrics.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyD;AACzD,uDAAmD;AAEnD;;GAEG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACC;IAA7B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE/D;;OAEG;IAGG,AAAN,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;IAC1C,CAAC;CACF,CAAA;AAXY,8CAAiB;AAQtB;IAFL,IAAA,YAAG,GAAE;IACL,IAAA,eAAM,EAAC,eAAe,EAAE,UAAU,CAAC;;;;mDAGnC;4BAVU,iBAAiB;IAD7B,IAAA,mBAAU,EAAC,SAAS,CAAC;qCAEyB,gCAAc;GADhD,iBAAiB,CAW7B"}
@@ -0,0 +1,3 @@
1
+ export declare class MetricsModule {
2
+ }
3
+ //# sourceMappingURL=metrics.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.module.d.ts","sourceRoot":"","sources":["../../../src/metrics/metrics.module.ts"],"names":[],"mappings":"AAKA,qBAOa,aAAa;CAAG"}
@@ -0,0 +1,26 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MetricsModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const metrics_service_1 = require("./metrics.service");
12
+ const metrics_controller_1 = require("./metrics.controller");
13
+ const config_module_1 = require("../config/config.module");
14
+ let MetricsModule = class MetricsModule {
15
+ };
16
+ exports.MetricsModule = MetricsModule;
17
+ exports.MetricsModule = MetricsModule = __decorate([
18
+ (0, common_1.Global)(),
19
+ (0, common_1.Module)({
20
+ imports: [config_module_1.ConfigModule],
21
+ controllers: [metrics_controller_1.MetricsController],
22
+ providers: [metrics_service_1.MetricsService],
23
+ exports: [metrics_service_1.MetricsService],
24
+ })
25
+ ], MetricsModule);
26
+ //# sourceMappingURL=metrics.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.module.js","sourceRoot":"","sources":["../../../src/metrics/metrics.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,uDAAmD;AACnD,6DAAyD;AACzD,2DAAuD;AAShD,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IAPzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC;QACvB,WAAW,EAAE,CAAC,sCAAiB,CAAC;QAChC,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,aAAa,CAAG"}