@roomkit/worker 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 (158) hide show
  1. package/README.md +122 -0
  2. package/dist/src/admin/admin.controller.d.ts +275 -0
  3. package/dist/src/admin/admin.controller.d.ts.map +1 -0
  4. package/dist/src/admin/admin.controller.js +296 -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 +35 -0
  9. package/dist/src/admin/admin.module.js.map +1 -0
  10. package/dist/src/admin/admin.service.d.ts +282 -0
  11. package/dist/src/admin/admin.service.d.ts.map +1 -0
  12. package/dist/src/admin/admin.service.js +508 -0
  13. package/dist/src/admin/admin.service.js.map +1 -0
  14. package/dist/src/auth/auth.module.d.ts +10 -0
  15. package/dist/src/auth/auth.module.d.ts.map +1 -0
  16. package/dist/src/auth/auth.module.js +37 -0
  17. package/dist/src/auth/auth.module.js.map +1 -0
  18. package/dist/src/auth/auth.service.d.ts +21 -0
  19. package/dist/src/auth/auth.service.d.ts.map +1 -0
  20. package/dist/src/auth/auth.service.js +69 -0
  21. package/dist/src/auth/auth.service.js.map +1 -0
  22. package/dist/src/circuit-breaker/circuit-breaker.module.d.ts +3 -0
  23. package/dist/src/circuit-breaker/circuit-breaker.module.d.ts.map +1 -0
  24. package/dist/src/circuit-breaker/circuit-breaker.module.js +24 -0
  25. package/dist/src/circuit-breaker/circuit-breaker.module.js.map +1 -0
  26. package/dist/src/circuit-breaker/circuit-breaker.service.d.ts +89 -0
  27. package/dist/src/circuit-breaker/circuit-breaker.service.d.ts.map +1 -0
  28. package/dist/src/circuit-breaker/circuit-breaker.service.js +207 -0
  29. package/dist/src/circuit-breaker/circuit-breaker.service.js.map +1 -0
  30. package/dist/src/config/config.module.d.ts +3 -0
  31. package/dist/src/config/config.module.d.ts.map +1 -0
  32. package/dist/src/config/config.module.js +22 -0
  33. package/dist/src/config/config.module.js.map +1 -0
  34. package/dist/src/config/config.service.d.ts +19 -0
  35. package/dist/src/config/config.service.d.ts.map +1 -0
  36. package/dist/src/config/config.service.js +58 -0
  37. package/dist/src/config/config.service.js.map +1 -0
  38. package/dist/src/config/worker.config.d.ts +82 -0
  39. package/dist/src/config/worker.config.d.ts.map +1 -0
  40. package/dist/src/config/worker.config.js +35 -0
  41. package/dist/src/config/worker.config.js.map +1 -0
  42. package/dist/src/index.d.ts +48 -0
  43. package/dist/src/index.d.ts.map +1 -0
  44. package/dist/src/index.js +108 -0
  45. package/dist/src/index.js.map +1 -0
  46. package/dist/src/lifecycle/graceful-shutdown.service.d.ts +71 -0
  47. package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -0
  48. package/dist/src/lifecycle/graceful-shutdown.service.js +221 -0
  49. package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -0
  50. package/dist/src/lifecycle/index.d.ts +2 -0
  51. package/dist/src/lifecycle/index.d.ts.map +1 -0
  52. package/dist/src/lifecycle/index.js +18 -0
  53. package/dist/src/lifecycle/index.js.map +1 -0
  54. package/dist/src/main.d.ts +2 -0
  55. package/dist/src/main.d.ts.map +1 -0
  56. package/dist/src/main.js +54 -0
  57. package/dist/src/main.js.map +1 -0
  58. package/dist/src/metrics/metrics.controller.d.ts +15 -0
  59. package/dist/src/metrics/metrics.controller.d.ts.map +1 -0
  60. package/dist/src/metrics/metrics.controller.js +44 -0
  61. package/dist/src/metrics/metrics.controller.js.map +1 -0
  62. package/dist/src/metrics/metrics.module.d.ts +7 -0
  63. package/dist/src/metrics/metrics.module.d.ts.map +1 -0
  64. package/dist/src/metrics/metrics.module.js +28 -0
  65. package/dist/src/metrics/metrics.module.js.map +1 -0
  66. package/dist/src/metrics/metrics.service.d.ts +65 -0
  67. package/dist/src/metrics/metrics.service.d.ts.map +1 -0
  68. package/dist/src/metrics/metrics.service.js +306 -0
  69. package/dist/src/metrics/metrics.service.js.map +1 -0
  70. package/dist/src/migration/migration.module.d.ts +3 -0
  71. package/dist/src/migration/migration.module.d.ts.map +1 -0
  72. package/dist/src/migration/migration.module.js +30 -0
  73. package/dist/src/migration/migration.module.js.map +1 -0
  74. package/dist/src/migration/migration.service.d.ts +68 -0
  75. package/dist/src/migration/migration.service.d.ts.map +1 -0
  76. package/dist/src/migration/migration.service.js +295 -0
  77. package/dist/src/migration/migration.service.js.map +1 -0
  78. package/dist/src/migration/room-migration.service.d.ts +92 -0
  79. package/dist/src/migration/room-migration.service.d.ts.map +1 -0
  80. package/dist/src/migration/room-migration.service.js +297 -0
  81. package/dist/src/migration/room-migration.service.js.map +1 -0
  82. package/dist/src/redis/redis.module.d.ts +3 -0
  83. package/dist/src/redis/redis.module.d.ts.map +1 -0
  84. package/dist/src/redis/redis.module.js +22 -0
  85. package/dist/src/redis/redis.module.js.map +1 -0
  86. package/dist/src/redis/redis.service.d.ts +68 -0
  87. package/dist/src/redis/redis.service.d.ts.map +1 -0
  88. package/dist/src/redis/redis.service.js +260 -0
  89. package/dist/src/redis/redis.service.js.map +1 -0
  90. package/dist/src/room/client-proxy.d.ts +43 -0
  91. package/dist/src/room/client-proxy.d.ts.map +1 -0
  92. package/dist/src/room/client-proxy.js +91 -0
  93. package/dist/src/room/client-proxy.js.map +1 -0
  94. package/dist/src/room/game-room.d.ts +243 -0
  95. package/dist/src/room/game-room.d.ts.map +1 -0
  96. package/dist/src/room/game-room.js +434 -0
  97. package/dist/src/room/game-room.js.map +1 -0
  98. package/dist/src/room/message-handler.service.d.ts +70 -0
  99. package/dist/src/room/message-handler.service.d.ts.map +1 -0
  100. package/dist/src/room/message-handler.service.js +541 -0
  101. package/dist/src/room/message-handler.service.js.map +1 -0
  102. package/dist/src/room/room-manager.service.d.ts +132 -0
  103. package/dist/src/room/room-manager.service.d.ts.map +1 -0
  104. package/dist/src/room/room-manager.service.js +571 -0
  105. package/dist/src/room/room-manager.service.js.map +1 -0
  106. package/dist/src/room/room-persistence.service.d.ts +101 -0
  107. package/dist/src/room/room-persistence.service.d.ts.map +1 -0
  108. package/dist/src/room/room-persistence.service.js +307 -0
  109. package/dist/src/room/room-persistence.service.js.map +1 -0
  110. package/dist/src/room/room-registry.service.d.ts +16 -0
  111. package/dist/src/room/room-registry.service.d.ts.map +1 -0
  112. package/dist/src/room/room-registry.service.js +60 -0
  113. package/dist/src/room/room-registry.service.js.map +1 -0
  114. package/dist/src/room/room.module.d.ts +15 -0
  115. package/dist/src/room/room.module.d.ts.map +1 -0
  116. package/dist/src/room/room.module.js +55 -0
  117. package/dist/src/room/room.module.js.map +1 -0
  118. package/dist/src/room/rooms/echo-room.d.ts +18 -0
  119. package/dist/src/room/rooms/echo-room.d.ts.map +1 -0
  120. package/dist/src/room/rooms/echo-room.js +85 -0
  121. package/dist/src/room/rooms/echo-room.js.map +1 -0
  122. package/dist/src/room/rooms/index.d.ts +2 -0
  123. package/dist/src/room/rooms/index.d.ts.map +1 -0
  124. package/dist/src/room/rooms/index.js +6 -0
  125. package/dist/src/room/rooms/index.js.map +1 -0
  126. package/dist/src/worker.module.d.ts +10 -0
  127. package/dist/src/worker.module.d.ts.map +1 -0
  128. package/dist/src/worker.module.js +46 -0
  129. package/dist/src/worker.module.js.map +1 -0
  130. package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts +2 -0
  131. package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts.map +1 -0
  132. package/dist/test/circuit-breaker/circuit-breaker.service.spec.js +220 -0
  133. package/dist/test/circuit-breaker/circuit-breaker.service.spec.js.map +1 -0
  134. package/dist/test/integration/admin-api.spec.d.ts +2 -0
  135. package/dist/test/integration/admin-api.spec.d.ts.map +1 -0
  136. package/dist/test/integration/admin-api.spec.js +246 -0
  137. package/dist/test/integration/admin-api.spec.js.map +1 -0
  138. package/dist/test/migration/game-room-migration.spec.d.ts +2 -0
  139. package/dist/test/migration/game-room-migration.spec.d.ts.map +1 -0
  140. package/dist/test/migration/game-room-migration.spec.js +222 -0
  141. package/dist/test/migration/game-room-migration.spec.js.map +1 -0
  142. package/dist/test/room/client-proxy.spec.d.ts +2 -0
  143. package/dist/test/room/client-proxy.spec.d.ts.map +1 -0
  144. package/dist/test/room/client-proxy.spec.js +117 -0
  145. package/dist/test/room/client-proxy.spec.js.map +1 -0
  146. package/dist/test/room/game-room.spec.d.ts +2 -0
  147. package/dist/test/room/game-room.spec.d.ts.map +1 -0
  148. package/dist/test/room/game-room.spec.js +219 -0
  149. package/dist/test/room/game-room.spec.js.map +1 -0
  150. package/dist/test/room/room-manager.service.spec.d.ts +2 -0
  151. package/dist/test/room/room-manager.service.spec.d.ts.map +1 -0
  152. package/dist/test/room/room-manager.service.spec.js +280 -0
  153. package/dist/test/room/room-manager.service.spec.js.map +1 -0
  154. package/dist/test/setup.d.ts +2 -0
  155. package/dist/test/setup.d.ts.map +1 -0
  156. package/dist/test/setup.js +56 -0
  157. package/dist/test/setup.js.map +1 -0
  158. package/package.json +74 -0
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # @roomkit/worker
2
+
3
+ Game logic Worker server for the RoomKit framework.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @roomkit/worker @roomkit/core @roomkit/state
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - 🎮 **Room System** - Colyseus-style room lifecycle
14
+ - 🔄 **State Synchronization** - Automatic state sync with clients
15
+ - 🔧 **Circuit Breaker** - Fault tolerance and resilience
16
+ - 📊 **Metrics** - Built-in Prometheus metrics
17
+ - 🔌 **Horizontal Scaling** - Multiple worker instances supported
18
+ - 🚀 **Room Migration** - Move rooms between workers
19
+
20
+ ## Quick Start
21
+
22
+ ### Create a Game Room
23
+
24
+ ```typescript
25
+ import { GameRoom } from '@roomkit/worker';
26
+
27
+ export class MyGameRoom extends GameRoom {
28
+ maxClients = 4;
29
+
30
+ onCreate(options: any) {
31
+ console.log('Room created', options);
32
+ this.setState({ players: [], status: 'waiting' });
33
+ }
34
+
35
+ onJoin(client: ClientProxy, options: any) {
36
+ console.log('Player joined', client.userId);
37
+ this.state.players.push({ id: client.userId });
38
+ this.broadcastStateToAll();
39
+ }
40
+
41
+ onMessage(client: ClientProxy, type: number, message: any) {
42
+ // Handle game logic
43
+ }
44
+
45
+ onLeave(client: ClientProxy) {
46
+ console.log('Player left', client.userId);
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### Register Room
52
+
53
+ ```typescript
54
+ import { RoomRegistry } from '@roomkit/worker';
55
+ import { MyGameRoom } from './my-game-room';
56
+
57
+ RoomRegistry.register('my_game', MyGameRoom);
58
+ ```
59
+
60
+ ### Environment Variables
61
+
62
+ ```bash
63
+ # Server
64
+ ADMIN_PORT=28200
65
+
66
+ # Redis
67
+ REDIS_HOST=localhost
68
+ REDIS_PORT=6379
69
+ REDIS_PASSWORD=
70
+
71
+ # Worker
72
+ WORKER_ID=worker-1
73
+ ```
74
+
75
+ ### Run Worker
76
+
77
+ ```bash
78
+ # Using the binary
79
+ npx @roomkit/worker
80
+
81
+ # Or using Node.js
82
+ node node_modules/@roomkit/worker/dist/main.js
83
+ ```
84
+
85
+ ## Room Lifecycle
86
+
87
+ ```typescript
88
+ class GameRoom {
89
+ onCreate(options) {
90
+ // Room initialization
91
+ }
92
+
93
+ onJoin(client, options) {
94
+ // Player joins
95
+ }
96
+
97
+ onMessage(client, type, message) {
98
+ // Handle messages
99
+ }
100
+
101
+ onLeave(client) {
102
+ // Player leaves
103
+ }
104
+
105
+ onDispose() {
106
+ // Room cleanup
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Admin API
112
+
113
+ The worker provides an admin API on port `ADMIN_PORT`:
114
+
115
+ - `GET /health` - Health check
116
+ - `GET /metrics` - Prometheus metrics
117
+ - `GET /admin/rooms` - List active rooms
118
+ - `GET /admin/stats` - Worker statistics
119
+
120
+ ## License
121
+
122
+ MIT
@@ -0,0 +1,275 @@
1
+ import { AdminService } from './admin.service';
2
+ /**
3
+ * Worker Admin API 控制器
4
+ * 提供房间管理、熔断器控制、系统状态等管理功能
5
+ */
6
+ export declare class AdminController {
7
+ private readonly adminService;
8
+ constructor(adminService: AdminService);
9
+ /**
10
+ * 健康检查
11
+ */
12
+ getHealth(): {
13
+ status: string;
14
+ timestamp: number;
15
+ workerId: string;
16
+ circuitBreaker: import("../circuit-breaker/circuit-breaker.service").CircuitState;
17
+ };
18
+ /**
19
+ * 获取系统状态
20
+ */
21
+ getStatus(): {
22
+ workerId: string;
23
+ uptime: number;
24
+ uptimeFormatted: string;
25
+ draining: boolean;
26
+ rooms: {
27
+ count: number;
28
+ max: number;
29
+ utilization: number;
30
+ totalPlayers: number;
31
+ };
32
+ circuitBreaker: import("../circuit-breaker/circuit-breaker.service").CircuitStats;
33
+ config: {
34
+ maxRooms: number;
35
+ circuitFailureThreshold: number;
36
+ circuitSuccessThreshold: number;
37
+ circuitOpenTimeout: number;
38
+ maxPendingRequests: number;
39
+ };
40
+ memory: {
41
+ heapUsed: number;
42
+ heapTotal: number;
43
+ rss: number;
44
+ external: number;
45
+ unit: string;
46
+ };
47
+ timestamp: number;
48
+ };
49
+ /**
50
+ * 获取所有房间信息
51
+ */
52
+ getRooms(): {
53
+ count: number;
54
+ rooms: {
55
+ roomId: string;
56
+ gameType: string;
57
+ status: string;
58
+ playerCount: number;
59
+ maxPlayers: number;
60
+ createdAt: number;
61
+ age: number;
62
+ }[];
63
+ };
64
+ /**
65
+ * 获取单个房间详情
66
+ */
67
+ getRoom(roomId: string): {
68
+ roomId: string;
69
+ gameType: string;
70
+ status: import("packages/core/dist").RoomStatus;
71
+ playerCount: number;
72
+ maxPlayers: number;
73
+ createdAt: number;
74
+ age: number;
75
+ players: import("packages/core/dist").PlayerInfo[];
76
+ autoDispose: boolean;
77
+ autoDisposeTimeout: number;
78
+ };
79
+ /**
80
+ * 强制关闭房间
81
+ */
82
+ closeRoom(roomId: string, body: {
83
+ reason?: string;
84
+ }): Promise<{
85
+ success: boolean;
86
+ roomId: string;
87
+ reason: string;
88
+ }>;
89
+ /**
90
+ * 踢出房间中的玩家
91
+ */
92
+ kickPlayerFromRoom(roomId: string, userId: string, body: {
93
+ reason?: string;
94
+ }): Promise<{
95
+ success: boolean;
96
+ roomId: string;
97
+ userId: string;
98
+ reason: string;
99
+ }>;
100
+ /**
101
+ * 获取熔断器状态
102
+ */
103
+ getCircuitBreakerStatus(): {
104
+ isHealthy: boolean;
105
+ config: {
106
+ failureThreshold: number;
107
+ successThreshold: number;
108
+ openTimeout: number;
109
+ maxPendingRequests: number;
110
+ };
111
+ state: import("../circuit-breaker/circuit-breaker.service").CircuitState;
112
+ failures: number;
113
+ successes: number;
114
+ lastFailureTime?: number;
115
+ lastOpenTime?: number;
116
+ pendingRequests: number;
117
+ };
118
+ /**
119
+ * 手动重置熔断器
120
+ */
121
+ resetCircuitBreaker(): {
122
+ success: boolean;
123
+ state: import("../circuit-breaker/circuit-breaker.service").CircuitState;
124
+ };
125
+ /**
126
+ * 手动触发熔断
127
+ */
128
+ tripCircuitBreaker(body: {
129
+ reason?: string;
130
+ }): {
131
+ success: boolean;
132
+ state: import("../circuit-breaker/circuit-breaker.service").CircuitState;
133
+ reason: string;
134
+ };
135
+ /**
136
+ * 获取 Redis 连接状态
137
+ */
138
+ getRedisStatus(): {
139
+ connected: boolean;
140
+ status: "connect" | "wait" | "reconnecting" | "connecting" | "ready" | "close" | "end";
141
+ host: string;
142
+ port: number;
143
+ };
144
+ /**
145
+ * 获取已注册的游戏类型
146
+ */
147
+ getGameTypes(): {
148
+ count: number;
149
+ gameTypes: string[];
150
+ };
151
+ /**
152
+ * 获取指标数据
153
+ */
154
+ getMetrics(): {
155
+ timestamp: number;
156
+ worker: {
157
+ id: string;
158
+ uptime: number;
159
+ draining: boolean;
160
+ };
161
+ rooms: {
162
+ total: number;
163
+ totalPlayers: number;
164
+ byGameType: Record<string, {
165
+ rooms: number;
166
+ players: number;
167
+ }>;
168
+ };
169
+ circuitBreaker: import("../circuit-breaker/circuit-breaker.service").CircuitStats;
170
+ memory: {
171
+ heapUsed: number;
172
+ heapTotal: number;
173
+ rss: number;
174
+ external: number;
175
+ unit: string;
176
+ };
177
+ };
178
+ /**
179
+ * 优雅下线 - 标记 Worker 为 draining 状态
180
+ */
181
+ drain(): Promise<{
182
+ success: boolean;
183
+ status: string;
184
+ roomsRemaining: number;
185
+ }>;
186
+ /**
187
+ * 恢复正常状态
188
+ */
189
+ resume(): Promise<{
190
+ success: boolean;
191
+ status: string;
192
+ }>;
193
+ /**
194
+ * 创建房间快照
195
+ */
196
+ createRoomSnapshot(roomId: string): {
197
+ success: boolean;
198
+ snapshot: import("packages/core/dist").RoomSnapshot;
199
+ error?: undefined;
200
+ } | {
201
+ success: boolean;
202
+ error: string;
203
+ snapshot?: undefined;
204
+ };
205
+ /**
206
+ * 从快照恢复房间
207
+ */
208
+ restoreRoom(body: {
209
+ snapshot: unknown;
210
+ }): Promise<{
211
+ success: boolean;
212
+ error: string;
213
+ roomId?: undefined;
214
+ playerCount?: undefined;
215
+ } | {
216
+ success: boolean;
217
+ roomId: string;
218
+ playerCount: number;
219
+ error?: undefined;
220
+ }>;
221
+ /**
222
+ * 清理迁移后的源房间
223
+ */
224
+ cleanupRoom(roomId: string): Promise<{
225
+ success: boolean;
226
+ message: string;
227
+ roomId?: undefined;
228
+ error?: undefined;
229
+ } | {
230
+ success: boolean;
231
+ roomId: string;
232
+ message?: undefined;
233
+ error?: undefined;
234
+ } | {
235
+ success: boolean;
236
+ error: string;
237
+ message?: undefined;
238
+ roomId?: undefined;
239
+ }>;
240
+ /**
241
+ * 发起房间迁移
242
+ */
243
+ migrateRoom(body: {
244
+ roomId: string;
245
+ sourceWorkerId: string;
246
+ targetWorkerId: string;
247
+ reason?: string;
248
+ }): Promise<import("../migration/room-migration.service").MigrationResult | {
249
+ success: boolean;
250
+ error: string;
251
+ roomId: string;
252
+ }>;
253
+ /**
254
+ * 获取迁移状态
255
+ */
256
+ getMigrationStatus(roomId: string): {
257
+ roomId: string;
258
+ exists: boolean;
259
+ isMigrating: boolean;
260
+ sourceWorkerId: string | undefined;
261
+ };
262
+ /**
263
+ * 获取所有活跃迁移
264
+ */
265
+ getActiveMigrations(): {
266
+ count: number;
267
+ migrations: {
268
+ roomId: string;
269
+ sourceWorkerId?: string;
270
+ }[];
271
+ migratingRooms: number;
272
+ activeRooms: string[];
273
+ };
274
+ }
275
+ //# sourceMappingURL=admin.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/admin.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;GAGG;AACH,qBACa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAEvD;;OAEG;IAEH,SAAS;;;;;;IAIT;;OAEG;IAEH,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIT;;OAEG;IAEH,QAAQ;;;;;;;;;;;;IAIR;;OAEG;IAEH,OAAO,CAAkB,MAAM,EAAE,MAAM;;;;;;;;;;;;IAIvC;;OAEG;IAGH,SAAS,CACU,MAAM,EAAE,MAAM,EACvB,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;IAKnC;;OAEG;IAGH,kBAAkB,CACC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACvB,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;IAKnC;;OAEG;IAEH,uBAAuB;;;;;;;;;;;;;;;IAIvB;;OAEG;IAGH,mBAAmB;;;;IAInB;;OAEG;IAGH,kBAAkB,CAAS,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;IAIpD;;OAEG;IAEH,cAAc;;;;;;IAId;;OAEG;IAEH,YAAY;;;;IAIZ;;OAEG;IAEH,UAAU;;;;;;;;;;;;;;;;;;;;;;;;IAIV;;OAEG;IAGH,KAAK;;;;;IAIL;;OAEG;IAGH,MAAM;;;;IAMN;;OAEG;IAGH,kBAAkB,CAAkB,MAAM,EAAE,MAAM;;;;;;;;;IAIlD;;OAEG;IAGH,WAAW,CAAS,IAAI,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE;;;;;;;;;;;IAI/C;;OAEG;IAGH,WAAW,CAAkB,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;IAI3C;;OAEG;IAGH,WAAW,CAET,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;;;;;IAKH;;OAEG;IAEH,kBAAkB,CAAkB,MAAM,EAAE,MAAM;;;;;;IAIlD;;OAEG;IAEH,mBAAmB;;;;;;;;;CAGpB"}
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AdminController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const admin_service_1 = require("./admin.service");
18
+ /**
19
+ * Worker Admin API 控制器
20
+ * 提供房间管理、熔断器控制、系统状态等管理功能
21
+ */
22
+ let AdminController = class AdminController {
23
+ adminService;
24
+ constructor(adminService) {
25
+ this.adminService = adminService;
26
+ }
27
+ /**
28
+ * 健康检查
29
+ */
30
+ getHealth() {
31
+ return this.adminService.getHealth();
32
+ }
33
+ /**
34
+ * 获取系统状态
35
+ */
36
+ getStatus() {
37
+ return this.adminService.getStatus();
38
+ }
39
+ /**
40
+ * 获取所有房间信息
41
+ */
42
+ getRooms() {
43
+ return this.adminService.getRooms();
44
+ }
45
+ /**
46
+ * 获取单个房间详情
47
+ */
48
+ getRoom(roomId) {
49
+ return this.adminService.getRoom(roomId);
50
+ }
51
+ /**
52
+ * 强制关闭房间
53
+ */
54
+ closeRoom(roomId, body) {
55
+ return this.adminService.closeRoom(roomId, body.reason);
56
+ }
57
+ /**
58
+ * 踢出房间中的玩家
59
+ */
60
+ kickPlayerFromRoom(roomId, userId, body) {
61
+ return this.adminService.kickPlayerFromRoom(roomId, userId, body.reason);
62
+ }
63
+ /**
64
+ * 获取熔断器状态
65
+ */
66
+ getCircuitBreakerStatus() {
67
+ return this.adminService.getCircuitBreakerStatus();
68
+ }
69
+ /**
70
+ * 手动重置熔断器
71
+ */
72
+ resetCircuitBreaker() {
73
+ return this.adminService.resetCircuitBreaker();
74
+ }
75
+ /**
76
+ * 手动触发熔断
77
+ */
78
+ tripCircuitBreaker(body) {
79
+ return this.adminService.tripCircuitBreaker(body.reason);
80
+ }
81
+ /**
82
+ * 获取 Redis 连接状态
83
+ */
84
+ getRedisStatus() {
85
+ return this.adminService.getRedisStatus();
86
+ }
87
+ /**
88
+ * 获取已注册的游戏类型
89
+ */
90
+ getGameTypes() {
91
+ return this.adminService.getGameTypes();
92
+ }
93
+ /**
94
+ * 获取指标数据
95
+ */
96
+ getMetrics() {
97
+ return this.adminService.getMetrics();
98
+ }
99
+ /**
100
+ * 优雅下线 - 标记 Worker 为 draining 状态
101
+ */
102
+ drain() {
103
+ return this.adminService.drain();
104
+ }
105
+ /**
106
+ * 恢复正常状态
107
+ */
108
+ resume() {
109
+ return this.adminService.resume();
110
+ }
111
+ // ============ 迁移相关接口 ============
112
+ /**
113
+ * 创建房间快照
114
+ */
115
+ createRoomSnapshot(roomId) {
116
+ return this.adminService.createRoomSnapshot(roomId);
117
+ }
118
+ /**
119
+ * 从快照恢复房间
120
+ */
121
+ restoreRoom(body) {
122
+ return this.adminService.restoreRoomFromSnapshot(body.snapshot);
123
+ }
124
+ /**
125
+ * 清理迁移后的源房间
126
+ */
127
+ cleanupRoom(roomId) {
128
+ return this.adminService.cleanupMigratedRoom(roomId);
129
+ }
130
+ /**
131
+ * 发起房间迁移
132
+ */
133
+ migrateRoom(body) {
134
+ return this.adminService.migrateRoom(body);
135
+ }
136
+ /**
137
+ * 获取迁移状态
138
+ */
139
+ getMigrationStatus(roomId) {
140
+ return this.adminService.getMigrationStatus(roomId);
141
+ }
142
+ /**
143
+ * 获取所有活跃迁移
144
+ */
145
+ getActiveMigrations() {
146
+ return this.adminService.getActiveMigrations();
147
+ }
148
+ };
149
+ exports.AdminController = AdminController;
150
+ __decorate([
151
+ (0, common_1.Get)('health'),
152
+ __metadata("design:type", Function),
153
+ __metadata("design:paramtypes", []),
154
+ __metadata("design:returntype", void 0)
155
+ ], AdminController.prototype, "getHealth", null);
156
+ __decorate([
157
+ (0, common_1.Get)('status'),
158
+ __metadata("design:type", Function),
159
+ __metadata("design:paramtypes", []),
160
+ __metadata("design:returntype", void 0)
161
+ ], AdminController.prototype, "getStatus", null);
162
+ __decorate([
163
+ (0, common_1.Get)('rooms'),
164
+ __metadata("design:type", Function),
165
+ __metadata("design:paramtypes", []),
166
+ __metadata("design:returntype", void 0)
167
+ ], AdminController.prototype, "getRooms", null);
168
+ __decorate([
169
+ (0, common_1.Get)('rooms/:roomId'),
170
+ __param(0, (0, common_1.Param)('roomId')),
171
+ __metadata("design:type", Function),
172
+ __metadata("design:paramtypes", [String]),
173
+ __metadata("design:returntype", void 0)
174
+ ], AdminController.prototype, "getRoom", null);
175
+ __decorate([
176
+ (0, common_1.Post)('rooms/:roomId/close'),
177
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
178
+ __param(0, (0, common_1.Param)('roomId')),
179
+ __param(1, (0, common_1.Body)()),
180
+ __metadata("design:type", Function),
181
+ __metadata("design:paramtypes", [String, Object]),
182
+ __metadata("design:returntype", void 0)
183
+ ], AdminController.prototype, "closeRoom", null);
184
+ __decorate([
185
+ (0, common_1.Post)('rooms/:roomId/kick/:userId'),
186
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
187
+ __param(0, (0, common_1.Param)('roomId')),
188
+ __param(1, (0, common_1.Param)('userId')),
189
+ __param(2, (0, common_1.Body)()),
190
+ __metadata("design:type", Function),
191
+ __metadata("design:paramtypes", [String, String, Object]),
192
+ __metadata("design:returntype", void 0)
193
+ ], AdminController.prototype, "kickPlayerFromRoom", null);
194
+ __decorate([
195
+ (0, common_1.Get)('circuit-breaker'),
196
+ __metadata("design:type", Function),
197
+ __metadata("design:paramtypes", []),
198
+ __metadata("design:returntype", void 0)
199
+ ], AdminController.prototype, "getCircuitBreakerStatus", null);
200
+ __decorate([
201
+ (0, common_1.Post)('circuit-breaker/reset'),
202
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
203
+ __metadata("design:type", Function),
204
+ __metadata("design:paramtypes", []),
205
+ __metadata("design:returntype", void 0)
206
+ ], AdminController.prototype, "resetCircuitBreaker", null);
207
+ __decorate([
208
+ (0, common_1.Post)('circuit-breaker/trip'),
209
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
210
+ __param(0, (0, common_1.Body)()),
211
+ __metadata("design:type", Function),
212
+ __metadata("design:paramtypes", [Object]),
213
+ __metadata("design:returntype", void 0)
214
+ ], AdminController.prototype, "tripCircuitBreaker", null);
215
+ __decorate([
216
+ (0, common_1.Get)('redis/status'),
217
+ __metadata("design:type", Function),
218
+ __metadata("design:paramtypes", []),
219
+ __metadata("design:returntype", void 0)
220
+ ], AdminController.prototype, "getRedisStatus", null);
221
+ __decorate([
222
+ (0, common_1.Get)('game-types'),
223
+ __metadata("design:type", Function),
224
+ __metadata("design:paramtypes", []),
225
+ __metadata("design:returntype", void 0)
226
+ ], AdminController.prototype, "getGameTypes", null);
227
+ __decorate([
228
+ (0, common_1.Get)('metrics'),
229
+ __metadata("design:type", Function),
230
+ __metadata("design:paramtypes", []),
231
+ __metadata("design:returntype", void 0)
232
+ ], AdminController.prototype, "getMetrics", null);
233
+ __decorate([
234
+ (0, common_1.Post)('drain'),
235
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
236
+ __metadata("design:type", Function),
237
+ __metadata("design:paramtypes", []),
238
+ __metadata("design:returntype", void 0)
239
+ ], AdminController.prototype, "drain", null);
240
+ __decorate([
241
+ (0, common_1.Post)('resume'),
242
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
243
+ __metadata("design:type", Function),
244
+ __metadata("design:paramtypes", []),
245
+ __metadata("design:returntype", void 0)
246
+ ], AdminController.prototype, "resume", null);
247
+ __decorate([
248
+ (0, common_1.Post)('rooms/:roomId/snapshot'),
249
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
250
+ __param(0, (0, common_1.Param)('roomId')),
251
+ __metadata("design:type", Function),
252
+ __metadata("design:paramtypes", [String]),
253
+ __metadata("design:returntype", void 0)
254
+ ], AdminController.prototype, "createRoomSnapshot", null);
255
+ __decorate([
256
+ (0, common_1.Post)('rooms/restore'),
257
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
258
+ __param(0, (0, common_1.Body)()),
259
+ __metadata("design:type", Function),
260
+ __metadata("design:paramtypes", [Object]),
261
+ __metadata("design:returntype", void 0)
262
+ ], AdminController.prototype, "restoreRoom", null);
263
+ __decorate([
264
+ (0, common_1.Post)('rooms/:roomId/cleanup'),
265
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
266
+ __param(0, (0, common_1.Param)('roomId')),
267
+ __metadata("design:type", Function),
268
+ __metadata("design:paramtypes", [String]),
269
+ __metadata("design:returntype", void 0)
270
+ ], AdminController.prototype, "cleanupRoom", null);
271
+ __decorate([
272
+ (0, common_1.Post)('migrate'),
273
+ (0, common_1.HttpCode)(common_1.HttpStatus.OK),
274
+ __param(0, (0, common_1.Body)()),
275
+ __metadata("design:type", Function),
276
+ __metadata("design:paramtypes", [Object]),
277
+ __metadata("design:returntype", void 0)
278
+ ], AdminController.prototype, "migrateRoom", null);
279
+ __decorate([
280
+ (0, common_1.Get)('migrate/:roomId/status'),
281
+ __param(0, (0, common_1.Param)('roomId')),
282
+ __metadata("design:type", Function),
283
+ __metadata("design:paramtypes", [String]),
284
+ __metadata("design:returntype", void 0)
285
+ ], AdminController.prototype, "getMigrationStatus", null);
286
+ __decorate([
287
+ (0, common_1.Get)('migrate/active'),
288
+ __metadata("design:type", Function),
289
+ __metadata("design:paramtypes", []),
290
+ __metadata("design:returntype", void 0)
291
+ ], AdminController.prototype, "getActiveMigrations", null);
292
+ exports.AdminController = AdminController = __decorate([
293
+ (0, common_1.Controller)('admin'),
294
+ __metadata("design:paramtypes", [admin_service_1.AdminService])
295
+ ], AdminController);
296
+ //# sourceMappingURL=admin.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.controller.js","sourceRoot":"","sources":["../../../src/admin/admin.controller.ts"],"names":[],"mappings":"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"}