@roomkit/gateway 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 +182 -47
- 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 +17 -1
- package/dist/src/config/config.service.d.ts.map +1 -1
- package/dist/src/config/config.service.js +17 -16
- package/dist/src/config/config.service.js.map +1 -1
- package/dist/src/config/gateway.config.d.ts +2 -0
- package/dist/src/config/gateway.config.d.ts.map +1 -1
- package/dist/src/config/gateway.config.js +1 -0
- package/dist/src/config/gateway.config.js.map +1 -1
- package/dist/src/gateway.module.d.ts +2 -0
- package/dist/src/gateway.module.d.ts.map +1 -1
- package/dist/src/gateway.module.js +1 -1
- package/dist/src/gateway.module.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +21 -16
- package/dist/src/index.js.map +1 -1
- package/dist/src/ws/message-router.service.d.ts.map +1 -1
- package/dist/src/ws/message-router.service.js +6 -6
- package/dist/src/ws/message-router.service.js.map +1 -1
- package/package.json +25 -21
- package/dist/test/connection/connection.service.spec.d.ts +0 -2
- package/dist/test/connection/connection.service.spec.d.ts.map +0 -1
- package/dist/test/connection/connection.service.spec.js +0 -204
- package/dist/test/connection/connection.service.spec.js.map +0 -1
- package/dist/test/e2e/gateway-worker.e2e.spec.d.ts +0 -2
- package/dist/test/e2e/gateway-worker.e2e.spec.d.ts.map +0 -1
- package/dist/test/e2e/gateway-worker.e2e.spec.js +0 -412
- package/dist/test/e2e/gateway-worker.e2e.spec.js.map +0 -1
- package/dist/test/integration/admin-api.spec.d.ts +0 -2
- package/dist/test/integration/admin-api.spec.d.ts.map +0 -1
- package/dist/test/integration/admin-api.spec.js +0 -218
- package/dist/test/integration/admin-api.spec.js.map +0 -1
- package/dist/test/ratelimit/rate-limiter.service.spec.d.ts +0 -2
- package/dist/test/ratelimit/rate-limiter.service.spec.d.ts.map +0 -1
- package/dist/test/ratelimit/rate-limiter.service.spec.js +0 -139
- package/dist/test/ratelimit/rate-limiter.service.spec.js.map +0 -1
- package/dist/test/setup.d.ts +0 -2
- package/dist/test/setup.d.ts.map +0 -1
- package/dist/test/setup.js +0 -56
- package/dist/test/setup.js.map +0 -1
- package/dist/test/ws/message-router.service.spec.d.ts +0 -2
- package/dist/test/ws/message-router.service.spec.d.ts.map +0 -1
- package/dist/test/ws/message-router.service.spec.js +0 -403
- package/dist/test/ws/message-router.service.spec.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @roomkit/gateway
|
|
2
2
|
|
|
3
|
-
WebSocket Gateway server for the RoomKit framework.
|
|
3
|
+
WebSocket Gateway server for the RoomKit framework - handles client connections and routes messages to workers.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -12,81 +12,216 @@ npm install @roomkit/gateway @roomkit/core
|
|
|
12
12
|
|
|
13
13
|
- 🌐 **WebSocket Server** - High-performance WebSocket connections
|
|
14
14
|
- 🔄 **Message Routing** - Route messages between clients and workers
|
|
15
|
-
- 📊 **Metrics** - Built-in Prometheus metrics
|
|
16
|
-
- 🔒 **Rate Limiting** - Protect against abuse
|
|
15
|
+
- 📊 **Metrics & Monitoring** - Built-in Prometheus metrics
|
|
16
|
+
- 🔒 **Rate Limiting** - Protect against abuse with configurable limits
|
|
17
17
|
- 💪 **Session Management** - Persistent sessions with Redis
|
|
18
|
-
- 🔌 **Horizontal Scaling** -
|
|
18
|
+
- 🔌 **Horizontal Scaling** - Run multiple gateway instances
|
|
19
|
+
- ⚡ **Production Ready** - Battle-tested in production environments
|
|
19
20
|
|
|
20
21
|
## Quick Start
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
```typescript
|
|
24
|
+
import { createGateway } from '@roomkit/gateway';
|
|
25
|
+
|
|
26
|
+
const gateway = await createGateway({
|
|
27
|
+
redis: 'redis://localhost:6379',
|
|
28
|
+
ws: {
|
|
29
|
+
port: 27100,
|
|
30
|
+
maxConnections: 10000
|
|
31
|
+
},
|
|
32
|
+
admin: {
|
|
33
|
+
port: 27200
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
await gateway.listen();
|
|
38
|
+
console.log(\`Gateway listening on port \${gateway.wsPort}\`);
|
|
39
|
+
```
|
|
23
40
|
|
|
24
|
-
|
|
25
|
-
# Server
|
|
26
|
-
PORT=27100
|
|
27
|
-
ADMIN_PORT=27200
|
|
41
|
+
## Configuration
|
|
28
42
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
43
|
+
### Redis Configuration
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Option 1: URL string
|
|
47
|
+
redis: 'redis://:password@localhost:6379/0'
|
|
33
48
|
|
|
34
|
-
|
|
35
|
-
|
|
49
|
+
// Option 2: Object
|
|
50
|
+
redis: {
|
|
51
|
+
host: 'localhost',
|
|
52
|
+
port: 6379,
|
|
53
|
+
password: 'your-password',
|
|
54
|
+
db: 0
|
|
55
|
+
}
|
|
36
56
|
```
|
|
37
57
|
|
|
38
|
-
###
|
|
58
|
+
### WebSocket Configuration
|
|
39
59
|
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
|
|
60
|
+
```typescript
|
|
61
|
+
ws: {
|
|
62
|
+
port: 27100, // WebSocket port (default: 27100)
|
|
63
|
+
maxConnections: 10000, // Max concurrent connections (default: 10000)
|
|
64
|
+
heartbeatInterval: 30000, // Heartbeat interval in ms (default: 30000)
|
|
65
|
+
heartbeatTimeout: 90000, // Heartbeat timeout in ms (default: 90000)
|
|
66
|
+
idleConnectionTimeout: 60000, // Idle timeout after auth in ms (default: 60000)
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Rate Limiting
|
|
43
71
|
|
|
44
|
-
|
|
45
|
-
|
|
72
|
+
```typescript
|
|
73
|
+
rateLimit: {
|
|
74
|
+
connections: 100, // New connections per second (default: 100)
|
|
75
|
+
messages: 50, // Messages per connection per second (default: 50)
|
|
76
|
+
burst: 100, // Message burst limit (default: 100)
|
|
77
|
+
global: 50000, // Global messages per second (default: 50000)
|
|
78
|
+
}
|
|
46
79
|
```
|
|
47
80
|
|
|
48
|
-
###
|
|
81
|
+
### Admin API
|
|
49
82
|
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
roomkit/gateway
|
|
83
|
+
```typescript
|
|
84
|
+
admin: {
|
|
85
|
+
port: 27200, // Admin API port (default: 27200)
|
|
86
|
+
enabled: true // Enable admin API (default: true)
|
|
87
|
+
}
|
|
56
88
|
```
|
|
57
89
|
|
|
58
|
-
##
|
|
90
|
+
## Complete Example
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { createGateway } from '@roomkit/gateway';
|
|
94
|
+
|
|
95
|
+
const gateway = await createGateway({
|
|
96
|
+
// Optional: Custom gateway ID (auto-generated if not provided)
|
|
97
|
+
id: 'gateway-1',
|
|
98
|
+
|
|
99
|
+
// Redis configuration (required)
|
|
100
|
+
redis: {
|
|
101
|
+
host: process.env.REDIS_HOST || 'localhost',
|
|
102
|
+
port: parseInt(process.env.REDIS_PORT || '6379'),
|
|
103
|
+
password: process.env.REDIS_PASSWORD,
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
// WebSocket configuration
|
|
107
|
+
ws: {
|
|
108
|
+
port: 27100,
|
|
109
|
+
maxConnections: 10000,
|
|
110
|
+
heartbeatInterval: 30000,
|
|
111
|
+
heartbeatTimeout: 90000,
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
// Rate limiting
|
|
115
|
+
rateLimit: {
|
|
116
|
+
connections: 100,
|
|
117
|
+
messages: 50,
|
|
118
|
+
burst: 100,
|
|
119
|
+
global: 50000,
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
// Admin API
|
|
123
|
+
admin: {
|
|
124
|
+
port: 27200,
|
|
125
|
+
enabled: true,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// Start the gateway
|
|
130
|
+
await gateway.listen();
|
|
131
|
+
|
|
132
|
+
// Graceful shutdown
|
|
133
|
+
process.on('SIGTERM', async () => {
|
|
134
|
+
await gateway.close();
|
|
135
|
+
process.exit(0);
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Environment Variables
|
|
59
140
|
|
|
60
|
-
|
|
141
|
+
The gateway supports basic environment variables for infrastructure configuration:
|
|
61
142
|
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
ADMIN_PORT=27200
|
|
143
|
+
```bash
|
|
144
|
+
# Redis (infrastructure)
|
|
65
145
|
REDIS_HOST=localhost
|
|
66
146
|
REDIS_PORT=6379
|
|
67
|
-
|
|
147
|
+
REDIS_PASSWORD=your-password
|
|
148
|
+
|
|
149
|
+
# Note: Application-level configs (ports, limits, etc.) should be
|
|
150
|
+
# passed via code parameters for better type safety and clarity.
|
|
68
151
|
```
|
|
69
152
|
|
|
70
153
|
## Admin API
|
|
71
154
|
|
|
72
|
-
The gateway provides an admin API
|
|
155
|
+
The gateway provides an HTTP admin API for monitoring and management:
|
|
156
|
+
|
|
157
|
+
### Health Check
|
|
158
|
+
\`\`\`bash
|
|
159
|
+
GET http://localhost:27200/health
|
|
160
|
+
\`\`\`
|
|
161
|
+
|
|
162
|
+
### Metrics
|
|
163
|
+
\`\`\`bash
|
|
164
|
+
GET http://localhost:27200/metrics
|
|
165
|
+
\`\`\`
|
|
166
|
+
|
|
167
|
+
### Connection Stats
|
|
168
|
+
\`\`\`bash
|
|
169
|
+
GET http://localhost:27200/admin/stats
|
|
170
|
+
\`\`\`
|
|
171
|
+
|
|
172
|
+
### List Connections
|
|
173
|
+
\`\`\`bash
|
|
174
|
+
GET http://localhost:27200/admin/connections
|
|
175
|
+
\`\`\`
|
|
176
|
+
|
|
177
|
+
## Docker
|
|
178
|
+
|
|
179
|
+
```dockerfile
|
|
180
|
+
FROM node:20-alpine
|
|
181
|
+
WORKDIR /app
|
|
182
|
+
COPY package*.json ./
|
|
183
|
+
RUN npm install
|
|
184
|
+
COPY . .
|
|
185
|
+
EXPOSE 27100 27200
|
|
186
|
+
CMD ["node", "gateway.js"]
|
|
187
|
+
```
|
|
73
188
|
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
189
|
+
```bash
|
|
190
|
+
docker run -p 27100:27100 -p 27200:27200 \
|
|
191
|
+
-e REDIS_HOST=redis \
|
|
192
|
+
-e REDIS_PORT=6379 \
|
|
193
|
+
my-gateway
|
|
194
|
+
```
|
|
78
195
|
|
|
79
|
-
##
|
|
196
|
+
## Production Deployment
|
|
80
197
|
|
|
198
|
+
### Multiple Instances
|
|
199
|
+
|
|
200
|
+
Run multiple gateway instances behind a load balancer:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Gateway 1
|
|
204
|
+
node gateway.js --id gateway-1 --port 27100
|
|
205
|
+
|
|
206
|
+
# Gateway 2
|
|
207
|
+
node gateway.js --id gateway-2 --port 27101
|
|
208
|
+
|
|
209
|
+
# Load balancer (nginx, haproxy, etc.)
|
|
81
210
|
```
|
|
82
|
-
Client <--WebSocket--> Gateway <--Redis--> Worker
|
|
83
|
-
```
|
|
84
211
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
212
|
+
### Monitoring
|
|
213
|
+
|
|
214
|
+
- Use the \`/metrics\` endpoint for Prometheus
|
|
215
|
+
- Monitor connection count, message rate, error rate
|
|
216
|
+
- Set up alerts for rate limit triggers
|
|
217
|
+
|
|
218
|
+
### Best Practices
|
|
219
|
+
|
|
220
|
+
1. **Set appropriate rate limits** based on your game's needs
|
|
221
|
+
2. **Monitor memory usage** - adjust maxConnections if needed
|
|
222
|
+
3. **Use Redis cluster** for high availability
|
|
223
|
+
4. **Enable connection pooling** in your load balancer
|
|
224
|
+
5. **Set up health checks** on \`/health\` endpoint
|
|
90
225
|
|
|
91
226
|
## License
|
|
92
227
|
|
|
@@ -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,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,qBAEa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,aAAa;CAYtE"}
|
|
@@ -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,qDAAuE;AAIhE,IAAM,YAAY,oBAAlB,MAAM,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,MAAsC;QACnD,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,19 @@
|
|
|
1
|
+
export interface GatewayConfigOptions {
|
|
2
|
+
gatewayId: string;
|
|
3
|
+
port: number;
|
|
4
|
+
adminPort: number;
|
|
5
|
+
redisHost: string;
|
|
6
|
+
redisPort: number;
|
|
7
|
+
redisPassword?: string;
|
|
8
|
+
heartbeatInterval: number;
|
|
9
|
+
heartbeatTimeout: number;
|
|
10
|
+
maxConnections: number;
|
|
11
|
+
idleConnectionTimeout: number;
|
|
12
|
+
connectionRateLimit: number;
|
|
13
|
+
messageRateLimitPerConnection: number;
|
|
14
|
+
messageBurstLimit: number;
|
|
15
|
+
globalMessageRateLimit: number;
|
|
16
|
+
}
|
|
1
17
|
export declare class ConfigService {
|
|
2
18
|
readonly gatewayId: string;
|
|
3
19
|
readonly port: number;
|
|
@@ -14,6 +30,6 @@ export declare class ConfigService {
|
|
|
14
30
|
readonly messageRateLimitPerConnection: number;
|
|
15
31
|
readonly messageBurstLimit: number;
|
|
16
32
|
readonly globalMessageRateLimit: number;
|
|
17
|
-
constructor();
|
|
33
|
+
constructor(config?: Partial<GatewayConfigOptions>);
|
|
18
34
|
}
|
|
19
35
|
//# 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,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,kCAAkC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAGvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,6BAA6B,EAAE,MAAM,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,qBACa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,kCAAkC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAGvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;gBAE5B,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;CAmBnD"}
|
|
@@ -29,27 +29,28 @@ let ConfigService = class ConfigService {
|
|
|
29
29
|
messageRateLimitPerConnection;
|
|
30
30
|
messageBurstLimit;
|
|
31
31
|
globalMessageRateLimit;
|
|
32
|
-
constructor() {
|
|
33
|
-
|
|
34
|
-
this.
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
this.
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
32
|
+
constructor(config) {
|
|
33
|
+
// 优先使用传入的配置,其次使用环境变量(仅支持 REDIS_* 用于基础设施)
|
|
34
|
+
this.gatewayId = config?.gatewayId || process.env.GATEWAY_ID || `gateway-${(0, uuid_1.v4)().substring(0, 8)}`;
|
|
35
|
+
this.port = config?.port || parseInt(process.env.GATEWAY_PORT || '27100', 10);
|
|
36
|
+
this.adminPort = config?.adminPort || parseInt(process.env.GATEWAY_ADMIN_PORT || '27200', 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.heartbeatInterval = config?.heartbeatInterval || parseInt(process.env.HEARTBEAT_INTERVAL || '30000', 10);
|
|
41
|
+
this.heartbeatTimeout = config?.heartbeatTimeout || parseInt(process.env.HEARTBEAT_TIMEOUT || '90000', 10);
|
|
42
|
+
this.maxConnections = config?.maxConnections || parseInt(process.env.MAX_CONNECTIONS || '10000', 10);
|
|
43
|
+
this.idleConnectionTimeout = config?.idleConnectionTimeout || parseInt(process.env.IDLE_CONNECTION_TIMEOUT || '60000', 10);
|
|
43
44
|
// 限流配置
|
|
44
|
-
this.connectionRateLimit = parseInt(process.env.
|
|
45
|
-
this.messageRateLimitPerConnection = parseInt(process.env.
|
|
46
|
-
this.messageBurstLimit = parseInt(process.env.
|
|
47
|
-
this.globalMessageRateLimit = parseInt(process.env.
|
|
45
|
+
this.connectionRateLimit = config?.connectionRateLimit || parseInt(process.env.CONNECTION_RATE_LIMIT || '100', 10);
|
|
46
|
+
this.messageRateLimitPerConnection = config?.messageRateLimitPerConnection || parseInt(process.env.MESSAGE_RATE_LIMIT || '50', 10);
|
|
47
|
+
this.messageBurstLimit = config?.messageBurstLimit || parseInt(process.env.MESSAGE_BURST_LIMIT || '100', 10);
|
|
48
|
+
this.globalMessageRateLimit = config?.globalMessageRateLimit || parseInt(process.env.GLOBAL_MESSAGE_RATE_LIMIT || '50000', 10);
|
|
48
49
|
}
|
|
49
50
|
};
|
|
50
51
|
exports.ConfigService = ConfigService;
|
|
51
52
|
exports.ConfigService = ConfigService = __decorate([
|
|
52
53
|
(0, common_1.Injectable)(),
|
|
53
|
-
__metadata("design:paramtypes", [])
|
|
54
|
+
__metadata("design:paramtypes", [Object])
|
|
54
55
|
], ConfigService);
|
|
55
56
|
//# 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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"}
|
|
@@ -22,6 +22,8 @@ export interface WebSocketConfig {
|
|
|
22
22
|
heartbeatInterval?: number;
|
|
23
23
|
/** Heartbeat timeout in milliseconds */
|
|
24
24
|
heartbeatTimeout?: number;
|
|
25
|
+
/** Idle connection timeout (after auth, before joining room) in milliseconds */
|
|
26
|
+
idleConnectionTimeout?: number;
|
|
25
27
|
}
|
|
26
28
|
export interface RateLimitConfig {
|
|
27
29
|
/** New connections per second */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.config.d.ts","sourceRoot":"","sources":["../../../src/config/gateway.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,eAAe;IAC9B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway.config.d.ts","sourceRoot":"","sources":["../../../src/config/gateway.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,eAAe;IAC9B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;IAC5B,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,kCAAkC;IAClC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,CAY9E;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,eAAe,CAMvD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,eAAe,CAK/D,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAGtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.config.js","sourceRoot":"","sources":["../../../src/config/gateway.config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"gateway.config.js","sourceRoot":"","sources":["../../../src/config/gateway.config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAgEH,oDAYC;AAfD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAA4B;IAC/D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,2CAA2C;QAC3C,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,iBAAiB,GAA8B;IAC1D,IAAI,EAAE,KAAK;IACX,cAAc,EAAE,KAAK;IACrB,iBAAiB,EAAE,KAAK;IACxB,gBAAgB,EAAE,KAAK;IACvB,qBAAqB,EAAE,KAAK;CAC7B,CAAC;AAEW,QAAA,yBAAyB,GAA8B;IAClE,WAAW,EAAE,GAAG;IAChB,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,KAAK;CACd,CAAC;AAEW,QAAA,oBAAoB,GAA0B;IACzD,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,IAAI;CACd,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { GatewayConfigOptions } from './config/config.service';
|
|
2
3
|
export interface GatewayModuleOptions {
|
|
3
4
|
wsPort?: number;
|
|
5
|
+
config?: Partial<GatewayConfigOptions>;
|
|
4
6
|
}
|
|
5
7
|
export declare class GatewayModule {
|
|
6
8
|
static forRoot(options?: GatewayModuleOptions): DynamicModule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.module.d.ts","sourceRoot":"","sources":["../../src/gateway.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway.module.d.ts","sourceRoot":"","sources":["../../src/gateway.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAU/D,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACxC;AAED,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa;CAiBlE"}
|
|
@@ -23,7 +23,7 @@ let GatewayModule = GatewayModule_1 = class GatewayModule {
|
|
|
23
23
|
return {
|
|
24
24
|
module: GatewayModule_1,
|
|
25
25
|
imports: [
|
|
26
|
-
config_module_1.ConfigModule,
|
|
26
|
+
config_module_1.ConfigModule.forRoot(options.config),
|
|
27
27
|
redis_module_1.RedisModule,
|
|
28
28
|
connection_module_1.ConnectionModule,
|
|
29
29
|
session_module_1.SessionModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.module.js","sourceRoot":"","sources":["../../src/gateway.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,0DAAsD;
|
|
1
|
+
{"version":3,"file":"gateway.module.js","sourceRoot":"","sources":["../../src/gateway.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,0DAAsD;AAEtD,uDAAmD;AACnD,sEAAkE;AAClE,6DAAyD;AACzD,8CAAiD;AACjD,uDAAmD;AACnD,qEAAgE;AAChE,6DAAyD;AACzD,qFAAgF;AAQzE,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,UAAgC,EAAE;QAC/C,OAAO;YACL,MAAM,EAAE,eAAa;YACrB,OAAO,EAAE;gBACP,4BAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpC,0BAAW;gBACX,oCAAgB;gBAChB,8BAAa;gBACb,2BAAe,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjD,0BAAW;gBACX,mCAAe;gBACf,8BAAa;aACd;YACD,SAAS,EAAE,CAAC,mDAAuB,CAAC;YACpC,OAAO,EAAE,CAAC,mDAAuB,CAAC;SACnC,CAAC;IACJ,CAAC;CACF,CAAA;AAlBY,sCAAa;wBAAb,aAAa;IADzB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,aAAa,CAkBzB"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EACL,aAAa,EAKd,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,8BAA8B;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EACL,aAAa,EAKd,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,8BAA8B;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA6DnF;AAGD,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -50,23 +50,28 @@ async function createGateway(config) {
|
|
|
50
50
|
const wsConfig = { ...gateway_config_1.DEFAULT_WS_CONFIG, ...config.ws, ...(config.port ? { port: config.port } : {}) };
|
|
51
51
|
const rateLimitConfig = { ...gateway_config_1.DEFAULT_RATE_LIMIT_CONFIG, ...config.rateLimit };
|
|
52
52
|
const adminConfig = { ...gateway_config_1.DEFAULT_ADMIN_CONFIG, ...config.admin };
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
// 构建 ConfigService 的配置对象
|
|
54
|
+
const gatewayConfigOptions = {
|
|
55
|
+
gatewayId,
|
|
56
|
+
port: wsConfig.port,
|
|
57
|
+
adminPort: adminConfig.port,
|
|
58
|
+
redisHost: redisConfig.host || 'localhost',
|
|
59
|
+
redisPort: redisConfig.port || 6379,
|
|
60
|
+
redisPassword: redisConfig.password,
|
|
61
|
+
heartbeatInterval: wsConfig.heartbeatInterval,
|
|
62
|
+
heartbeatTimeout: wsConfig.heartbeatTimeout,
|
|
63
|
+
maxConnections: wsConfig.maxConnections,
|
|
64
|
+
idleConnectionTimeout: wsConfig.idleConnectionTimeout || 60000,
|
|
65
|
+
connectionRateLimit: rateLimitConfig.connections,
|
|
66
|
+
messageRateLimitPerConnection: rateLimitConfig.messages,
|
|
67
|
+
messageBurstLimit: rateLimitConfig.burst,
|
|
68
|
+
globalMessageRateLimit: rateLimitConfig.global,
|
|
69
|
+
};
|
|
68
70
|
// Create NestJS application with dynamic port configuration
|
|
69
|
-
const app = await core_1.NestFactory.create(gateway_module_1.GatewayModule.forRoot({
|
|
71
|
+
const app = await core_1.NestFactory.create(gateway_module_1.GatewayModule.forRoot({
|
|
72
|
+
wsPort: wsConfig.port,
|
|
73
|
+
config: gatewayConfigOptions
|
|
74
|
+
}), {
|
|
70
75
|
logger: ['error', 'warn', 'log'],
|
|
71
76
|
});
|
|
72
77
|
// 创建WebSocket适配器
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;AA+BH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-router.service.d.ts","sourceRoot":"","sources":["../../../src/ws/message-router.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,aAAa,EAMb,UAAU,EAGX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,qBACa,oBAAoB;IAO7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IATjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAGhE,OAAO,CAAC,UAAU,CAA6B;gBAG5B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc;IAMjD;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAcrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;;OAGG;IACG,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyFlF;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;YACW,qBAAqB;
|
|
1
|
+
{"version":3,"file":"message-router.service.d.ts","sourceRoot":"","sources":["../../../src/ws/message-router.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,aAAa,EAMb,UAAU,EAGX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,qBACa,oBAAoB;IAO7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IATjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAGhE,OAAO,CAAC,UAAU,CAA6B;gBAG5B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc;IAMjD;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAcrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;;OAGG;IACG,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyFlF;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;YACW,qBAAqB;IA2CnC;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;YACW,cAAc;IAO5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;YACW,eAAe;IAmH7B;;OAEG;YACW,gBAAgB;IAyD9B;;OAEG;YACW,cAAc;IAsC5B;;;;;OAKG;YACW,eAAe;IAyC7B;;;;;;;OAOG;YACW,eAAe;IA4B7B;;OAEG;YACW,gBAAgB;IAM9B;;OAEG;YACW,YAAY;IAkB1B;;OAEG;YACW,iBAAiB;IAK/B;;OAEG;YACW,oBAAoB;IA+BlC;;;;;;;;;;;;OAYG;YACW,kBAAkB;IA6GhC;;;;;;;;OAQG;YACW,kBAAkB;CAwBjC"}
|
|
@@ -140,7 +140,7 @@ let MessageRouterService = MessageRouterService_1 = class MessageRouterService {
|
|
|
140
140
|
this.sendErrorByType(connection.id, 'NOT_IN_ROOM');
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
143
|
-
await this.forwardToWorkerByType(connection, msgType, payload, targetRoomId, message.token);
|
|
143
|
+
await this.forwardToWorkerByType(connection, msgType, payload, targetRoomId, message.token, message.reqId);
|
|
144
144
|
}
|
|
145
145
|
/**
|
|
146
146
|
* 发送错误消息
|
|
@@ -154,7 +154,7 @@ let MessageRouterService = MessageRouterService_1 = class MessageRouterService {
|
|
|
154
154
|
/**
|
|
155
155
|
* 转发消息到 Worker
|
|
156
156
|
*/
|
|
157
|
-
async forwardToWorkerByType(connection, msgType, payload, roomId, token) {
|
|
157
|
+
async forwardToWorkerByType(connection, msgType, payload, roomId, token, clientReqId) {
|
|
158
158
|
// 优先使用缓存的路由
|
|
159
159
|
let workerId = this.roomRoutes.get(roomId);
|
|
160
160
|
// 如果缓存中没有,从 Redis 查询
|
|
@@ -172,7 +172,7 @@ let MessageRouterService = MessageRouterService_1 = class MessageRouterService {
|
|
|
172
172
|
}
|
|
173
173
|
const message = {
|
|
174
174
|
type: 'client-message',
|
|
175
|
-
requestId: (0, uuid_1.v4)(),
|
|
175
|
+
requestId: clientReqId || (0, uuid_1.v4)(), // 使用客户端的 reqId,如果没有则生成新的
|
|
176
176
|
gatewayId: this.configService.gatewayId,
|
|
177
177
|
connectionId: connection.id,
|
|
178
178
|
userId: connection.userId,
|
|
@@ -600,7 +600,7 @@ let MessageRouterService = MessageRouterService_1 = class MessageRouterService {
|
|
|
600
600
|
const existingWorkerId = await this.redisService.client.get(core_1.RedisKeys.roomWorker(roomId));
|
|
601
601
|
if (existingWorkerId) {
|
|
602
602
|
// 房间已存在,直接加入
|
|
603
|
-
await this.forwardJoinRequest(connection, roomId, existingWorkerId, true, token);
|
|
603
|
+
await this.forwardJoinRequest(connection, roomId, existingWorkerId, true, token, clientReqId);
|
|
604
604
|
return;
|
|
605
605
|
}
|
|
606
606
|
// 原子递增并发计数器,同时设置过期时间
|
|
@@ -688,11 +688,11 @@ let MessageRouterService = MessageRouterService_1 = class MessageRouterService {
|
|
|
688
688
|
* @param isJoinOrCreate 是否为 joinOrCreate 操作
|
|
689
689
|
* @param token 可选的认证令牌
|
|
690
690
|
*/
|
|
691
|
-
async forwardJoinRequest(connection, roomId, workerId, isJoinOrCreate, token) {
|
|
691
|
+
async forwardJoinRequest(connection, roomId, workerId, isJoinOrCreate, token, clientReqId) {
|
|
692
692
|
const msgType = isJoinOrCreate ? core_1.MessageType.MSG_ROOM_JOIN_OR_CREATE : core_1.MessageType.ROOM_JOIN;
|
|
693
693
|
const message = {
|
|
694
694
|
type: 'client-message',
|
|
695
|
-
requestId: (0, uuid_1.v4)(),
|
|
695
|
+
requestId: clientReqId || (0, uuid_1.v4)(),
|
|
696
696
|
gatewayId: this.configService.gatewayId,
|
|
697
697
|
connectionId: connection.id,
|
|
698
698
|
userId: connection.userId,
|