@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.
Files changed (48) hide show
  1. package/README.md +182 -47
  2. package/dist/src/config/config.module.d.ts +3 -0
  3. package/dist/src/config/config.module.d.ts.map +1 -1
  4. package/dist/src/config/config.module.js +16 -6
  5. package/dist/src/config/config.module.js.map +1 -1
  6. package/dist/src/config/config.service.d.ts +17 -1
  7. package/dist/src/config/config.service.d.ts.map +1 -1
  8. package/dist/src/config/config.service.js +17 -16
  9. package/dist/src/config/config.service.js.map +1 -1
  10. package/dist/src/config/gateway.config.d.ts +2 -0
  11. package/dist/src/config/gateway.config.d.ts.map +1 -1
  12. package/dist/src/config/gateway.config.js +1 -0
  13. package/dist/src/config/gateway.config.js.map +1 -1
  14. package/dist/src/gateway.module.d.ts +2 -0
  15. package/dist/src/gateway.module.d.ts.map +1 -1
  16. package/dist/src/gateway.module.js +1 -1
  17. package/dist/src/gateway.module.js.map +1 -1
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/index.js +21 -16
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/ws/message-router.service.d.ts.map +1 -1
  22. package/dist/src/ws/message-router.service.js +6 -6
  23. package/dist/src/ws/message-router.service.js.map +1 -1
  24. package/package.json +25 -21
  25. package/dist/test/connection/connection.service.spec.d.ts +0 -2
  26. package/dist/test/connection/connection.service.spec.d.ts.map +0 -1
  27. package/dist/test/connection/connection.service.spec.js +0 -204
  28. package/dist/test/connection/connection.service.spec.js.map +0 -1
  29. package/dist/test/e2e/gateway-worker.e2e.spec.d.ts +0 -2
  30. package/dist/test/e2e/gateway-worker.e2e.spec.d.ts.map +0 -1
  31. package/dist/test/e2e/gateway-worker.e2e.spec.js +0 -412
  32. package/dist/test/e2e/gateway-worker.e2e.spec.js.map +0 -1
  33. package/dist/test/integration/admin-api.spec.d.ts +0 -2
  34. package/dist/test/integration/admin-api.spec.d.ts.map +0 -1
  35. package/dist/test/integration/admin-api.spec.js +0 -218
  36. package/dist/test/integration/admin-api.spec.js.map +0 -1
  37. package/dist/test/ratelimit/rate-limiter.service.spec.d.ts +0 -2
  38. package/dist/test/ratelimit/rate-limiter.service.spec.d.ts.map +0 -1
  39. package/dist/test/ratelimit/rate-limiter.service.spec.js +0 -139
  40. package/dist/test/ratelimit/rate-limiter.service.spec.js.map +0 -1
  41. package/dist/test/setup.d.ts +0 -2
  42. package/dist/test/setup.d.ts.map +0 -1
  43. package/dist/test/setup.js +0 -56
  44. package/dist/test/setup.js.map +0 -1
  45. package/dist/test/ws/message-router.service.spec.d.ts +0 -2
  46. package/dist/test/ws/message-router.service.spec.d.ts.map +0 -1
  47. package/dist/test/ws/message-router.service.spec.js +0 -403
  48. 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** - Multiple gateway instances supported
18
+ - 🔌 **Horizontal Scaling** - Run multiple gateway instances
19
+ - ⚡ **Production Ready** - Battle-tested in production environments
19
20
 
20
21
  ## Quick Start
21
22
 
22
- ### Environment Variables
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
- ```bash
25
- # Server
26
- PORT=27100
27
- ADMIN_PORT=27200
41
+ ## Configuration
28
42
 
29
- # Redis
30
- REDIS_HOST=localhost
31
- REDIS_PORT=6379
32
- REDIS_PASSWORD=
43
+ ### Redis Configuration
44
+
45
+ ```typescript
46
+ // Option 1: URL string
47
+ redis: 'redis://:password@localhost:6379/0'
33
48
 
34
- # Gateway
35
- GATEWAY_ID=gateway-1
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
- ### Run Gateway
58
+ ### WebSocket Configuration
39
59
 
40
- ```bash
41
- # Using the binary
42
- npx @roomkit/gateway
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
- # Or using Node.js
45
- node node_modules/@roomkit/gateway/dist/main.js
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
- ### Docker
81
+ ### Admin API
49
82
 
50
- ```bash
51
- docker run -e REDIS_HOST=redis \
52
- -e GATEWAY_ID=gateway-1 \
53
- -p 27100:27100 \
54
- -p 27200:27200 \
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
- ## Configuration
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
- Create a `.env` file:
141
+ The gateway supports basic environment variables for infrastructure configuration:
61
142
 
62
- ```env
63
- PORT=27100
64
- ADMIN_PORT=27200
143
+ ```bash
144
+ # Redis (infrastructure)
65
145
  REDIS_HOST=localhost
66
146
  REDIS_PORT=6379
67
- GATEWAY_ID=gateway-1
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 on port `ADMIN_PORT`:
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
- - `GET /health` - Health check
75
- - `GET /metrics` - Prometheus metrics
76
- - `GET /admin/connections` - List active connections
77
- - `GET /admin/stats` - Gateway statistics
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
- ## Architecture
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
- The Gateway:
86
- 1. Accepts WebSocket connections from clients
87
- 2. Manages sessions and authentication
88
- 3. Routes messages to appropriate workers via Redis
89
- 4. Broadcasts responses back to clients
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,3 +1,6 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { GatewayConfigOptions } from './config.service';
1
3
  export declare class ConfigModule {
4
+ static forRoot(config?: Partial<GatewayConfigOptions>): DynamicModule;
2
5
  }
