@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-room.spec.d.ts","sourceRoot":"","sources":["../../../test/room/game-room.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /// <reference types="jest" />
4
+ const game_room_1 = require("../../src/room/game-room");
5
+ /**
6
+ * 用于测试的具体房间实现
7
+ */
8
+ class TestRoom extends game_room_1.GameRoom {
9
+ onCreateCalled = false;
10
+ onJoinCalled = false;
11
+ onLeaveCalled = false;
12
+ onMessageCalled = false;
13
+ onDisposeCalled = false;
14
+ lastClient = null;
15
+ lastMsgType = '';
16
+ lastPayload = null;
17
+ async onCreate(options) {
18
+ this.onCreateCalled = true;
19
+ }
20
+ async onJoin(client, options) {
21
+ this.onJoinCalled = true;
22
+ this.lastClient = client;
23
+ }
24
+ async onLeave(client, reason) {
25
+ this.onLeaveCalled = true;
26
+ this.lastClient = client;
27
+ }
28
+ async onMessage(client, msgType, payload) {
29
+ this.onMessageCalled = true;
30
+ this.lastClient = client;
31
+ this.lastMsgType = msgType;
32
+ this.lastPayload = payload;
33
+ }
34
+ async onDispose() {
35
+ this.onDisposeCalled = true;
36
+ }
37
+ }
38
+ describe('GameRoom', () => {
39
+ let room;
40
+ let mockClient;
41
+ const roomId = 'room-123';
42
+ const gameType = 'test';
43
+ const maxPlayers = 4;
44
+ const config = { testOption: true };
45
+ beforeEach(() => {
46
+ room = new TestRoom(roomId, gameType, maxPlayers, config);
47
+ mockClient = {
48
+ userId: 'user-1',
49
+ connectionId: 'conn-1',
50
+ gatewayId: 'gateway-1',
51
+ workerId: 'worker-1',
52
+ roomId: undefined,
53
+ send: jest.fn().mockResolvedValue(undefined),
54
+ sendSuccess: jest.fn().mockResolvedValue(undefined),
55
+ sendError: jest.fn().mockResolvedValue(undefined),
56
+ broadcast: jest.fn().mockResolvedValue(undefined),
57
+ broadcastAll: jest.fn().mockResolvedValue(undefined),
58
+ };
59
+ });
60
+ afterEach(() => {
61
+ jest.clearAllMocks();
62
+ });
63
+ describe('constructor', () => {
64
+ it('should initialize with correct properties', () => {
65
+ expect(room.roomId).toBe(roomId);
66
+ expect(room.gameType).toBe(gameType);
67
+ expect(room.maxPlayers).toBe(maxPlayers);
68
+ expect(room.config).toEqual(config);
69
+ expect(room.status).toBe('creating');
70
+ expect(room.players.size).toBe(0);
71
+ expect(room.createdAt).toBeLessThanOrEqual(Date.now());
72
+ });
73
+ it('should have default values', () => {
74
+ expect(room.autoDispose).toBe(true);
75
+ expect(room.autoDisposeTimeout).toBe(60000);
76
+ });
77
+ });
78
+ describe('addPlayer', () => {
79
+ it('should add player to room', () => {
80
+ const playerInfo = {
81
+ userId: mockClient.userId,
82
+ joinedAt: Date.now(),
83
+ };
84
+ room.addPlayer(mockClient, playerInfo);
85
+ expect(room.players.has(mockClient.userId)).toBe(true);
86
+ expect(room.playerInfos.has(mockClient.userId)).toBe(true);
87
+ expect(room.playerCount).toBe(1);
88
+ });
89
+ it('should set roomId on client', () => {
90
+ const playerInfo = {
91
+ userId: mockClient.userId,
92
+ joinedAt: Date.now(),
93
+ };
94
+ room.addPlayer(mockClient, playerInfo);
95
+ expect(mockClient.roomId).toBe(roomId);
96
+ });
97
+ it('should cancel auto-dispose timer when player joins', () => {
98
+ // 模拟一个 player 离开后设置的 timer
99
+ room['disposeTimer'] = setTimeout(() => { }, 1000);
100
+ const playerInfo = {
101
+ userId: mockClient.userId,
102
+ joinedAt: Date.now(),
103
+ };
104
+ room.addPlayer(mockClient, playerInfo);
105
+ expect(room['disposeTimer']).toBeNull();
106
+ });
107
+ });
108
+ describe('removePlayer', () => {
109
+ beforeEach(() => {
110
+ const playerInfo = {
111
+ userId: mockClient.userId,
112
+ joinedAt: Date.now(),
113
+ };
114
+ room.addPlayer(mockClient, playerInfo);
115
+ });
116
+ it('should remove player from room', () => {
117
+ room.removePlayer(mockClient.userId);
118
+ expect(room.players.has(mockClient.userId)).toBe(false);
119
+ expect(room.playerInfos.has(mockClient.userId)).toBe(false);
120
+ expect(room.playerCount).toBe(0);
121
+ });
122
+ it('should schedule dispose when last player leaves and autoDispose is true', () => {
123
+ room.autoDispose = true;
124
+ const scheduleSpy = jest.spyOn(room, 'scheduleDispose');
125
+ room.removePlayer(mockClient.userId);
126
+ expect(scheduleSpy).toHaveBeenCalled();
127
+ });
128
+ it('should not schedule dispose when autoDispose is false', () => {
129
+ room.autoDispose = false;
130
+ const scheduleSpy = jest.spyOn(room, 'scheduleDispose');
131
+ room.removePlayer(mockClient.userId);
132
+ expect(scheduleSpy).not.toHaveBeenCalled();
133
+ });
134
+ });
135
+ describe('playerCount', () => {
136
+ it('should return correct player count', () => {
137
+ expect(room.playerCount).toBe(0);
138
+ room.addPlayer(mockClient, { userId: mockClient.userId, joinedAt: Date.now() });
139
+ expect(room.playerCount).toBe(1);
140
+ const client2 = { ...mockClient, userId: 'user-2' };
141
+ room.addPlayer(client2, { userId: client2.userId, joinedAt: Date.now() });
142
+ expect(room.playerCount).toBe(2);
143
+ });
144
+ });
145
+ describe('hasPlayer', () => {
146
+ it('should return true for existing player', () => {
147
+ room.addPlayer(mockClient, { userId: mockClient.userId, joinedAt: Date.now() });
148
+ expect(room.hasPlayer(mockClient.userId)).toBe(true);
149
+ });
150
+ it('should return false for non-existing player', () => {
151
+ expect(room.hasPlayer('unknown-user')).toBe(false);
152
+ });
153
+ });
154
+ describe('getPlayer', () => {
155
+ it('should return player by userId', () => {
156
+ room.addPlayer(mockClient, { userId: mockClient.userId, joinedAt: Date.now() });
157
+ const player = room.getPlayer(mockClient.userId);
158
+ expect(player).toBe(mockClient);
159
+ });
160
+ it('should return undefined for non-existing player', () => {
161
+ expect(room.getPlayer('unknown-user')).toBeUndefined();
162
+ });
163
+ });
164
+ describe('getPlayerInfos', () => {
165
+ it('should return array of player infos', () => {
166
+ const playerInfo = { userId: mockClient.userId, joinedAt: Date.now() };
167
+ room.addPlayer(mockClient, playerInfo);
168
+ const infos = room.getPlayerInfos();
169
+ expect(infos).toHaveLength(1);
170
+ expect(infos[0]).toEqual(playerInfo);
171
+ });
172
+ });
173
+ describe('broadcast', () => {
174
+ it('should send message to all players', async () => {
175
+ const client1 = { ...mockClient, send: jest.fn() };
176
+ const client2 = { ...mockClient, userId: 'user-2', send: jest.fn() };
177
+ room.addPlayer(client1, { userId: client1.userId, joinedAt: Date.now() });
178
+ room.addPlayer(client2, { userId: client2.userId, joinedAt: Date.now() });
179
+ await room.broadcast('game:action', { message: 'hello' });
180
+ expect(client1.send).toHaveBeenCalledWith('game:action', { message: 'hello' });
181
+ expect(client2.send).toHaveBeenCalledWith('game:action', { message: 'hello' });
182
+ });
183
+ it('should exclude specified user', async () => {
184
+ const client1 = { ...mockClient, send: jest.fn() };
185
+ const client2 = { ...mockClient, userId: 'user-2', send: jest.fn() };
186
+ room.addPlayer(client1, { userId: client1.userId, joinedAt: Date.now() });
187
+ room.addPlayer(client2, { userId: client2.userId, joinedAt: Date.now() });
188
+ await room.broadcast('game:action', { message: 'hello' }, client1.userId);
189
+ expect(client1.send).not.toHaveBeenCalled();
190
+ expect(client2.send).toHaveBeenCalledWith('game:action', { message: 'hello' });
191
+ });
192
+ });
193
+ describe('onAuth', () => {
194
+ it('should return true by default', async () => {
195
+ const result = await room.onAuth(mockClient, {});
196
+ expect(result).toBe(true);
197
+ });
198
+ });
199
+ describe('dispose', () => {
200
+ it('should call onDispose and set status to disposed', async () => {
201
+ await room.dispose();
202
+ expect(room.onDisposeCalled).toBe(true);
203
+ expect(room.status).toBe('disposed');
204
+ });
205
+ it('should not call onDispose twice', async () => {
206
+ await room.dispose();
207
+ room.onDisposeCalled = false;
208
+ await room.dispose();
209
+ expect(room.onDisposeCalled).toBe(false);
210
+ });
211
+ it('should clear dispose timer', async () => {
212
+ room['disposeTimer'] = setTimeout(() => { }, 10000);
213
+ await room.dispose();
214
+ // Timer should be cleared (we can't directly check, but no error means success)
215
+ expect(room.status).toBe('disposed');
216
+ });
217
+ });
218
+ });
219
+ //# sourceMappingURL=game-room.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-room.spec.js","sourceRoot":"","sources":["../../../test/room/game-room.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=room-manager.service.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-manager.service.spec.d.ts","sourceRoot":"","sources":["../../../test/room/room-manager.service.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /// <reference types="jest" />
4
+ const room_manager_service_1 = require("../../src/room/room-manager.service");
5
+ const game_room_1 = require("../../src/room/game-room");
6
+ const core_1 = require("@roomkit/core");
7
+ /**
8
+ * 测试用房间实现
9
+ */
10
+ class MockGameRoom extends game_room_1.GameRoom {
11
+ async onCreate() { }
12
+ async onJoin() { }
13
+ async onLeave() { }
14
+ async onMessage() { }
15
+ async onDispose() { }
16
+ }
17
+ describe('RoomManagerService', () => {
18
+ let service;
19
+ let configService;
20
+ let redisService;
21
+ let persistenceService;
22
+ let mockClient;
23
+ const workerId = 'worker-test-001';
24
+ beforeEach(() => {
25
+ configService = {
26
+ workerId,
27
+ maxRooms: 100,
28
+ };
29
+ redisService = {
30
+ client: {
31
+ hset: jest.fn().mockResolvedValue(1),
32
+ hdel: jest.fn().mockResolvedValue(1),
33
+ del: jest.fn().mockResolvedValue(1),
34
+ set: jest.fn().mockResolvedValue('OK'),
35
+ sadd: jest.fn().mockResolvedValue(1),
36
+ srem: jest.fn().mockResolvedValue(1),
37
+ },
38
+ publish: jest.fn().mockResolvedValue(undefined),
39
+ updateStats: jest.fn().mockResolvedValue(undefined),
40
+ };
41
+ persistenceService = {
42
+ startPersistence: jest.fn().mockResolvedValue(undefined),
43
+ stopPersistence: jest.fn().mockResolvedValue(undefined),
44
+ recordEvent: jest.fn(),
45
+ cleanupRoomData: jest.fn().mockResolvedValue(undefined),
46
+ };
47
+ service = new room_manager_service_1.RoomManagerService(configService, redisService, persistenceService);
48
+ // 注册测试房间类型
49
+ service.registerRoomType('test', MockGameRoom);
50
+ mockClient = {
51
+ userId: 'user-123',
52
+ connectionId: 'conn-456',
53
+ gatewayId: 'gateway-001',
54
+ workerId,
55
+ roomId: undefined,
56
+ send: jest.fn().mockResolvedValue(undefined),
57
+ sendSuccess: jest.fn().mockResolvedValue(undefined),
58
+ sendError: jest.fn().mockResolvedValue(undefined),
59
+ broadcast: jest.fn().mockResolvedValue(undefined),
60
+ };
61
+ });
62
+ afterEach(() => {
63
+ jest.clearAllMocks();
64
+ });
65
+ describe('registerRoomType', () => {
66
+ it('should register a room type', () => {
67
+ service.registerRoomType('echo', MockGameRoom);
68
+ const types = service.getRegisteredGameTypes();
69
+ expect(types).toContain('echo');
70
+ });
71
+ it('should return all registered types', () => {
72
+ service.registerRoomType('chess', MockGameRoom);
73
+ service.registerRoomType('poker', MockGameRoom);
74
+ const types = service.getRegisteredGameTypes();
75
+ expect(types).toContain('test');
76
+ expect(types).toContain('chess');
77
+ expect(types).toContain('poker');
78
+ });
79
+ });
80
+ describe('createRoom', () => {
81
+ it('should create a room with valid parameters', async () => {
82
+ const room = await service.createRoom('room-1', 'test', 4, {}, mockClient);
83
+ expect(room).not.toBeNull();
84
+ expect(room?.roomId).toBe('room-1');
85
+ expect(room?.gameType).toBe('test');
86
+ expect(room?.maxPlayers).toBe(4);
87
+ expect(room?.status).toBe('waiting');
88
+ });
89
+ it('should store room in memory', async () => {
90
+ await service.createRoom('room-1', 'test', 4, {}, mockClient);
91
+ expect(service.getRoom('room-1')).toBeDefined();
92
+ expect(service.getRoomCount()).toBe(1);
93
+ });
94
+ it('should update room in Redis', async () => {
95
+ await service.createRoom('room-1', 'test', 4, {}, mockClient);
96
+ expect(redisService.client.set).toHaveBeenCalled();
97
+ expect(redisService.client.sadd).toHaveBeenCalled();
98
+ });
99
+ it('should return null for unknown game type', async () => {
100
+ const room = await service.createRoom('room-1', 'unknown-type', 4, {}, mockClient);
101
+ expect(room).toBeNull();
102
+ });
103
+ it('should return null when max rooms reached', async () => {
104
+ // 创建一个新的服务实例,配置 maxRooms 为 1
105
+ const limitedConfigService = {
106
+ workerId: workerId,
107
+ maxRooms: 1,
108
+ };
109
+ const limitedPersistenceService = {
110
+ startPersistence: jest.fn().mockResolvedValue(undefined),
111
+ stopPersistence: jest.fn().mockResolvedValue(undefined),
112
+ recordEvent: jest.fn(),
113
+ cleanupRoomData: jest.fn().mockResolvedValue(undefined),
114
+ };
115
+ const limitedService = new room_manager_service_1.RoomManagerService(limitedConfigService, redisService, limitedPersistenceService);
116
+ limitedService.registerRoomType('test', MockGameRoom);
117
+ await limitedService.createRoom('room-1', 'test', 4, {}, mockClient);
118
+ const room2 = await limitedService.createRoom('room-2', 'test', 4, {}, mockClient);
119
+ expect(room2).toBeNull();
120
+ });
121
+ it('should update stats after creation', async () => {
122
+ await service.createRoom('room-1', 'test', 4, {}, mockClient);
123
+ expect(redisService.updateStats).toHaveBeenCalled();
124
+ });
125
+ });
126
+ describe('getRoom', () => {
127
+ it('should return room by ID', async () => {
128
+ await service.createRoom('room-1', 'test', 4, {}, mockClient);
129
+ const room = service.getRoom('room-1');
130
+ expect(room).toBeDefined();
131
+ expect(room?.roomId).toBe('room-1');
132
+ });
133
+ it('should return undefined for non-existent room', () => {
134
+ expect(service.getRoom('non-existent')).toBeUndefined();
135
+ });
136
+ });
137
+ describe('joinRoom', () => {
138
+ let room;
139
+ beforeEach(async () => {
140
+ room = (await service.createRoom('room-1', 'test', 4, {}, mockClient));
141
+ });
142
+ it('should add player to room', async () => {
143
+ const result = await service.joinRoom(room, mockClient);
144
+ expect(result).toBe(true);
145
+ expect(room.hasPlayer(mockClient.userId)).toBe(true);
146
+ });
147
+ it('should update Redis room members', async () => {
148
+ await service.joinRoom(room, mockClient);
149
+ expect(redisService.client.hset).toHaveBeenCalled();
150
+ });
151
+ it('should notify gateway about user joining', async () => {
152
+ await service.joinRoom(room, mockClient);
153
+ expect(redisService.publish).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
154
+ type: 'user-joined-room',
155
+ userId: mockClient.userId,
156
+ roomId: room.roomId,
157
+ }));
158
+ });
159
+ it('should return false when room is full', async () => {
160
+ // 创建一个只能容纳1人的房间
161
+ const smallRoom = (await service.createRoom('small-room', 'test', 1, {}, mockClient));
162
+ await service.joinRoom(smallRoom, mockClient);
163
+ const client2 = { ...mockClient, userId: 'user-2' };
164
+ const result = await service.joinRoom(smallRoom, client2);
165
+ expect(result).toBe(false);
166
+ });
167
+ it('should return false when room is disposed', async () => {
168
+ room.status = 'disposed';
169
+ const result = await service.joinRoom(room, mockClient);
170
+ expect(result).toBe(false);
171
+ });
172
+ it('should update room status to active when enough players', async () => {
173
+ const client2 = { ...mockClient, userId: 'user-2' };
174
+ await service.joinRoom(room, mockClient);
175
+ await service.joinRoom(room, client2);
176
+ expect(room.status).toBe('active');
177
+ });
178
+ });
179
+ describe('leaveRoom', () => {
180
+ let room;
181
+ beforeEach(async () => {
182
+ room = (await service.createRoom('room-1', 'test', 4, {}, mockClient));
183
+ await service.joinRoom(room, mockClient);
184
+ });
185
+ it('should remove player from room', async () => {
186
+ await service.leaveRoom(room, mockClient.userId, 'voluntary');
187
+ expect(room.hasPlayer(mockClient.userId)).toBe(false);
188
+ });
189
+ it('should clean up Redis data', async () => {
190
+ await service.leaveRoom(room, mockClient.userId, 'voluntary');
191
+ expect(redisService.client.hdel).toHaveBeenCalled();
192
+ expect(redisService.client.del).toHaveBeenCalled();
193
+ });
194
+ it('should notify gateway about user leaving', async () => {
195
+ await service.leaveRoom(room, mockClient.userId, 'voluntary');
196
+ expect(redisService.publish).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
197
+ type: 'user-left-room',
198
+ userId: mockClient.userId,
199
+ roomId: room.roomId,
200
+ reason: 'voluntary',
201
+ }));
202
+ });
203
+ it('should dispose empty room when autoDispose is true', async () => {
204
+ room.autoDispose = true;
205
+ await service.leaveRoom(room, mockClient.userId, 'voluntary');
206
+ expect(service.getRoom('room-1')).toBeUndefined();
207
+ });
208
+ it('should not dispose when there are other players', async () => {
209
+ const client2 = { ...mockClient, userId: 'user-2' };
210
+ await service.joinRoom(room, client2);
211
+ await service.leaveRoom(room, mockClient.userId, 'voluntary');
212
+ expect(service.getRoom('room-1')).toBeDefined();
213
+ });
214
+ it('should do nothing for non-existent player', async () => {
215
+ await service.leaveRoom(room, 'non-existent-user', 'voluntary');
216
+ // 不应报错
217
+ expect(room.playerCount).toBe(1);
218
+ });
219
+ });
220
+ describe('disposeRoom', () => {
221
+ let room;
222
+ beforeEach(async () => {
223
+ room = (await service.createRoom('room-1', 'test', 4, {}, mockClient));
224
+ });
225
+ it('should remove room from memory', async () => {
226
+ await service.disposeRoom('room-1');
227
+ expect(service.getRoom('room-1')).toBeUndefined();
228
+ expect(service.getRoomCount()).toBe(0);
229
+ });
230
+ it('should clean up Redis data', async () => {
231
+ await service.disposeRoom('room-1');
232
+ expect(redisService.client.del).toHaveBeenCalled();
233
+ expect(redisService.client.srem).toHaveBeenCalled();
234
+ });
235
+ it('should notify players when room is disposed with players', async () => {
236
+ await service.joinRoom(room, mockClient);
237
+ await service.disposeRoom('room-1');
238
+ expect(mockClient.send).toHaveBeenCalledWith(core_1.MessageType.ROOM_CLOSING, { reason: 'disposed' });
239
+ });
240
+ it('should do nothing for non-existent room', async () => {
241
+ await service.disposeRoom('non-existent');
242
+ // 不应报错
243
+ expect(service.getRoomCount()).toBe(1);
244
+ });
245
+ });
246
+ describe('handleDisconnect', () => {
247
+ it('should remove player when they disconnect', async () => {
248
+ const room = (await service.createRoom('room-1', 'test', 4, {}, mockClient));
249
+ await service.joinRoom(room, mockClient);
250
+ await service.handleDisconnect('room-1', mockClient.userId);
251
+ expect(room.hasPlayer(mockClient.userId)).toBe(false);
252
+ });
253
+ it('should do nothing for non-existent room', async () => {
254
+ // 不应报错
255
+ await service.handleDisconnect('non-existent', 'user-1');
256
+ });
257
+ });
258
+ describe('getAllRooms', () => {
259
+ it('should return all rooms as Map', async () => {
260
+ await service.createRoom('room-1', 'test', 4, {}, mockClient);
261
+ await service.createRoom('room-2', 'test', 4, {}, mockClient);
262
+ const rooms = service.getAllRooms();
263
+ expect(rooms.size).toBe(2);
264
+ expect(rooms.has('room-1')).toBe(true);
265
+ expect(rooms.has('room-2')).toBe(true);
266
+ });
267
+ });
268
+ describe('getRoomCount', () => {
269
+ it('should return correct count', async () => {
270
+ expect(service.getRoomCount()).toBe(0);
271
+ await service.createRoom('room-1', 'test', 4, {}, mockClient);
272
+ expect(service.getRoomCount()).toBe(1);
273
+ await service.createRoom('room-2', 'test', 4, {}, mockClient);
274
+ expect(service.getRoomCount()).toBe(2);
275
+ await service.disposeRoom('room-1');
276
+ expect(service.getRoomCount()).toBe(1);
277
+ });
278
+ });
279
+ });
280
+ //# sourceMappingURL=room-manager.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-manager.service.spec.js","sourceRoot":"","sources":["../../../test/room/room-manager.service.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../test/setup.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /// <reference types="jest" />
37
+ const dotenv = __importStar(require("dotenv"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Jest 测试环境设置
41
+ */
42
+ // 加载根目录的 .env 文件
43
+ dotenv.config({ path: path.resolve(__dirname, '../../../.env') });
44
+ // 设置测试超时时间
45
+ jest.setTimeout(10000);
46
+ // 模拟环境变量(优先使用已有的环境变量)
47
+ process.env.NODE_ENV = 'test';
48
+ process.env.WORKER_ID = process.env.WORKER_ID || 'worker-test';
49
+ process.env.REDIS_HOST = process.env.REDIS_HOST || 'localhost';
50
+ process.env.REDIS_PORT = process.env.REDIS_PORT || '6379';
51
+ // 全局清理
52
+ afterAll(async () => {
53
+ // 确保所有异步操作完成
54
+ await new Promise((resolve) => setTimeout(resolve, 100));
55
+ });
56
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../test/setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8BAA8B;AAC9B,+CAAiC;AACjC,2CAA6B;AAE7B;;GAEG;AAEH,iBAAiB;AACjB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;AAElE,WAAW;AACX,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvB,sBAAsB;AACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC;AAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,aAAa,CAAC;AAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;AAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;AAE1D,OAAO;AACP,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,aAAa;IACb,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC"}