@roomkit/gateway 1.2.0 → 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 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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"}
package/package.json CHANGED
@@ -1,7 +1,17 @@
1
1
  {
2
2
  "name": "@roomkit/gateway",
3
- "version": "1.2.0",
4
- "description": "WebSocket Gateway for Gateway-Worker Framework",
3
+ "version": "1.3.0",
4
+ "description": "High-performance WebSocket Gateway server for multiplayer games and real-time applications",
5
+ "keywords": [
6
+ "websocket",
7
+ "gateway",
8
+ "multiplayer",
9
+ "game-server",
10
+ "real-time",
11
+ "scalable",
12
+ "redis",
13
+ "roomkit"
14
+ ],
5
15
  "main": "dist/src/index.js",
6
16
  "types": "dist/src/index.d.ts",
7
17
  "exports": {
@@ -10,18 +20,7 @@
10
20
  "default": "./dist/src/index.js"
11
21
  }
12
22
  },
13
- "scripts": {
14
- "build": "nest build",
15
- "dev": "nest start --watch",
16
- "start": "nest start",
17
- "start:prod": "node dist/main",
18
- "lint": "eslint \"{src,test}/**/*.ts\"",
19
- "test": "jest",
20
- "test:e2e": "jest --config jest.e2e.config.js",
21
- "clean": "rimraf dist"
22
- },
23
23
  "dependencies": {
24
- "@roomkit/core": "workspace:*",
25
24
  "@nestjs/common": "^10.3.0",
26
25
  "@nestjs/core": "^10.3.0",
27
26
  "@nestjs/platform-express": "^11.1.9",
@@ -32,7 +31,8 @@
32
31
  "reflect-metadata": "^0.1.14",
33
32
  "rxjs": "^7.8.1",
34
33
  "uuid": "^9.0.1",
35
- "ws": "^8.16.0"
34
+ "ws": "^8.16.0",
35
+ "@roomkit/core": "1.3.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@nestjs/cli": "^10.3.0",
@@ -48,12 +48,6 @@
48
48
  "ts-jest": "^29.1.1",
49
49
  "typescript": "^5.3.0"
50
50
  },
51
- "keywords": [
52
- "gateway",
53
- "websocket",
54
- "game-server",
55
- "multiplayer"
56
- ],
57
51
  "license": "MIT",
58
52
  "repository": {
59
53
  "type": "git",
@@ -74,5 +68,15 @@
74
68
  ],
75
69
  "publishConfig": {
76
70
  "access": "public"
71
+ },
72
+ "scripts": {
73
+ "build": "nest build",
74
+ "dev": "nest start --watch",
75
+ "start": "nest start",
76
+ "start:prod": "node dist/main",
77
+ "lint": "eslint \"{src,test}/**/*.ts\"",
78
+ "test": "jest",
79
+ "test:e2e": "jest --config jest.e2e.config.js",
80
+ "clean": "rimraf dist"
77
81
  }
78
- }
82
+ }