3
6
  //# sourceMappingURL=config.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.module.d.ts","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":"AAGA,qBAKa,YAAY;CAAG"}
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":";;;;;;;;;AAAA,2CAAgD;AAChD,qDAAiD;AAO1C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
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;;CAoBzC"}
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
- this.gatewayId = process.env.GW_GATEWAY_ID || `gateway-${(0, uuid_1.v4)().substring(0, 8)}`;
34
- this.port = parseInt(process.env.GW_GATEWAY_PORT || '27100', 10);
35
- this.adminPort = parseInt(process.env.GW_GATEWAY_ADMIN_PORT || '27200', 10);
36
- this.redisHost = process.env.GW_REDIS_HOST || 'localhost';
37
- this.redisPort = parseInt(process.env.GW_REDIS_PORT || '6379', 10);
38
- this.redisPassword = process.env.GW_REDIS_PASSWORD;
39
- this.heartbeatInterval = parseInt(process.env.GW_HEARTBEAT_INTERVAL || '30000', 10);
40
- this.heartbeatTimeout = parseInt(process.env.GW_HEARTBEAT_TIMEOUT || '90000', 10);
41
- this.maxConnections = parseInt(process.env.GW_MAX_CONNECTIONS || '10000', 10);
42
- this.idleConnectionTimeout = parseInt(process.env.GW_IDLE_CONNECTION_TIMEOUT || '60000', 10);
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.GW_CONNECTION_RATE_LIMIT || '100', 10);
45
- this.messageRateLimitPerConnection = parseInt(process.env.GW_MESSAGE_RATE_LIMIT || '50', 10);
46
- this.messageBurstLimit = parseInt(process.env.GW_MESSAGE_BURST_LIMIT || '100', 10);
47
- this.globalMessageRateLimit = parseInt(process.env.GW_GLOBAL_MESSAGE_RATE_LIMIT || '50000', 10);
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;AAG3B,IAAM,aAAa,GAAnB,MAAM,aAAa;IACf,SAAS,CAAS;IAClB,IAAI,CAAS;IACb,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,aAAa,CAAU;IACvB,iBAAiB,CAAS;IAC1B,gBAAgB,CAAS;IACzB,cAAc,CAAS;IAEhC,kCAAkC;IACzB,qBAAqB,CAAS;IAEvC,OAAO;IACE,mBAAmB,CAAS;IAC5B,6BAA6B,CAAS;IACtC,iBAAiB,CAAS;IAC1B,sBAAsB,CAAS;IAExC;QACE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,IAAA,SAAI,GAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAE7F,OAAO;QACP,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,6BAA6B,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAClG,CAAC;CACF,CAAA;AAtCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CAsCzB"}
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;CAC3B;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,CAKvD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,eAAe,CAK/D,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAGtD,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"}
@@ -29,6 +29,7 @@ exports.DEFAULT_WS_CONFIG = {
29
29
  maxConnections: 10000,
30
30
  heartbeatInterval: 30000,
31
31
  heartbeatTimeout: 90000,
32
+ idleConnectionTimeout: 60000,
32
33
  };
33
34
  exports.DEFAULT_RATE_LIMIT_CONFIG = {
34
35
  connections: 100,
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.config.js","sourceRoot":"","sources":["../../../src/config/gateway.config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA8DH,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;CACxB,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
+ {"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;AAWvD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa;CAiBlE"}
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;AACtD,uDAAmD;AACnD,sEAAkE;AAClE,6DAAyD;AACzD,8CAAiD;AACjD,uDAAmD;AACnD,qEAAgE;AAChE,6DAAyD;AACzD,qFAAgF;AAOzE,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,UAAgC,EAAE;QAC/C,OAAO;YACL,MAAM,EAAE,eAAa;YACrB,OAAO,EAAE;gBACP,4BAAY;gBACZ,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"}
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"}
@@ -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,CAoDnF;AAGD,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,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
- // 设置环境变量给其他服务使用(使用GW_前缀)
54
- process.env.GW_GATEWAY_ID = gatewayId;
55
- process.env.GW_REDIS_HOST = redisConfig.host || 'localhost';
56
- process.env.GW_REDIS_PORT = String(redisConfig.port || 6379);
57
- if (redisConfig.password)
58
- process.env.GW_REDIS_PASSWORD = redisConfig.password;
59
- process.env.GW_GATEWAY_PORT = String(wsConfig.port);
60
- process.env.GW_GATEWAY_ADMIN_PORT = String(adminConfig.port);
61
- process.env.GW_MAX_CONNECTIONS = String(wsConfig.maxConnections);
62
- process.env.GW_HEARTBEAT_INTERVAL = String(wsConfig.heartbeatInterval);
63
- process.env.GW_HEARTBEAT_TIMEOUT = String(wsConfig.heartbeatTimeout);
64
- process.env.GW_CONNECTION_RATE_LIMIT = String(rateLimitConfig.connections);
65
- process.env.GW_MESSAGE_RATE_LIMIT = String(rateLimitConfig.messages);
66
- process.env.GW_MESSAGE_BURST_LIMIT = String(rateLimitConfig.burst);
67
- process.env.GW_GLOBAL_MESSAGE_RATE_LIMIT = String(rateLimitConfig.global);
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({ wsPort: wsConfig.port }), {
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适配器
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
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;IA0CnC;;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;CAuBjC"}
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,