@roomkit/worker 1.1.3 → 1.3.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 +306 -55
- package/dist/src/config/config.module.d.ts +3 -0
- package/dist/src/config/config.module.d.ts.map +1 -1
- package/dist/src/config/config.module.js +16 -6
- package/dist/src/config/config.module.js.map +1 -1
- package/dist/src/config/config.service.d.ts +18 -1
- package/dist/src/config/config.service.d.ts.map +1 -1
- package/dist/src/config/config.service.js +19 -18
- package/dist/src/config/config.service.js.map +1 -1
- package/dist/src/config/worker.config.d.ts +18 -0
- package/dist/src/config/worker.config.d.ts.map +1 -1
- package/dist/src/config/worker.config.js +1 -0
- package/dist/src/config/worker.config.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +29 -18
- package/dist/src/index.js.map +1 -1
- package/dist/src/lifecycle/graceful-shutdown.service.d.ts +3 -3
- package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -1
- package/dist/src/lifecycle/graceful-shutdown.service.js +6 -6
- package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -1
- package/dist/src/migration/room-migration.service.d.ts +4 -4
- package/dist/src/migration/room-migration.service.d.ts.map +1 -1
- package/dist/src/migration/room-migration.service.js +6 -6
- package/dist/src/migration/room-migration.service.js.map +1 -1
- package/dist/src/room/message-handler.service.js +1 -1
- package/dist/src/room/message-handler.service.js.map +1 -1
- package/dist/src/room/{game-room.d.ts → room-base.d.ts} +3 -3
- package/dist/src/room/room-base.d.ts.map +1 -0
- package/dist/src/room/{game-room.js → room-base.js} +5 -5
- package/dist/src/room/room-base.js.map +1 -0
- package/dist/src/room/room-manager.service.d.ts +11 -11
- package/dist/src/room/room-manager.service.d.ts.map +1 -1
- package/dist/src/room/room-manager.service.js +2 -2
- package/dist/src/room/room-manager.service.js.map +1 -1
- package/dist/src/room/room-persistence.service.d.ts +2 -2
- package/dist/src/room/room-persistence.service.d.ts.map +1 -1
- package/dist/src/room/room-persistence.service.js +4 -4
- package/dist/src/room/room-persistence.service.js.map +1 -1
- package/dist/src/room/room.module.d.ts +1 -1
- package/dist/src/room/room.module.d.ts.map +1 -1
- package/dist/src/room/room.module.js +3 -3
- package/dist/src/room/room.module.js.map +1 -1
- package/dist/src/room/rooms/echo-room.d.ts +2 -2
- package/dist/src/room/rooms/echo-room.d.ts.map +1 -1
- package/dist/src/room/rooms/echo-room.js +2 -2
- package/dist/src/room/rooms/echo-room.js.map +1 -1
- package/dist/src/worker.module.d.ts +8 -3
- package/dist/src/worker.module.d.ts.map +1 -1
- package/dist/src/worker.module.js +10 -6
- package/dist/src/worker.module.js.map +1 -1
- package/dist/test/migration/room-migration.spec.d.ts +2 -0
- package/dist/test/migration/room-migration.spec.d.ts.map +1 -0
- package/dist/test/migration/{game-room-migration.spec.js → room-migration.spec.js} +4 -4
- package/dist/test/migration/room-migration.spec.js.map +1 -0
- package/dist/test/room/game-room.spec.js +2 -2
- package/dist/test/room/game-room.spec.js.map +1 -1
- package/dist/test/room/room-manager.service.spec.js +2 -2
- package/dist/test/room/room-manager.service.spec.js.map +1 -1
- package/package.json +25 -21
- package/dist/src/room/game-room.d.ts.map +0 -1
- package/dist/src/room/game-room.js.map +0 -1
- package/dist/test/migration/game-room-migration.spec.d.ts +0 -2
- package/dist/test/migration/game-room-migration.spec.d.ts.map +0 -1
- package/dist/test/migration/game-room-migration.spec.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,121 +1,372 @@
|
|
|
1
1
|
# @roomkit/worker
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Worker server for the RoomKit framework - manages room state and game logic.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @roomkit/worker @roomkit/core
|
|
8
|
+
npm install @roomkit/worker @roomkit/core
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
13
|
-
- 🎮 **Room
|
|
14
|
-
- 🔄 **
|
|
15
|
-
-
|
|
13
|
+
- 🎮 **Room Management** - Create and manage game rooms with state synchronization
|
|
14
|
+
- 🔄 **Message Handling** - Type-safe message handling with RoomKit protocol
|
|
15
|
+
- 💾 **State Persistence** - Optional room state persistence to Redis
|
|
16
|
+
- 🔌 **Hot Reload** - Seamless room migration between workers
|
|
17
|
+
- ��️ **Circuit Breaker** - Protection against overload with graceful degradation
|
|
16
18
|
- 📊 **Metrics** - Built-in Prometheus metrics
|
|
17
|
-
-
|
|
18
|
-
- 🚀 **Room Migration** - Move rooms between workers
|
|
19
|
+
- ⚡ **High Performance** - Optimized for low-latency multiplayer games
|
|
19
20
|
|
|
20
21
|
## Quick Start
|
|
21
22
|
|
|
22
|
-
###
|
|
23
|
+
### 1. Define Your Room
|
|
23
24
|
|
|
24
25
|
```typescript
|
|
25
|
-
import {
|
|
26
|
+
import { Room } from '@roomkit/worker';
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
interface GameState {
|
|
29
|
+
players: Map<string, Player>;
|
|
30
|
+
score: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
class GameRoom extends Room<GameState> {
|
|
28
34
|
maxClients = 4;
|
|
29
35
|
|
|
30
36
|
onCreate(options: any) {
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
this.setState({
|
|
38
|
+
players: new Map(),
|
|
39
|
+
score: 0,
|
|
40
|
+
});
|
|
33
41
|
}
|
|
34
42
|
|
|
35
|
-
onJoin(client:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
onJoin(client: Client, options?: any) {
|
|
44
|
+
this.state.players.set(client.sessionId, {
|
|
45
|
+
name: options.name,
|
|
46
|
+
x: 0,
|
|
47
|
+
y: 0,
|
|
48
|
+
});
|
|
49
|
+
this.broadcast('player-joined', { id: client.sessionId });
|
|
39
50
|
}
|
|
40
51
|
|
|
41
|
-
onMessage(client:
|
|
42
|
-
|
|
52
|
+
onMessage(client: Client, type: string, payload: any) {
|
|
53
|
+
if (type === 'move') {
|
|
54
|
+
const player = this.state.players.get(client.sessionId);
|
|
55
|
+
if (player) {
|
|
56
|
+
player.x = payload.x;
|
|
57
|
+
player.y = payload.y;
|
|
58
|
+
this.broadcast('player-moved', { id: client.sessionId, ...payload });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
43
61
|
}
|
|
44
62
|
|
|
45
|
-
onLeave(client:
|
|
46
|
-
|
|
63
|
+
onLeave(client: Client, consented: boolean) {
|
|
64
|
+
this.state.players.delete(client.sessionId);
|
|
65
|
+
this.broadcast('player-left', { id: client.sessionId });
|
|
47
66
|
}
|
|
48
67
|
}
|
|
49
68
|
```
|
|
50
69
|
|
|
51
|
-
###
|
|
70
|
+
### 2. Start the Worker
|
|
52
71
|
|
|
53
72
|
```typescript
|
|
54
|
-
import {
|
|
55
|
-
|
|
73
|
+
import { createWorker, Room } from '@roomkit/worker';
|
|
74
|
+
|
|
75
|
+
class GameRoom extends Room<GameState> { /* ... */ }
|
|
76
|
+
|
|
77
|
+
const worker = await createWorker({
|
|
78
|
+
redis: 'redis://localhost:6379',
|
|
79
|
+
rooms: [
|
|
80
|
+
{ name: 'game', room: GameRoom }
|
|
81
|
+
],
|
|
82
|
+
admin: {
|
|
83
|
+
port: 28200
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
await worker.listen();
|
|
88
|
+
console.log(\`Worker listening on admin port \${worker.adminPort}\`);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Configuration
|
|
56
92
|
|
|
57
|
-
|
|
93
|
+
### Redis Configuration
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// Option 1: URL string
|
|
97
|
+
redis: 'redis://:password@localhost:6379/0'
|
|
98
|
+
|
|
99
|
+
// Option 2: Object
|
|
100
|
+
redis: {
|
|
101
|
+
host: 'localhost',
|
|
102
|
+
port: 6379,
|
|
103
|
+
password: 'your-password',
|
|
104
|
+
db: 0
|
|
105
|
+
}
|
|
58
106
|
```
|
|
59
107
|
|
|
60
|
-
###
|
|
108
|
+
### Room Registration
|
|
61
109
|
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
|
|
110
|
+
```typescript
|
|
111
|
+
rooms: [
|
|
112
|
+
{
|
|
113
|
+
name: 'lobby', // Room type name
|
|
114
|
+
room: LobbyRoom // Room class
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'game',
|
|
118
|
+
room: GameRoom
|
|
119
|
+
},
|
|
120
|
+
]
|
|
121
|
+
```
|
|
65
122
|
|
|
66
|
-
|
|
67
|
-
REDIS_HOST=localhost
|
|
68
|
-
REDIS_PORT=6379
|
|
69
|
-
REDIS_PASSWORD=
|
|
123
|
+
### Circuit Breaker
|
|
70
124
|
|
|
71
|
-
|
|
72
|
-
|
|
125
|
+
```typescript
|
|
126
|
+
circuitBreaker: {
|
|
127
|
+
maxRooms: 1000, // Max rooms per worker (default: 1000)
|
|
128
|
+
maxPendingRequests: 100, // Max pending room creation requests (default: 100)
|
|
129
|
+
enabled: true, // Enable circuit breaker (default: true)
|
|
130
|
+
failureThreshold: 5, // Failures before opening (default: 5)
|
|
131
|
+
successThreshold: 2, // Successes before closing (default: 2)
|
|
132
|
+
timeout: 10000, // Timeout in ms (default: 10000)
|
|
133
|
+
resetTimeout: 30000, // Reset timeout in ms (default: 30000)
|
|
134
|
+
}
|
|
73
135
|
```
|
|
74
136
|
|
|
75
|
-
###
|
|
137
|
+
### State Persistence
|
|
76
138
|
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
|
|
139
|
+
```typescript
|
|
140
|
+
persistence: {
|
|
141
|
+
enabled: true, // Enable persistence (default: false)
|
|
142
|
+
saveInterval: 5000, // Auto-save interval in ms (default: 5000)
|
|
143
|
+
loadOnCreate: true, // Load state on room creation (default: true)
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Admin API
|
|
80
148
|
|
|
81
|
-
|
|
82
|
-
|
|
149
|
+
```typescript
|
|
150
|
+
admin: {
|
|
151
|
+
port: 28200, // Admin API port (default: 28200)
|
|
152
|
+
enabled: true // Enable admin API (default: true)
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Complete Example
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import { createWorker, Room } from '@roomkit/worker';
|
|
160
|
+
import { LobbyRoom } from './rooms/LobbyRoom';
|
|
161
|
+
|
|
162
|
+
class GameRoom extends Room<GameState> { /* ... */ }
|
|
163
|
+
|
|
164
|
+
const worker = await createWorker({
|
|
165
|
+
// Optional: Custom worker ID (auto-generated if not provided)
|
|
166
|
+
id: 'worker-1',
|
|
167
|
+
|
|
168
|
+
// Redis configuration (required)
|
|
169
|
+
redis: {
|
|
170
|
+
host: process.env.REDIS_HOST || 'localhost',
|
|
171
|
+
port: parseInt(process.env.REDIS_PORT || '6379'),
|
|
172
|
+
password: process.env.REDIS_PASSWORD,
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
// Room definitions (required)
|
|
176
|
+
rooms: [
|
|
177
|
+
{ name: 'lobby', room: LobbyRoom },
|
|
178
|
+
{ name: 'game', room: GameRoom },
|
|
179
|
+
],
|
|
180
|
+
|
|
181
|
+
// Circuit breaker configuration
|
|
182
|
+
circuitBreaker: {
|
|
183
|
+
maxRooms: 1000,
|
|
184
|
+
maxPendingRequests: 100,
|
|
185
|
+
enabled: true,
|
|
186
|
+
failureThreshold: 5,
|
|
187
|
+
successThreshold: 2,
|
|
188
|
+
timeout: 10000,
|
|
189
|
+
resetTimeout: 30000,
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
// State persistence
|
|
193
|
+
persistence: {
|
|
194
|
+
enabled: true,
|
|
195
|
+
saveInterval: 5000,
|
|
196
|
+
loadOnCreate: true,
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
// Admin API
|
|
200
|
+
admin: {
|
|
201
|
+
port: 28200,
|
|
202
|
+
enabled: true,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Start the worker
|
|
207
|
+
await worker.listen();
|
|
208
|
+
|
|
209
|
+
// Graceful shutdown
|
|
210
|
+
process.on('SIGTERM', async () => {
|
|
211
|
+
await worker.close();
|
|
212
|
+
process.exit(0);
|
|
213
|
+
});
|
|
83
214
|
```
|
|
84
215
|
|
|
85
216
|
## Room Lifecycle
|
|
86
217
|
|
|
87
218
|
```typescript
|
|
88
|
-
class
|
|
89
|
-
|
|
90
|
-
|
|
219
|
+
class MyRoom extends Room<MyState> {
|
|
220
|
+
// Called when room is created
|
|
221
|
+
onCreate(options: any) {
|
|
222
|
+
this.setState({ ... });
|
|
91
223
|
}
|
|
92
224
|
|
|
93
|
-
|
|
94
|
-
|
|
225
|
+
// Called when a client joins
|
|
226
|
+
onJoin(client: Client, options?: any) {
|
|
227
|
+
// Add player to state
|
|
95
228
|
}
|
|
96
229
|
|
|
97
|
-
|
|
98
|
-
|
|
230
|
+
// Called when client sends a message
|
|
231
|
+
onMessage(client: Client, type: string, payload: any) {
|
|
232
|
+
// Handle game logic
|
|
99
233
|
}
|
|
100
234
|
|
|
101
|
-
|
|
102
|
-
|
|
235
|
+
// Called when a client leaves
|
|
236
|
+
onLeave(client: Client, consented: boolean) {
|
|
237
|
+
// Remove player from state
|
|
103
238
|
}
|
|
104
239
|
|
|
240
|
+
// Called before room is destroyed
|
|
105
241
|
onDispose() {
|
|
106
|
-
//
|
|
242
|
+
// Cleanup resources
|
|
107
243
|
}
|
|
108
244
|
}
|
|
109
245
|
```
|
|
110
246
|
|
|
247
|
+
## Room API
|
|
248
|
+
|
|
249
|
+
### Broadcasting
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// Broadcast to all clients
|
|
253
|
+
this.broadcast('event-type', { data: 'value' });
|
|
254
|
+
|
|
255
|
+
// Broadcast to all except one
|
|
256
|
+
this.broadcast('event-type', { data: 'value' }, { except: client });
|
|
257
|
+
|
|
258
|
+
// Send to specific client
|
|
259
|
+
client.send('event-type', { data: 'value' });
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### State Management
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
// Set initial state
|
|
266
|
+
this.setState({ score: 0, players: new Map() });
|
|
267
|
+
|
|
268
|
+
// Update state (triggers automatic sync to clients)
|
|
269
|
+
this.state.score += 10;
|
|
270
|
+
this.state.players.set(id, player);
|
|
271
|
+
|
|
272
|
+
// Lock for atomic updates
|
|
273
|
+
this.lock.acquire('update-score', async () => {
|
|
274
|
+
this.state.score += 10;
|
|
275
|
+
});
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Room Metadata
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
// Set custom metadata (visible in lobby)
|
|
282
|
+
this.setMetadata({
|
|
283
|
+
mapName: 'Forest',
|
|
284
|
+
difficulty: 'Hard'
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// Set if room is private
|
|
288
|
+
this.setPrivate(true);
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Environment Variables
|
|
292
|
+
|
|
293
|
+
The worker supports basic environment variables for infrastructure configuration:
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# Redis (infrastructure)
|
|
297
|
+
REDIS_HOST=localhost
|
|
298
|
+
REDIS_PORT=6379
|
|
299
|
+
REDIS_PASSWORD=your-password
|
|
300
|
+
|
|
301
|
+
# Note: Application-level configs (circuit breaker, persistence, etc.)
|
|
302
|
+
# should be passed via code parameters for better type safety.
|
|
303
|
+
```
|
|
304
|
+
|
|
111
305
|
## Admin API
|
|
112
306
|
|
|
113
|
-
|
|
307
|
+
### Health Check
|
|
308
|
+
```bash
|
|
309
|
+
GET http://localhost:28200/health
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Metrics
|
|
313
|
+
```bash
|
|
314
|
+
GET http://localhost:28200/metrics
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Room Stats
|
|
318
|
+
```bash
|
|
319
|
+
GET http://localhost:28200/admin/rooms
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Docker
|
|
323
|
+
|
|
324
|
+
```dockerfile
|
|
325
|
+
FROM node:20-alpine
|
|
326
|
+
WORKDIR /app
|
|
327
|
+
COPY package*.json ./
|
|
328
|
+
RUN npm install
|
|
329
|
+
COPY . .
|
|
330
|
+
EXPOSE 28200
|
|
331
|
+
CMD ["node", "worker.js"]
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
docker run -p 28200:28200 \
|
|
336
|
+
-e REDIS_HOST=redis \
|
|
337
|
+
-e REDIS_PORT=6379 \
|
|
338
|
+
my-worker
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## Production Deployment
|
|
342
|
+
|
|
343
|
+
### Horizontal Scaling
|
|
344
|
+
|
|
345
|
+
Run multiple worker instances:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Worker 1
|
|
349
|
+
node worker.js --id worker-1
|
|
350
|
+
|
|
351
|
+
# Worker 2
|
|
352
|
+
node worker.js --id worker-2
|
|
353
|
+
|
|
354
|
+
# Workers register automatically via Redis
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Monitoring
|
|
358
|
+
|
|
359
|
+
- Monitor room count, client count, message rate
|
|
360
|
+
- Set up alerts for circuit breaker triggers
|
|
361
|
+
- Track room creation/disposal rates
|
|
362
|
+
|
|
363
|
+
### Best Practices
|
|
114
364
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
365
|
+
1. **Set maxRooms** based on your server capacity
|
|
366
|
+
2. **Enable persistence** for important game state
|
|
367
|
+
3. **Use circuit breaker** to prevent overload
|
|
368
|
+
4. **Implement proper cleanup** in onDispose()
|
|
369
|
+
5. **Handle errors gracefully** in onMessage()
|
|
119
370
|
|
|
120
371
|
## License
|
|
121
372
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.module.d.ts","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.module.d.ts","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAiB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,qBAEa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,aAAa;CAYrE"}
|
|
@@ -5,18 +5,28 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
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
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var ConfigModule_1;
|
|
8
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
10
|
exports.ConfigModule = void 0;
|
|
10
11
|
const common_1 = require("@nestjs/common");
|
|
11
12
|
const config_service_1 = require("./config.service");
|
|
12
|
-
let ConfigModule = class ConfigModule {
|
|
13
|
+
let ConfigModule = ConfigModule_1 = class ConfigModule {
|
|
14
|
+
static forRoot(config) {
|
|
15
|
+
return {
|
|
16
|
+
module: ConfigModule_1,
|
|
17
|
+
providers: [
|
|
18
|
+
{
|
|
19
|
+
provide: config_service_1.ConfigService,
|
|
20
|
+
useValue: new config_service_1.ConfigService(config),
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
exports: [config_service_1.ConfigService],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
13
26
|
};
|
|
14
27
|
exports.ConfigModule = ConfigModule;
|
|
15
|
-
exports.ConfigModule = ConfigModule = __decorate([
|
|
28
|
+
exports.ConfigModule = ConfigModule = ConfigModule_1 = __decorate([
|
|
16
29
|
(0, common_1.Global)(),
|
|
17
|
-
(0, common_1.Module)({
|
|
18
|
-
providers: [config_service_1.ConfigService],
|
|
19
|
-
exports: [config_service_1.ConfigService],
|
|
20
|
-
})
|
|
30
|
+
(0, common_1.Module)({})
|
|
21
31
|
], ConfigModule);
|
|
22
32
|
//# sourceMappingURL=config.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,qDAAsE;AAI/D,IAAM,YAAY,oBAAlB,MAAM,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,MAAqC;QAClD,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,8BAAa;oBACtB,QAAQ,EAAE,IAAI,8BAAa,CAAC,MAAM,CAAC;iBACpC;aACF;YACD,OAAO,EAAE,CAAC,8BAAa,CAAC;SACzB,CAAC;IACJ,CAAC;CACF,CAAA;AAbY,oCAAY;uBAAZ,YAAY;IAFxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,YAAY,CAaxB"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
export interface WorkerConfigOptions {
|
|
2
|
+
workerId: string;
|
|
3
|
+
adminPort: number;
|
|
4
|
+
redisHost: string;
|
|
5
|
+
redisPort: number;
|
|
6
|
+
redisPassword?: string;
|
|
7
|
+
maxRooms: number;
|
|
8
|
+
circuitFailureThreshold: number;
|
|
9
|
+
circuitSuccessThreshold: number;
|
|
10
|
+
circuitOpenTimeout: number;
|
|
11
|
+
maxPendingRequests: number;
|
|
12
|
+
persistenceEnabled: boolean;
|
|
13
|
+
snapshotInterval: number;
|
|
14
|
+
eventFlushInterval: number;
|
|
15
|
+
snapshotTTL: number;
|
|
16
|
+
eventTTL: number;
|
|
17
|
+
}
|
|
1
18
|
export declare class ConfigService {
|
|
2
19
|
readonly workerId: string;
|
|
3
20
|
readonly adminPort: number;
|
|
@@ -14,6 +31,6 @@ export declare class ConfigService {
|
|
|
14
31
|
readonly eventFlushInterval: number;
|
|
15
32
|
readonly snapshotTTL: number;
|
|
16
33
|
readonly eventTTL: number;
|
|
17
|
-
constructor();
|
|
34
|
+
constructor(config?: Partial<WorkerConfigOptions>);
|
|
18
35
|
}
|
|
19
36
|
//# sourceMappingURL=config.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"AAGA,qBACa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,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,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAGpC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBACa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,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,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAGpC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;CAsBlD"}
|
|
@@ -30,29 +30,30 @@ let ConfigService = class ConfigService {
|
|
|
30
30
|
eventFlushInterval;
|
|
31
31
|
snapshotTTL;
|
|
32
32
|
eventTTL;
|
|
33
|
-
constructor() {
|
|
34
|
-
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
this.
|
|
33
|
+
constructor(config) {
|
|
34
|
+
// 优先使用传入的配置,其次使用环境变量(仅支持 REDIS_* 用于基础设施)
|
|
35
|
+
this.workerId = config?.workerId || process.env.WORKER_ID || `worker-${(0, uuid_1.v4)().substring(0, 8)}`;
|
|
36
|
+
this.adminPort = config?.adminPort || parseInt(process.env.WORKER_ADMIN_PORT || '28200', 10);
|
|
37
|
+
this.redisHost = config?.redisHost || process.env.REDIS_HOST || 'localhost';
|
|
38
|
+
this.redisPort = config?.redisPort || parseInt(process.env.REDIS_PORT || '6379', 10);
|
|
39
|
+
this.redisPassword = config?.redisPassword || process.env.REDIS_PASSWORD;
|
|
40
|
+
this.maxRooms = config?.maxRooms || parseInt(process.env.MAX_ROOMS || '500', 10);
|
|
40
41
|
// 熔断器配置
|
|
41
|
-
this.circuitFailureThreshold = parseInt(process.env.
|
|
42
|
-
this.circuitSuccessThreshold = parseInt(process.env.
|
|
43
|
-
this.circuitOpenTimeout = parseInt(process.env.
|
|
44
|
-
this.maxPendingRequests = parseInt(process.env.
|
|
45
|
-
//
|
|
46
|
-
this.persistenceEnabled = process.env.
|
|
47
|
-
this.snapshotInterval = parseInt(process.env.
|
|
48
|
-
this.eventFlushInterval = parseInt(process.env.
|
|
49
|
-
this.snapshotTTL = parseInt(process.env.
|
|
50
|
-
this.eventTTL = parseInt(process.env.
|
|
42
|
+
this.circuitFailureThreshold = config?.circuitFailureThreshold || parseInt(process.env.CIRCUIT_FAILURE_THRESHOLD || '10', 10);
|
|
43
|
+
this.circuitSuccessThreshold = config?.circuitSuccessThreshold || parseInt(process.env.CIRCUIT_SUCCESS_THRESHOLD || '5', 10);
|
|
44
|
+
this.circuitOpenTimeout = config?.circuitOpenTimeout || parseInt(process.env.CIRCUIT_OPEN_TIMEOUT || '30000', 10);
|
|
45
|
+
this.maxPendingRequests = config?.maxPendingRequests || parseInt(process.env.MAX_PENDING_REQUESTS || '1000', 10);
|
|
46
|
+
// 持久化配置(默认禁用)
|
|
47
|
+
this.persistenceEnabled = config?.persistenceEnabled ?? (process.env.PERSISTENCE_ENABLED === 'true');
|
|
48
|
+
this.snapshotInterval = config?.snapshotInterval || parseInt(process.env.SNAPSHOT_INTERVAL || '10000', 10);
|
|
49
|
+
this.eventFlushInterval = config?.eventFlushInterval || parseInt(process.env.EVENT_FLUSH_INTERVAL || '1000', 10);
|
|
50
|
+
this.snapshotTTL = config?.snapshotTTL || parseInt(process.env.SNAPSHOT_TTL || '3600', 10);
|
|
51
|
+
this.eventTTL = config?.eventTTL || parseInt(process.env.EVENT_TTL || '3600', 10);
|
|
51
52
|
}
|
|
52
53
|
};
|
|
53
54
|
exports.ConfigService = ConfigService;
|
|
54
55
|
exports.ConfigService = ConfigService = __decorate([
|
|
55
56
|
(0, common_1.Injectable)(),
|
|
56
|
-
__metadata("design:paramtypes", [])
|
|
57
|
+
__metadata("design:paramtypes", [Object])
|
|
57
58
|
], ConfigService);
|
|
58
59
|
//# sourceMappingURL=config.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+BAAkC;
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,20 @@ export interface CircuitBreakerConfig {
|
|
|
20
20
|
successThreshold?: number;
|
|
21
21
|
/** Time to wait before trying again (ms) */
|
|
22
22
|
openTimeout?: number;
|
|
23
|
+
/** Maximum pending requests */
|
|
24
|
+
maxPendingRequests?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface PersistenceConfig {
|
|
27
|
+
/** Enable persistence */
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
/** Snapshot interval in milliseconds */
|
|
30
|
+
snapshotInterval?: number;
|
|
31
|
+
/** Event flush interval in milliseconds */
|
|
32
|
+
eventFlushInterval?: number;
|
|
33
|
+
/** Snapshot TTL in seconds */
|
|
34
|
+
snapshotTTL?: number;
|
|
35
|
+
/** Event TTL in seconds */
|
|
36
|
+
eventTTL?: number;
|
|
23
37
|
}
|
|
24
38
|
export interface AdminConfig {
|
|
25
39
|
/** Admin API port */
|
|
@@ -50,12 +64,16 @@ export interface WorkerConfig {
|
|
|
50
64
|
id?: string;
|
|
51
65
|
/** Redis configuration */
|
|
52
66
|
redis: RedisConfig | string;
|
|
67
|
+
/** Maximum number of rooms this worker can handle */
|
|
68
|
+
maxRooms?: number;
|
|
53
69
|
/** Room types to register */
|
|
54
70
|
rooms?: Record<string, new (...args: any[]) => any>;
|
|
55
71
|
/** Circuit breaker configuration */
|
|
56
72
|
circuitBreaker?: CircuitBreakerConfig;
|
|
57
73
|
/** Admin API configuration */
|
|
58
74
|
admin?: AdminConfig;
|
|
75
|
+
/** Persistence configuration */
|
|
76
|
+
persistence?: PersistenceConfig;
|
|
59
77
|
/**
|
|
60
78
|
* Custom authentication handler
|
|
61
79
|
* If not provided, uses default pass-through authentication (token = userId)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.config.d.ts","sourceRoot":"","sources":["../../../src/config/worker.config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.config.d.ts","sourceRoot":"","sources":["../../../src/config/worker.config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACpD,oCAAoC;IACpC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gCAAgC;IAChC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,CAW9E;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,oBAAoB,CAKzE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAGtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.config.js","sourceRoot":"","sources":["../../../src/config/worker.config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"worker.config.js","sourceRoot":"","sources":["../../../src/config/worker.config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAmGH,oDAWC;AAdD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAA4B;IAC/D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;YAChC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS;YACnC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACU,QAAA,8BAA8B,GAAmC;IAC5E,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,KAAK;IAClB,kBAAkB,EAAE,IAAI;CACzB,CAAC;AAEW,QAAA,oBAAoB,GAA0B;IACzD,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,IAAI;CACd,CAAC"}
|