@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 +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/package.json +25 -21
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":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+BAAkC;AAoB3B,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,YAAY,MAAsC;QAChD,yCAAyC;QACzC,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,IAAA,SAAI,GAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpG,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;QAC5E,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACzE,IAAI,CAAC,iBAAiB,GAAG,MAAM,EAAE,iBAAiB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,gBAAgB,GAAG,MAAM,EAAE,gBAAgB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3G,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,qBAAqB,GAAG,MAAM,EAAE,qBAAqB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAE3H,OAAO;QACP,IAAI,CAAC,mBAAmB,GAAG,MAAM,EAAE,mBAAmB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,6BAA6B,GAAG,MAAM,EAAE,6BAA6B,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACnI,IAAI,CAAC,iBAAiB,GAAG,MAAM,EAAE,iBAAiB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7G,IAAI,CAAC,sBAAsB,GAAG,MAAM,EAAE,sBAAsB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IACjI,CAAC;CACF,CAAA;AAvCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CAuCzB"}
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roomkit/gateway",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "WebSocket Gateway for
|
|
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
|
+
}
|