@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,196 @@
1
+ import { ConfigService } from '../config/config.service';
2
+ import { ConnectionService } from '../connection/connection.service';
3
+ import { RedisService } from '../redis/redis.service';
4
+ import { RateLimiterService } from '../ratelimit/rate-limiter.service';
5
+ /**
6
+ * Gateway Admin 服务
7
+ * 提供管理功能的业务逻辑
8
+ */
9
+ export declare class AdminService {
10
+ private readonly configService;
11
+ private readonly connectionService;
12
+ private readonly redisService;
13
+ private readonly rateLimiterService;
14
+ private readonly logger;
15
+ private readonly startTime;
16
+ constructor(configService: ConfigService, connectionService: ConnectionService, redisService: RedisService, rateLimiterService: RateLimiterService);
17
+ /**
18
+ * 健康检查
19
+ */
20
+ getHealth(): {
21
+ status: string;
22
+ timestamp: number;
23
+ gatewayId: string;
24
+ };
25
+ /**
26
+ * 获取系统状态
27
+ */
28
+ getStatus(): {
29
+ gatewayId: string;
30
+ uptime: number;
31
+ uptimeFormatted: string;
32
+ connections: {
33
+ total: number;
34
+ authenticated: number;
35
+ anonymous: number;
36
+ max: number;
37
+ utilization: number;
38
+ };
39
+ config: {
40
+ port: number;
41
+ heartbeatInterval: number;
42
+ heartbeatTimeout: number;
43
+ maxConnections: number;
44
+ };
45
+ rateLimit: {
46
+ connectionRate: number;
47
+ globalMessageRate: number;
48
+ trackedConnections: number;
49
+ };
50
+ memory: {
51
+ heapUsed: number;
52
+ heapTotal: number;
53
+ rss: number;
54
+ external: number;
55
+ unit: string;
56
+ };
57
+ timestamp: number;
58
+ };
59
+ /**
60
+ * 获取所有连接信息
61
+ */
62
+ getConnections(): {
63
+ count: number;
64
+ connections: {
65
+ id: string;
66
+ userId?: string;
67
+ status: string;
68
+ currentRoom?: string;
69
+ rooms?: string[];
70
+ lastActivity: number;
71
+ createdAt: number;
72
+ age: number;
73
+ }[];
74
+ };
75
+ /**
76
+ * 获取单个连接详情
77
+ */
78
+ getConnection(connectionId: string): {
79
+ id: string;
80
+ userId: string | undefined;
81
+ status: import("@roomkit/core").ConnectionStatus;
82
+ currentRoom: string | undefined;
83
+ lastActivity: number;
84
+ createdAt: number;
85
+ age: number;
86
+ idleDuration: number;
87
+ };
88
+ /**
89
+ * 强制断开连接
90
+ */
91
+ disconnectConnection(connectionId: string, reason?: string): {
92
+ success: boolean;
93
+ connectionId: string;
94
+ reason: string;
95
+ };
96
+ /**
97
+ * 获取限流统计
98
+ */
99
+ getRateLimitStats(): {
100
+ config: {
101
+ connectionRateLimit: number;
102
+ messageRateLimitPerConnection: number;
103
+ messageBurstLimit: number;
104
+ globalMessageRateLimit: number;
105
+ };
106
+ connectionRate: number;
107
+ globalMessageRate: number;
108
+ trackedConnections: number;
109
+ };
110
+ /**
111
+ * 获取 Redis 连接状态
112
+ */
113
+ getRedisStatus(): {
114
+ connected: boolean;
115
+ status: "connect" | "wait" | "reconnecting" | "connecting" | "ready" | "close" | "end";
116
+ host: string;
117
+ port: number;
118
+ };
119
+ /**
120
+ * 获取按用户分组的连接
121
+ */
122
+ getUsers(): {
123
+ count: number;
124
+ users: {
125
+ userId: string;
126
+ connectionCount: number;
127
+ connectionIds: string[];
128
+ }[];
129
+ };
130
+ /**
131
+ * 获取指定用户的连接
132
+ */
133
+ getUser(userId: string): {
134
+ userId: string;
135
+ connectionId: string;
136
+ status: import("@roomkit/core").ConnectionStatus;
137
+ currentRoom: string | undefined;
138
+ lastActivity: number;
139
+ createdAt: number;
140
+ };
141
+ /**
142
+ * 强制用户下线
143
+ */
144
+ kickUser(userId: string, reason?: string): {
145
+ success: boolean;
146
+ userId: string;
147
+ connectionId: string;
148
+ reason: string;
149
+ };
150
+ /**
151
+ * 广播系统消息
152
+ */
153
+ broadcast(msgId: number, payload: unknown): {
154
+ success: boolean;
155
+ msgId: number;
156
+ sent: number;
157
+ failed: number;
158
+ total: number;
159
+ };
160
+ /**
161
+ * 获取指标数据
162
+ */
163
+ getMetrics(): {
164
+ timestamp: number;
165
+ gateway: {
166
+ id: string;
167
+ uptime: number;
168
+ };
169
+ connections: {
170
+ total: number;
171
+ authenticated: number;
172
+ anonymous: number;
173
+ };
174
+ rateLimit: {
175
+ connectionRate: number;
176
+ globalMessageRate: number;
177
+ trackedConnections: number;
178
+ };
179
+ memory: {
180
+ heapUsed: number;
181
+ heapTotal: number;
182
+ rss: number;
183
+ external: number;
184
+ unit: string;
185
+ };
186
+ };
187
+ /**
188
+ * 格式化运行时间
189
+ */
190
+ private formatUptime;
191
+ /**
192
+ * 获取内存使用情况
193
+ */
194
+ private getMemoryUsage;
195
+ }
196
+ //# sourceMappingURL=admin.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.service.d.ts","sourceRoot":"","sources":["../../../src/admin/admin.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGvE;;;GAGG;AACH,qBACa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAPrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAGrB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB;IAGzD;;OAEG;IACH,SAAS;;;;;IAQT;;OAEG;IACH,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4BT;;OAEG;IACH,cAAc;;;gBAGN,MAAM;qBACD,MAAM;oBACP,MAAM;0BACA,MAAM;oBACZ,MAAM,EAAE;0BACF,MAAM;uBACT,MAAM;iBACZ,MAAM;;;IAsBf;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;IAkBlC;;OAEG;IACH,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;IAgB1D;;OAEG;IACH,iBAAiB;;;;;;;;;;;IAajB;;OAEG;IACH,cAAc;;;;;;IAUd;;OAEG;IACH,QAAQ;;;oBAYuB,MAAM;6BAAmB,MAAM;2BAAiB,MAAM,EAAE;;;IAevF;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM;;;;;;;;IAqBtB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;IAwBxC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;;;;;;;IAyBzC;;OAEG;IACH,UAAU;;;;;;;;;;;;;;;;;;;;;;;;IAsBV;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,cAAc;CAUvB"}
@@ -0,0 +1,322 @@
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 AdminService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdminService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_service_1 = require("../config/config.service");
16
+ const connection_service_1 = require("../connection/connection.service");
17
+ const redis_service_1 = require("../redis/redis.service");
18
+ const rate_limiter_service_1 = require("../ratelimit/rate-limiter.service");
19
+ const core_1 = require("@roomkit/core");
20
+ /**
21
+ * Gateway Admin 服务
22
+ * 提供管理功能的业务逻辑
23
+ */
24
+ let AdminService = AdminService_1 = class AdminService {
25
+ configService;
26
+ connectionService;
27
+ redisService;
28
+ rateLimiterService;
29
+ logger = new common_1.Logger(AdminService_1.name);
30
+ startTime = Date.now();
31
+ constructor(configService, connectionService, redisService, rateLimiterService) {
32
+ this.configService = configService;
33
+ this.connectionService = connectionService;
34
+ this.redisService = redisService;
35
+ this.rateLimiterService = rateLimiterService;
36
+ }
37
+ /**
38
+ * 健康检查
39
+ */
40
+ getHealth() {
41
+ return {
42
+ status: 'ok',
43
+ timestamp: Date.now(),
44
+ gatewayId: this.configService.gatewayId,
45
+ };
46
+ }
47
+ /**
48
+ * 获取系统状态
49
+ */
50
+ getStatus() {
51
+ const uptime = Date.now() - this.startTime;
52
+ const connections = this.connectionService.getConnectionCount();
53
+ const authenticatedConnections = this.connectionService.getAuthenticatedCount();
54
+ return {
55
+ gatewayId: this.configService.gatewayId,
56
+ uptime,
57
+ uptimeFormatted: this.formatUptime(uptime),
58
+ connections: {
59
+ total: connections,
60
+ authenticated: authenticatedConnections,
61
+ anonymous: connections - authenticatedConnections,
62
+ max: this.configService.maxConnections,
63
+ utilization: connections / this.configService.maxConnections,
64
+ },
65
+ config: {
66
+ port: this.configService.port,
67
+ heartbeatInterval: this.configService.heartbeatInterval,
68
+ heartbeatTimeout: this.configService.heartbeatTimeout,
69
+ maxConnections: this.configService.maxConnections,
70
+ },
71
+ rateLimit: this.rateLimiterService.getStats(),
72
+ memory: this.getMemoryUsage(),
73
+ timestamp: Date.now(),
74
+ };
75
+ }
76
+ /**
77
+ * 获取所有连接信息
78
+ */
79
+ getConnections() {
80
+ const connections = this.connectionService.getAllConnections();
81
+ const result = [];
82
+ for (const [id, conn] of connections) {
83
+ result.push({
84
+ id,
85
+ userId: conn.userId,
86
+ status: conn.status,
87
+ currentRoom: conn.currentRoom,
88
+ rooms: conn.rooms ? [...conn.rooms] : [],
89
+ lastActivity: conn.lastActivity,
90
+ createdAt: conn.createdAt,
91
+ age: Date.now() - conn.createdAt,
92
+ });
93
+ }
94
+ return {
95
+ count: result.length,
96
+ connections: result,
97
+ };
98
+ }
99
+ /**
100
+ * 获取单个连接详情
101
+ */
102
+ getConnection(connectionId) {
103
+ const connection = this.connectionService.getConnection(connectionId);
104
+ if (!connection) {
105
+ throw new common_1.NotFoundException(`Connection ${connectionId} not found`);
106
+ }
107
+ return {
108
+ id: connection.id,
109
+ userId: connection.userId,
110
+ status: connection.status,
111
+ currentRoom: connection.currentRoom,
112
+ lastActivity: connection.lastActivity,
113
+ createdAt: connection.createdAt,
114
+ age: Date.now() - connection.createdAt,
115
+ idleDuration: Date.now() - connection.lastActivity,
116
+ };
117
+ }
118
+ /**
119
+ * 强制断开连接
120
+ */
121
+ disconnectConnection(connectionId, reason) {
122
+ const connection = this.connectionService.getConnection(connectionId);
123
+ if (!connection) {
124
+ throw new common_1.NotFoundException(`Connection ${connectionId} not found`);
125
+ }
126
+ this.connectionService.removeConnection(connectionId, reason || 'admin_disconnect');
127
+ this.logger.log(`Admin disconnected connection: ${connectionId}, reason: ${reason || 'admin_disconnect'}`);
128
+ return {
129
+ success: true,
130
+ connectionId,
131
+ reason: reason || 'admin_disconnect',
132
+ };
133
+ }
134
+ /**
135
+ * 获取限流统计
136
+ */
137
+ getRateLimitStats() {
138
+ const stats = this.rateLimiterService.getStats();
139
+ return {
140
+ ...stats,
141
+ config: {
142
+ connectionRateLimit: this.configService.connectionRateLimit,
143
+ messageRateLimitPerConnection: this.configService.messageRateLimitPerConnection,
144
+ messageBurstLimit: this.configService.messageBurstLimit,
145
+ globalMessageRateLimit: this.configService.globalMessageRateLimit,
146
+ },
147
+ };
148
+ }
149
+ /**
150
+ * 获取 Redis 连接状态
151
+ */
152
+ getRedisStatus() {
153
+ const client = this.redisService.client;
154
+ return {
155
+ connected: client?.status === 'ready',
156
+ status: client?.status || 'unknown',
157
+ host: this.configService.redisHost,
158
+ port: this.configService.redisPort,
159
+ };
160
+ }
161
+ /**
162
+ * 获取按用户分组的连接
163
+ */
164
+ getUsers() {
165
+ const connections = this.connectionService.getAllConnections();
166
+ const userMap = new Map();
167
+ for (const [id, conn] of connections) {
168
+ if (conn.userId) {
169
+ const userConns = userMap.get(conn.userId) || [];
170
+ userConns.push(id);
171
+ userMap.set(conn.userId, userConns);
172
+ }
173
+ }
174
+ const users = [];
175
+ for (const [userId, connectionIds] of userMap) {
176
+ users.push({
177
+ userId,
178
+ connectionCount: connectionIds.length,
179
+ connectionIds,
180
+ });
181
+ }
182
+ return {
183
+ count: users.length,
184
+ users,
185
+ };
186
+ }
187
+ /**
188
+ * 获取指定用户的连接
189
+ */
190
+ getUser(userId) {
191
+ const connectionId = this.connectionService.getConnectionIdByUserId(userId);
192
+ if (!connectionId) {
193
+ throw new common_1.NotFoundException(`User ${userId} not found`);
194
+ }
195
+ const connection = this.connectionService.getConnection(connectionId);
196
+ if (!connection) {
197
+ throw new common_1.NotFoundException(`Connection for user ${userId} not found`);
198
+ }
199
+ return {
200
+ userId,
201
+ connectionId,
202
+ status: connection.status,
203
+ currentRoom: connection.currentRoom,
204
+ lastActivity: connection.lastActivity,
205
+ createdAt: connection.createdAt,
206
+ };
207
+ }
208
+ /**
209
+ * 强制用户下线
210
+ */
211
+ kickUser(userId, reason) {
212
+ const connectionId = this.connectionService.getConnectionIdByUserId(userId);
213
+ if (!connectionId) {
214
+ throw new common_1.NotFoundException(`User ${userId} not found`);
215
+ }
216
+ // 先发送踢出消息
217
+ this.connectionService.sendByType(connectionId, core_1.MessageType.KICK_NOTIFY, {
218
+ error: 'KICKED',
219
+ reason: reason || 'admin_kick',
220
+ });
221
+ // 然后断开连接
222
+ this.connectionService.removeConnection(connectionId, reason || 'admin_kick');
223
+ this.logger.log(`Admin kicked user: ${userId}, reason: ${reason || 'admin_kick'}`);
224
+ return {
225
+ success: true,
226
+ userId,
227
+ connectionId,
228
+ reason: reason || 'admin_kick',
229
+ };
230
+ }
231
+ /**
232
+ * 广播系统消息
233
+ */
234
+ broadcast(msgId, payload) {
235
+ const connections = this.connectionService.getAllConnections();
236
+ let successCount = 0;
237
+ let failCount = 0;
238
+ for (const [id] of connections) {
239
+ const success = this.connectionService.send(id, msgId, payload);
240
+ if (success) {
241
+ successCount++;
242
+ }
243
+ else {
244
+ failCount++;
245
+ }
246
+ }
247
+ this.logger.log(`Admin broadcast: msgId=${msgId}, success=${successCount}, fail=${failCount}`);
248
+ return {
249
+ success: true,
250
+ msgId,
251
+ sent: successCount,
252
+ failed: failCount,
253
+ total: connections.size,
254
+ };
255
+ }
256
+ /**
257
+ * 获取指标数据
258
+ */
259
+ getMetrics() {
260
+ const connections = this.connectionService.getConnectionCount();
261
+ const authenticated = this.connectionService.getAuthenticatedCount();
262
+ const rateLimitStats = this.rateLimiterService.getStats();
263
+ const memory = this.getMemoryUsage();
264
+ return {
265
+ timestamp: Date.now(),
266
+ gateway: {
267
+ id: this.configService.gatewayId,
268
+ uptime: Date.now() - this.startTime,
269
+ },
270
+ connections: {
271
+ total: connections,
272
+ authenticated,
273
+ anonymous: connections - authenticated,
274
+ },
275
+ rateLimit: rateLimitStats,
276
+ memory,
277
+ };
278
+ }
279
+ /**
280
+ * 格式化运行时间
281
+ */
282
+ formatUptime(ms) {
283
+ const seconds = Math.floor(ms / 1000);
284
+ const minutes = Math.floor(seconds / 60);
285
+ const hours = Math.floor(minutes / 60);
286
+ const days = Math.floor(hours / 24);
287
+ if (days > 0) {
288
+ return `${days}d ${hours % 24}h ${minutes % 60}m`;
289
+ }
290
+ else if (hours > 0) {
291
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
292
+ }
293
+ else if (minutes > 0) {
294
+ return `${minutes}m ${seconds % 60}s`;
295
+ }
296
+ else {
297
+ return `${seconds}s`;
298
+ }
299
+ }
300
+ /**
301
+ * 获取内存使用情况
302
+ */
303
+ getMemoryUsage() {
304
+ const used = process.memoryUsage();
305
+ return {
306
+ heapUsed: Math.round(used.heapUsed / 1024 / 1024 * 100) / 100,
307
+ heapTotal: Math.round(used.heapTotal / 1024 / 1024 * 100) / 100,
308
+ rss: Math.round(used.rss / 1024 / 1024 * 100) / 100,
309
+ external: Math.round(used.external / 1024 / 1024 * 100) / 100,
310
+ unit: 'MB',
311
+ };
312
+ }
313
+ };
314
+ exports.AdminService = AdminService;
315
+ exports.AdminService = AdminService = AdminService_1 = __decorate([
316
+ (0, common_1.Injectable)(),
317
+ __metadata("design:paramtypes", [config_service_1.ConfigService,
318
+ connection_service_1.ConnectionService,
319
+ redis_service_1.RedisService,
320
+ rate_limiter_service_1.RateLimiterService])
321
+ ], AdminService);
322
+ //# sourceMappingURL=admin.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.service.js","sourceRoot":"","sources":["../../../src/admin/admin.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class ConfigModule {
2
+ }
3
+ //# sourceMappingURL=config.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.module.d.ts","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":"AAGA,qBAKa,YAAY;CAAG"}
@@ -0,0 +1,22 @@
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.ConfigModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_service_1 = require("./config.service");
12
+ let ConfigModule = class ConfigModule {
13
+ };
14
+ exports.ConfigModule = ConfigModule;
15
+ exports.ConfigModule = ConfigModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [config_service_1.ConfigService],
19
+ exports: [config_service_1.ConfigService],
20
+ })
21
+ ], ConfigModule);
22
+ //# sourceMappingURL=config.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,qDAAiD;AAO1C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,19 @@
1
+ export declare class ConfigService {
2
+ readonly gatewayId: string;
3
+ readonly port: number;
4
+ readonly adminPort: number;
5
+ readonly redisHost: string;
6
+ readonly redisPort: number;
7
+ readonly redisPassword?: string;
8
+ readonly heartbeatInterval: number;
9
+ readonly heartbeatTimeout: number;
10
+ readonly maxConnections: number;
11
+ /** 空闲连接超时(认证后未加入房间的超时时间,默认60秒) */
12
+ readonly idleConnectionTimeout: number;
13
+ readonly connectionRateLimit: number;
14
+ readonly messageRateLimitPerConnection: number;
15
+ readonly messageBurstLimit: number;
16
+ readonly globalMessageRateLimit: number;
17
+ constructor();
18
+ }
19
+ //# sourceMappingURL=config.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"AAGA,qBACa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,kCAAkC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAGvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;;CAoBzC"}
@@ -0,0 +1,55 @@
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.ConfigService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const uuid_1 = require("uuid");
15
+ let ConfigService = class ConfigService {
16
+ gatewayId;
17
+ port;
18
+ adminPort;
19
+ redisHost;
20
+ redisPort;
21
+ redisPassword;
22
+ heartbeatInterval;
23
+ heartbeatTimeout;
24
+ maxConnections;
25
+ /** 空闲连接超时(认证后未加入房间的超时时间,默认60秒) */
26
+ idleConnectionTimeout;
27
+ // 限流配置
28
+ connectionRateLimit;
29
+ messageRateLimitPerConnection;
30
+ messageBurstLimit;
31
+ globalMessageRateLimit;
32
+ constructor() {
33
+ this.gatewayId = process.env.GW_GATEWAY_ID || `gateway-${(0, uuid_1.v4)().substring(0, 8)}`;
34
+ this.port = parseInt(process.env.GW_GATEWAY_PORT || '27100', 10);
35
+ this.adminPort = parseInt(process.env.GW_GATEWAY_ADMIN_PORT || '27200', 10);
36
+ this.redisHost = process.env.GW_REDIS_HOST || 'localhost';
37
+ this.redisPort = parseInt(process.env.GW_REDIS_PORT || '6379', 10);
38
+ this.redisPassword = process.env.GW_REDIS_PASSWORD;
39
+ this.heartbeatInterval = parseInt(process.env.GW_HEARTBEAT_INTERVAL || '30000', 10);
40
+ this.heartbeatTimeout = parseInt(process.env.GW_HEARTBEAT_TIMEOUT || '90000', 10);
41
+ this.maxConnections = parseInt(process.env.GW_MAX_CONNECTIONS || '10000', 10);
42
+ this.idleConnectionTimeout = parseInt(process.env.GW_IDLE_CONNECTION_TIMEOUT || '60000', 10);
43
+ // 限流配置
44
+ this.connectionRateLimit = parseInt(process.env.GW_CONNECTION_RATE_LIMIT || '100', 10);
45
+ this.messageRateLimitPerConnection = parseInt(process.env.GW_MESSAGE_RATE_LIMIT || '50', 10);
46
+ this.messageBurstLimit = parseInt(process.env.GW_MESSAGE_BURST_LIMIT || '100', 10);
47
+ this.globalMessageRateLimit = parseInt(process.env.GW_GLOBAL_MESSAGE_RATE_LIMIT || '50000', 10);
48
+ }
49
+ };
50
+ exports.ConfigService = ConfigService;
51
+ exports.ConfigService = ConfigService = __decorate([
52
+ (0, common_1.Injectable)(),
53
+ __metadata("design:paramtypes", [])
54
+ ], ConfigService);
55
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+BAAkC;AAG3B,IAAM,aAAa,GAAnB,MAAM,aAAa;IACf,SAAS,CAAS;IAClB,IAAI,CAAS;IACb,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,aAAa,CAAU;IACvB,iBAAiB,CAAS;IAC1B,gBAAgB,CAAS;IACzB,cAAc,CAAS;IAEhC,kCAAkC;IACzB,qBAAqB,CAAS;IAEvC,OAAO;IACE,mBAAmB,CAAS;IAC5B,6BAA6B,CAAS;IACtC,iBAAiB,CAAS;IAC1B,sBAAsB,CAAS;IAExC;QACE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,IAAA,SAAI,GAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAE7F,OAAO;QACP,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,6BAA6B,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAClG,CAAC;CACF,CAAA;AAtCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CAsCzB"}