@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.
- package/README.md +93 -0
- package/dist/src/admin/admin.controller.d.ts +187 -0
- package/dist/src/admin/admin.controller.d.ts.map +1 -0
- package/dist/src/admin/admin.controller.js +187 -0
- package/dist/src/admin/admin.controller.js.map +1 -0
- package/dist/src/admin/admin.module.d.ts +3 -0
- package/dist/src/admin/admin.module.d.ts.map +1 -0
- package/dist/src/admin/admin.module.js +28 -0
- package/dist/src/admin/admin.module.js.map +1 -0
- package/dist/src/admin/admin.service.d.ts +196 -0
- package/dist/src/admin/admin.service.d.ts.map +1 -0
- package/dist/src/admin/admin.service.js +322 -0
- package/dist/src/admin/admin.service.js.map +1 -0
- package/dist/src/config/config.module.d.ts +3 -0
- package/dist/src/config/config.module.d.ts.map +1 -0
- package/dist/src/config/config.module.js +22 -0
- package/dist/src/config/config.module.js.map +1 -0
- package/dist/src/config/config.service.d.ts +19 -0
- package/dist/src/config/config.service.d.ts.map +1 -0
- package/dist/src/config/config.service.js +55 -0
- package/dist/src/config/config.service.js.map +1 -0
- package/dist/src/config/gateway.config.d.ts +64 -0
- package/dist/src/config/gateway.config.d.ts.map +1 -0
- package/dist/src/config/gateway.config.js +43 -0
- package/dist/src/config/gateway.config.js.map +1 -0
- package/dist/src/connection/connection.module.d.ts +3 -0
- package/dist/src/connection/connection.module.d.ts.map +1 -0
- package/dist/src/connection/connection.module.js +22 -0
- package/dist/src/connection/connection.module.js.map +1 -0
- package/dist/src/connection/connection.service.d.ts +93 -0
- package/dist/src/connection/connection.service.d.ts.map +1 -0
- package/dist/src/connection/connection.service.js +257 -0
- package/dist/src/connection/connection.service.js.map +1 -0
- package/dist/src/gateway.module.d.ts +8 -0
- package/dist/src/gateway.module.d.ts.map +1 -0
- package/dist/src/gateway.module.js +44 -0
- package/dist/src/gateway.module.js.map +1 -0
- package/dist/src/index.d.ts +38 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +97 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lifecycle/graceful-shutdown.service.d.ts +65 -0
- package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -0
- package/dist/src/lifecycle/graceful-shutdown.service.js +187 -0
- package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -0
- package/dist/src/lifecycle/index.d.ts +2 -0
- package/dist/src/lifecycle/index.d.ts.map +1 -0
- package/dist/src/lifecycle/index.js +18 -0
- package/dist/src/lifecycle/index.js.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +56 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/metrics/metrics.controller.d.ts +13 -0
- package/dist/src/metrics/metrics.controller.d.ts.map +1 -0
- package/dist/src/metrics/metrics.controller.js +42 -0
- package/dist/src/metrics/metrics.controller.js.map +1 -0
- package/dist/src/metrics/metrics.module.d.ts +3 -0
- package/dist/src/metrics/metrics.module.d.ts.map +1 -0
- package/dist/src/metrics/metrics.module.js +26 -0
- package/dist/src/metrics/metrics.module.js.map +1 -0
- package/dist/src/metrics/metrics.service.d.ts +81 -0
- package/dist/src/metrics/metrics.service.d.ts.map +1 -0
- package/dist/src/metrics/metrics.service.js +255 -0
- package/dist/src/metrics/metrics.service.js.map +1 -0
- package/dist/src/ratelimit/rate-limit.module.d.ts +3 -0
- package/dist/src/ratelimit/rate-limit.module.d.ts.map +1 -0
- package/dist/src/ratelimit/rate-limit.module.js +23 -0
- package/dist/src/ratelimit/rate-limit.module.js.map +1 -0
- package/dist/src/ratelimit/rate-limiter.service.d.ts +68 -0
- package/dist/src/ratelimit/rate-limiter.service.d.ts.map +1 -0
- package/dist/src/ratelimit/rate-limiter.service.js +201 -0
- package/dist/src/ratelimit/rate-limiter.service.js.map +1 -0
- package/dist/src/redis/redis.module.d.ts +3 -0
- package/dist/src/redis/redis.module.d.ts.map +1 -0
- package/dist/src/redis/redis.module.js +22 -0
- package/dist/src/redis/redis.module.js.map +1 -0
- package/dist/src/redis/redis.service.d.ts +68 -0
- package/dist/src/redis/redis.service.d.ts.map +1 -0
- package/dist/src/redis/redis.service.js +281 -0
- package/dist/src/redis/redis.service.js.map +1 -0
- package/dist/src/session/session.module.d.ts +3 -0
- package/dist/src/session/session.module.d.ts.map +1 -0
- package/dist/src/session/session.module.js +21 -0
- package/dist/src/session/session.module.js.map +1 -0
- package/dist/src/session/session.service.d.ts +64 -0
- package/dist/src/session/session.service.d.ts.map +1 -0
- package/dist/src/session/session.service.js +206 -0
- package/dist/src/session/session.service.js.map +1 -0
- package/dist/src/ws/message-router.service.d.ts +133 -0
- package/dist/src/ws/message-router.service.d.ts.map +1 -0
- package/dist/src/ws/message-router.service.js +715 -0
- package/dist/src/ws/message-router.service.js.map +1 -0
- package/dist/src/ws/response-handler.service.d.ts +53 -0
- package/dist/src/ws/response-handler.service.d.ts.map +1 -0
- package/dist/src/ws/response-handler.service.js +282 -0
- package/dist/src/ws/response-handler.service.js.map +1 -0
- package/dist/src/ws/ws.gateway.d.ts +46 -0
- package/dist/src/ws/ws.gateway.d.ts.map +1 -0
- package/dist/src/ws/ws.gateway.js +244 -0
- package/dist/src/ws/ws.gateway.js.map +1 -0
- package/dist/src/ws/ws.module.d.ts +8 -0
- package/dist/src/ws/ws.module.d.ts.map +1 -0
- package/dist/src/ws/ws.module.js +39 -0
- package/dist/src/ws/ws.module.js.map +1 -0
- package/dist/test/connection/connection.service.spec.d.ts +2 -0
- package/dist/test/connection/connection.service.spec.d.ts.map +1 -0
- package/dist/test/connection/connection.service.spec.js +204 -0
- package/dist/test/connection/connection.service.spec.js.map +1 -0
- package/dist/test/e2e/gateway-worker.e2e.spec.d.ts +2 -0
- package/dist/test/e2e/gateway-worker.e2e.spec.d.ts.map +1 -0
- package/dist/test/e2e/gateway-worker.e2e.spec.js +412 -0
- package/dist/test/e2e/gateway-worker.e2e.spec.js.map +1 -0
- package/dist/test/integration/admin-api.spec.d.ts +2 -0
- package/dist/test/integration/admin-api.spec.d.ts.map +1 -0
- package/dist/test/integration/admin-api.spec.js +218 -0
- package/dist/test/integration/admin-api.spec.js.map +1 -0
- package/dist/test/ratelimit/rate-limiter.service.spec.d.ts +2 -0
- package/dist/test/ratelimit/rate-limiter.service.spec.d.ts.map +1 -0
- package/dist/test/ratelimit/rate-limiter.service.spec.js +139 -0
- package/dist/test/ratelimit/rate-limiter.service.spec.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +56 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/test/ws/message-router.service.spec.d.ts +2 -0
- package/dist/test/ws/message-router.service.spec.d.ts.map +1 -0
- package/dist/test/ws/message-router.service.spec.js +403 -0
- package/dist/test/ws/message-router.service.spec.js.map +1 -0
- 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 @@
|
|
|
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"}
|