@morojs/moro 1.3.0 → 1.4.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 +61 -7
- package/dist/core/config/types.d.ts +147 -0
- package/dist/core/config/types.js +124 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/config/typescript-loader.d.ts +6 -0
- package/dist/core/config/typescript-loader.js +268 -0
- package/dist/core/config/typescript-loader.js.map +1 -0
- package/dist/core/config/validation.d.ts +18 -0
- package/dist/core/config/validation.js +134 -0
- package/dist/core/config/validation.js.map +1 -0
- package/dist/core/docs/openapi-generator.js +6 -6
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +7 -0
- package/dist/core/docs/schema-to-openapi.js +124 -0
- package/dist/core/docs/schema-to-openapi.js.map +1 -0
- package/dist/core/docs/zod-to-openapi.d.ts +2 -0
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/framework.d.ts +29 -6
- package/dist/core/framework.js +117 -18
- package/dist/core/framework.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +3 -0
- package/dist/core/networking/adapters/index.js +10 -0
- package/dist/core/networking/adapters/index.js.map +1 -0
- package/dist/core/networking/adapters/socketio-adapter.d.ts +16 -0
- package/dist/core/networking/adapters/socketio-adapter.js +244 -0
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -0
- package/dist/core/networking/adapters/ws-adapter.d.ts +54 -0
- package/dist/core/networking/adapters/ws-adapter.js +383 -0
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -0
- package/dist/core/networking/websocket-adapter.d.ts +171 -0
- package/dist/core/networking/websocket-adapter.js +5 -0
- package/dist/core/networking/websocket-adapter.js.map +1 -0
- package/dist/core/networking/websocket-manager.d.ts +53 -17
- package/dist/core/networking/websocket-manager.js +166 -108
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/index.d.ts +13 -13
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/validation/adapters.d.ts +51 -0
- package/dist/core/validation/adapters.js +135 -0
- package/dist/core/validation/adapters.js.map +1 -0
- package/dist/core/validation/index.d.ts +14 -11
- package/dist/core/validation/index.js +37 -26
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.d.ts +36 -0
- package/dist/core/validation/schema-interface.js +68 -0
- package/dist/core/validation/schema-interface.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/moro.js +8 -2
- package/dist/moro.js.map +1 -1
- package/package.json +31 -7
- package/src/core/config/types.ts +277 -0
- package/src/core/config/typescript-loader.ts +571 -0
- package/src/core/config/validation.ts +145 -0
- package/src/core/docs/openapi-generator.ts +7 -6
- package/src/core/docs/schema-to-openapi.ts +148 -0
- package/src/core/docs/zod-to-openapi.ts +2 -0
- package/src/core/framework.ts +121 -28
- package/src/core/networking/adapters/index.ts +16 -0
- package/src/core/networking/adapters/socketio-adapter.ts +252 -0
- package/src/core/networking/adapters/ws-adapter.ts +425 -0
- package/src/core/networking/websocket-adapter.ts +217 -0
- package/src/core/networking/websocket-manager.ts +185 -127
- package/src/core/routing/index.ts +13 -13
- package/src/core/validation/adapters.ts +147 -0
- package/src/core/validation/index.ts +60 -38
- package/src/core/validation/schema-interface.ts +100 -0
- package/src/index.ts +25 -2
- package/src/moro.ts +11 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-adapter.js","sourceRoot":"","sources":["../../../../src/core/networking/adapters/ws-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
export interface WebSocketAdapterOptions {
|
|
2
|
+
compression?: boolean;
|
|
3
|
+
cors?: {
|
|
4
|
+
origin?: string | string[] | boolean;
|
|
5
|
+
methods?: string[];
|
|
6
|
+
credentials?: boolean;
|
|
7
|
+
};
|
|
8
|
+
path?: string;
|
|
9
|
+
maxPayloadLength?: number;
|
|
10
|
+
idleTimeout?: number;
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Abstract WebSocket adapter interface
|
|
15
|
+
* Allows the framework to work with different WebSocket implementations
|
|
16
|
+
*/
|
|
17
|
+
export interface WebSocketAdapter {
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the WebSocket server with the given HTTP server
|
|
20
|
+
*/
|
|
21
|
+
initialize(httpServer: any, options?: WebSocketAdapterOptions): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Create a namespace for organizing WebSocket connections
|
|
24
|
+
*/
|
|
25
|
+
createNamespace(namespace: string): WebSocketNamespace;
|
|
26
|
+
/**
|
|
27
|
+
* Get the default namespace (usually '/')
|
|
28
|
+
*/
|
|
29
|
+
getDefaultNamespace(): WebSocketNamespace;
|
|
30
|
+
/**
|
|
31
|
+
* Close the WebSocket server and all connections
|
|
32
|
+
*/
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Set compression configuration
|
|
36
|
+
*/
|
|
37
|
+
setCompression(enabled: boolean, options?: any): void;
|
|
38
|
+
/**
|
|
39
|
+
* Set custom ID generator for connections
|
|
40
|
+
*/
|
|
41
|
+
setCustomIdGenerator(generator: () => string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get adapter name/type
|
|
44
|
+
*/
|
|
45
|
+
getAdapterName(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get connection count across all namespaces
|
|
48
|
+
*/
|
|
49
|
+
getConnectionCount(): number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* WebSocket namespace interface
|
|
53
|
+
* Represents a logical grouping of WebSocket connections
|
|
54
|
+
*/
|
|
55
|
+
export interface WebSocketNamespace {
|
|
56
|
+
/**
|
|
57
|
+
* Listen for connection events
|
|
58
|
+
*/
|
|
59
|
+
on(event: 'connection', handler: (socket: WebSocketConnection) => void): void;
|
|
60
|
+
/**
|
|
61
|
+
* Emit event to all connected sockets in this namespace
|
|
62
|
+
*/
|
|
63
|
+
emit(event: string, data: any): void;
|
|
64
|
+
/**
|
|
65
|
+
* Emit to specific room(s)
|
|
66
|
+
*/
|
|
67
|
+
to(room: string | string[]): WebSocketEmitter;
|
|
68
|
+
/**
|
|
69
|
+
* Emit to sockets except those in specified room(s)
|
|
70
|
+
*/
|
|
71
|
+
except(room: string | string[]): WebSocketEmitter;
|
|
72
|
+
/**
|
|
73
|
+
* Get all connected sockets
|
|
74
|
+
*/
|
|
75
|
+
getSockets(): WebSocketConnection[];
|
|
76
|
+
/**
|
|
77
|
+
* Get connection count for this namespace
|
|
78
|
+
*/
|
|
79
|
+
getConnectionCount(): number;
|
|
80
|
+
/**
|
|
81
|
+
* Use middleware for this namespace
|
|
82
|
+
*/
|
|
83
|
+
use(middleware: (socket: WebSocketConnection, next: (err?: Error) => void) => void): void;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* WebSocket connection interface
|
|
87
|
+
* Represents an individual client connection
|
|
88
|
+
*/
|
|
89
|
+
export interface WebSocketConnection {
|
|
90
|
+
/** Unique connection ID */
|
|
91
|
+
id: string;
|
|
92
|
+
/** Client IP address */
|
|
93
|
+
ip?: string;
|
|
94
|
+
/** Connection headers */
|
|
95
|
+
headers?: Record<string, string>;
|
|
96
|
+
/** Custom data storage */
|
|
97
|
+
data: Record<string, any>;
|
|
98
|
+
/**
|
|
99
|
+
* Listen for events from this socket
|
|
100
|
+
*/
|
|
101
|
+
on(event: string, handler: (data: any, callback?: (response?: any) => void) => void): void;
|
|
102
|
+
/**
|
|
103
|
+
* Listen for any event from this socket
|
|
104
|
+
*/
|
|
105
|
+
onAny(handler: (event: string, ...args: any[]) => void): void;
|
|
106
|
+
/**
|
|
107
|
+
* Emit event to this socket
|
|
108
|
+
*/
|
|
109
|
+
emit(event: string, data: any): void;
|
|
110
|
+
/**
|
|
111
|
+
* Emit with compression
|
|
112
|
+
*/
|
|
113
|
+
compressedEmit?(event: string, data: any): void;
|
|
114
|
+
/**
|
|
115
|
+
* Join a room
|
|
116
|
+
*/
|
|
117
|
+
join(room: string | string[]): void;
|
|
118
|
+
/**
|
|
119
|
+
* Leave a room
|
|
120
|
+
*/
|
|
121
|
+
leave(room: string | string[]): void;
|
|
122
|
+
/**
|
|
123
|
+
* Emit to specific room(s)
|
|
124
|
+
*/
|
|
125
|
+
to(room: string | string[]): WebSocketEmitter;
|
|
126
|
+
/**
|
|
127
|
+
* Emit to all sockets except this one
|
|
128
|
+
*/
|
|
129
|
+
broadcast: WebSocketEmitter;
|
|
130
|
+
/**
|
|
131
|
+
* Get rooms this socket has joined
|
|
132
|
+
*/
|
|
133
|
+
getRooms(): Set<string>;
|
|
134
|
+
/**
|
|
135
|
+
* Disconnect this socket
|
|
136
|
+
*/
|
|
137
|
+
disconnect(close?: boolean): void;
|
|
138
|
+
/**
|
|
139
|
+
* Check if socket is connected
|
|
140
|
+
*/
|
|
141
|
+
connected: boolean;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* WebSocket emitter interface for chaining operations
|
|
145
|
+
*/
|
|
146
|
+
export interface WebSocketEmitter {
|
|
147
|
+
/**
|
|
148
|
+
* Emit to target sockets
|
|
149
|
+
*/
|
|
150
|
+
emit(event: string, data: any): void;
|
|
151
|
+
/**
|
|
152
|
+
* Target specific room(s)
|
|
153
|
+
*/
|
|
154
|
+
to(room: string | string[]): WebSocketEmitter;
|
|
155
|
+
/**
|
|
156
|
+
* Exclude specific room(s)
|
|
157
|
+
*/
|
|
158
|
+
except(room: string | string[]): WebSocketEmitter;
|
|
159
|
+
/**
|
|
160
|
+
* Use compression for this emit
|
|
161
|
+
*/
|
|
162
|
+
compress(compress: boolean): WebSocketEmitter;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* WebSocket middleware function type
|
|
166
|
+
*/
|
|
167
|
+
export type WebSocketMiddleware = (socket: WebSocketConnection, next: (err?: Error) => void) => void;
|
|
168
|
+
/**
|
|
169
|
+
* WebSocket event handler type
|
|
170
|
+
*/
|
|
171
|
+
export type WebSocketEventHandler = (socket: WebSocketConnection, data: any, callback?: (response?: any) => void) => void | Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-adapter.js","sourceRoot":"","sources":["../../../src/core/networking/websocket-adapter.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,sEAAsE"}
|
|
@@ -1,27 +1,63 @@
|
|
|
1
|
-
import { Server as SocketIOServer, Namespace } from 'socket.io';
|
|
2
1
|
import { Container } from '../utilities';
|
|
3
2
|
import { ModuleConfig, WebSocketDefinition } from '../../types/module';
|
|
3
|
+
import { WebSocketAdapter, WebSocketNamespace } from './websocket-adapter';
|
|
4
4
|
export declare class WebSocketManager {
|
|
5
|
-
private
|
|
5
|
+
private adapter;
|
|
6
6
|
private container;
|
|
7
7
|
private circuitBreakers;
|
|
8
8
|
private rateLimiters;
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
private logger;
|
|
10
|
+
constructor(adapter: WebSocketAdapter, container: Container);
|
|
11
|
+
/**
|
|
12
|
+
* Set custom ID generator for the adapter
|
|
13
|
+
*/
|
|
13
14
|
setCustomIdGenerator(generator: () => string): void;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Enable compression for the adapter
|
|
17
|
+
*/
|
|
18
|
+
enableCompression(options?: any): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get the underlying adapter
|
|
21
|
+
*/
|
|
22
|
+
getAdapter(): WebSocketAdapter;
|
|
23
|
+
/**
|
|
24
|
+
* Get connection count across all namespaces
|
|
25
|
+
*/
|
|
26
|
+
getConnectionCount(): number;
|
|
27
|
+
/**
|
|
28
|
+
* Create or get a namespace
|
|
29
|
+
*/
|
|
30
|
+
getNamespace(namespace: string): WebSocketNamespace;
|
|
31
|
+
/**
|
|
32
|
+
* Register WebSocket handlers for a module
|
|
33
|
+
*/
|
|
34
|
+
registerHandler(namespace: WebSocketNamespace, wsConfig: WebSocketDefinition, moduleConfig: ModuleConfig): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Setup socket-specific middleware
|
|
37
|
+
*/
|
|
23
38
|
private setupSocketMiddleware;
|
|
24
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Setup handlers for a specific WebSocket configuration
|
|
41
|
+
*/
|
|
42
|
+
private setupSocketHandlers;
|
|
43
|
+
/**
|
|
44
|
+
* Get or create circuit breaker for handler
|
|
45
|
+
*/
|
|
25
46
|
private getCircuitBreaker;
|
|
26
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Check rate limit for socket and handler
|
|
49
|
+
*/
|
|
50
|
+
private checkRateLimit;
|
|
51
|
+
/**
|
|
52
|
+
* Process binary data efficiently
|
|
53
|
+
*/
|
|
54
|
+
private processBinaryData;
|
|
55
|
+
/**
|
|
56
|
+
* Check if data should be compressed
|
|
57
|
+
*/
|
|
58
|
+
private shouldCompress;
|
|
59
|
+
/**
|
|
60
|
+
* Close the WebSocket manager and underlying adapter
|
|
61
|
+
*/
|
|
62
|
+
close(): Promise<void>;
|
|
27
63
|
}
|
|
@@ -2,88 +2,91 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WebSocketManager = void 0;
|
|
4
4
|
const utilities_1 = require("../utilities");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
5
6
|
class WebSocketManager {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
7
|
+
constructor(adapter, container) {
|
|
8
|
+
this.adapter = adapter;
|
|
8
9
|
this.container = container;
|
|
9
10
|
this.circuitBreakers = new Map();
|
|
10
11
|
this.rateLimiters = new Map();
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
13
|
-
}
|
|
14
|
-
setupAdvancedFeatures() {
|
|
15
|
-
// Enable compression for WebSocket messages
|
|
16
|
-
if (this.compressionEnabled) {
|
|
17
|
-
this.io.engine.compression = true;
|
|
18
|
-
this.io.engine.perMessageDeflate = {
|
|
19
|
-
threshold: 1024,
|
|
20
|
-
concurrencyLimit: 10,
|
|
21
|
-
memLevel: 8,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// Custom session ID generation if provided
|
|
25
|
-
if (this.customIdGenerator) {
|
|
26
|
-
this.io.engine.generateId = this.customIdGenerator;
|
|
27
|
-
}
|
|
28
|
-
// Global WebSocket middleware for advanced features
|
|
29
|
-
this.io.use((socket, next) => {
|
|
30
|
-
// Add binary message handling
|
|
31
|
-
socket.onAny((event, ...args) => {
|
|
32
|
-
// Handle binary frames efficiently
|
|
33
|
-
args.forEach((arg, index) => {
|
|
34
|
-
if (Buffer.isBuffer(arg)) {
|
|
35
|
-
// Process binary data with optimizations
|
|
36
|
-
args[index] = this.processBinaryData(arg);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
// Add compression per message
|
|
41
|
-
socket.compressedEmit = (event, data) => {
|
|
42
|
-
if (this.compressionEnabled && this.shouldCompress(data)) {
|
|
43
|
-
socket.compress(true).emit(event, data);
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
socket.emit(event, data);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
// Add heartbeat mechanism
|
|
50
|
-
socket.heartbeat = () => {
|
|
51
|
-
socket.emit('heartbeat', { timestamp: Date.now() });
|
|
52
|
-
};
|
|
53
|
-
next();
|
|
54
|
-
});
|
|
12
|
+
this.logger = (0, logger_1.createFrameworkLogger)('WebSocketManager');
|
|
13
|
+
this.logger.info(`Initialized with ${adapter.getAdapterName()} adapter`, 'AdapterInit');
|
|
55
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Set custom ID generator for the adapter
|
|
17
|
+
*/
|
|
56
18
|
setCustomIdGenerator(generator) {
|
|
57
|
-
this.
|
|
58
|
-
this.io.engine.generateId = generator;
|
|
19
|
+
this.adapter.setCustomIdGenerator(generator);
|
|
59
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Enable compression for the adapter
|
|
23
|
+
*/
|
|
60
24
|
enableCompression(options) {
|
|
61
|
-
this.
|
|
62
|
-
if (options) {
|
|
63
|
-
this.io.engine.perMessageDeflate = {
|
|
64
|
-
threshold: options.threshold || 1024,
|
|
65
|
-
concurrencyLimit: options.concurrencyLimit || 10,
|
|
66
|
-
memLevel: options.memLevel || 8,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
25
|
+
this.adapter.setCompression(true, options);
|
|
69
26
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Get the underlying adapter
|
|
29
|
+
*/
|
|
30
|
+
getAdapter() {
|
|
31
|
+
return this.adapter;
|
|
74
32
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Get connection count across all namespaces
|
|
35
|
+
*/
|
|
36
|
+
getConnectionCount() {
|
|
37
|
+
return this.adapter.getConnectionCount();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create or get a namespace
|
|
41
|
+
*/
|
|
42
|
+
getNamespace(namespace) {
|
|
43
|
+
return this.adapter.createNamespace(namespace);
|
|
79
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Register WebSocket handlers for a module
|
|
47
|
+
*/
|
|
80
48
|
async registerHandler(namespace, wsConfig, moduleConfig) {
|
|
81
49
|
namespace.on('connection', (socket) => {
|
|
82
|
-
|
|
83
|
-
|
|
50
|
+
this.logger.debug(`New connection: ${socket.id}`, 'Connection', {
|
|
51
|
+
namespace: namespace.constructor.name,
|
|
52
|
+
module: moduleConfig.name,
|
|
53
|
+
});
|
|
84
54
|
this.setupSocketMiddleware(socket, moduleConfig.name);
|
|
55
|
+
this.setupSocketHandlers(socket, wsConfig, moduleConfig);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Setup socket-specific middleware
|
|
60
|
+
*/
|
|
61
|
+
setupSocketMiddleware(socket, moduleName) {
|
|
62
|
+
// Add module context to socket data
|
|
63
|
+
socket.data.module = moduleName;
|
|
64
|
+
socket.data.connectedAt = Date.now();
|
|
65
|
+
// Setup heartbeat if supported
|
|
66
|
+
if (socket.compressedEmit) {
|
|
67
|
+
const heartbeatInterval = setInterval(() => {
|
|
68
|
+
if (socket.connected) {
|
|
69
|
+
socket.emit('heartbeat', { timestamp: Date.now() });
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
clearInterval(heartbeatInterval);
|
|
73
|
+
}
|
|
74
|
+
}, 30000); // 30 seconds
|
|
75
|
+
socket.on('disconnect', () => {
|
|
76
|
+
clearInterval(heartbeatInterval);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Log disconnection
|
|
80
|
+
socket.on('disconnect', () => {
|
|
81
|
+
this.logger.debug(`Socket disconnected: ${socket.id}`, 'Disconnect', {
|
|
82
|
+
module: moduleName,
|
|
83
|
+
duration: Date.now() - socket.data.connectedAt,
|
|
84
|
+
});
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Setup handlers for a specific WebSocket configuration
|
|
89
|
+
*/
|
|
87
90
|
setupSocketHandlers(socket, wsConfig, moduleConfig) {
|
|
88
91
|
socket.on(wsConfig.event, async (data, callback) => {
|
|
89
92
|
const handlerKey = `${moduleConfig.name}.${wsConfig.handler}`;
|
|
@@ -101,7 +104,7 @@ class WebSocketManager {
|
|
|
101
104
|
socket.emit('error', error);
|
|
102
105
|
return;
|
|
103
106
|
}
|
|
104
|
-
// Validation
|
|
107
|
+
// Validation using Zod
|
|
105
108
|
if (wsConfig.validation) {
|
|
106
109
|
try {
|
|
107
110
|
data = wsConfig.validation.parse(data);
|
|
@@ -136,74 +139,129 @@ class WebSocketManager {
|
|
|
136
139
|
if (callback) {
|
|
137
140
|
callback({ success: true, data: result });
|
|
138
141
|
}
|
|
139
|
-
else if (
|
|
140
|
-
socket.
|
|
142
|
+
else if (result !== undefined) {
|
|
143
|
+
socket.emit(`${wsConfig.event}:response`, { success: true, data: result });
|
|
144
|
+
}
|
|
145
|
+
// Handle room operations
|
|
146
|
+
if (wsConfig.rooms) {
|
|
147
|
+
wsConfig.rooms.forEach(room => socket.join(room));
|
|
141
148
|
}
|
|
142
|
-
|
|
143
|
-
|
|
149
|
+
// Handle broadcasting
|
|
150
|
+
if (wsConfig.broadcast && result !== undefined) {
|
|
151
|
+
socket.broadcast.emit(wsConfig.event, { success: true, data: result });
|
|
144
152
|
}
|
|
145
153
|
}
|
|
146
154
|
catch (error) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
155
|
+
this.logger.error('WebSocket handler error', 'HandlerError', {
|
|
156
|
+
handler: handlerKey,
|
|
157
|
+
error: error instanceof Error ? error.message : String(error),
|
|
158
|
+
socketId: socket.id,
|
|
159
|
+
});
|
|
150
160
|
const errorResponse = {
|
|
151
161
|
success: false,
|
|
152
|
-
error:
|
|
153
|
-
code:
|
|
162
|
+
error: 'Internal server error',
|
|
163
|
+
code: 'HANDLER_ERROR',
|
|
154
164
|
};
|
|
155
|
-
if (callback)
|
|
165
|
+
if (callback)
|
|
156
166
|
callback(errorResponse);
|
|
157
|
-
|
|
158
|
-
else {
|
|
167
|
+
else
|
|
159
168
|
socket.emit('error', errorResponse);
|
|
160
|
-
}
|
|
161
169
|
}
|
|
162
170
|
});
|
|
163
171
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
/**
|
|
173
|
+
* Get or create circuit breaker for handler
|
|
174
|
+
*/
|
|
175
|
+
getCircuitBreaker(handlerKey) {
|
|
176
|
+
if (!this.circuitBreakers.has(handlerKey)) {
|
|
177
|
+
const circuitBreaker = new utilities_1.CircuitBreaker({
|
|
178
|
+
failureThreshold: 5,
|
|
179
|
+
resetTimeout: 60000,
|
|
180
|
+
monitoringPeriod: 10000,
|
|
181
|
+
});
|
|
182
|
+
this.circuitBreakers.set(handlerKey, circuitBreaker);
|
|
183
|
+
}
|
|
184
|
+
return this.circuitBreakers.get(handlerKey);
|
|
172
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Check rate limit for socket and handler
|
|
188
|
+
*/
|
|
173
189
|
checkRateLimit(socketId, handlerKey, rateLimit) {
|
|
174
190
|
if (!this.rateLimiters.has(handlerKey)) {
|
|
175
191
|
this.rateLimiters.set(handlerKey, new Map());
|
|
176
192
|
}
|
|
177
193
|
const handlerLimiter = this.rateLimiters.get(handlerKey);
|
|
178
194
|
const now = Date.now();
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
195
|
+
const windowStart = now - rateLimit.window;
|
|
196
|
+
// Clean old entries
|
|
197
|
+
for (const [id, data] of handlerLimiter.entries()) {
|
|
198
|
+
if (data.resetTime < windowStart) {
|
|
199
|
+
handlerLimiter.delete(id);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Check current socket
|
|
203
|
+
const socketData = handlerLimiter.get(socketId);
|
|
204
|
+
if (!socketData) {
|
|
205
|
+
handlerLimiter.set(socketId, { count: 1, resetTime: now });
|
|
185
206
|
return true;
|
|
186
207
|
}
|
|
187
|
-
if (
|
|
208
|
+
if (socketData.resetTime < windowStart) {
|
|
209
|
+
socketData.count = 1;
|
|
210
|
+
socketData.resetTime = now;
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
if (socketData.count >= rateLimit.requests) {
|
|
188
214
|
return false;
|
|
189
215
|
}
|
|
190
|
-
|
|
216
|
+
socketData.count++;
|
|
191
217
|
return true;
|
|
192
218
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
219
|
+
/**
|
|
220
|
+
* Process binary data efficiently
|
|
221
|
+
*/
|
|
222
|
+
processBinaryData(buffer) {
|
|
223
|
+
// Example binary processing - can be extended based on needs
|
|
224
|
+
if (buffer.length === 0)
|
|
225
|
+
return buffer;
|
|
226
|
+
// Simple compression check
|
|
227
|
+
if (buffer[0] === 0x1f && buffer[1] === 0x8b) {
|
|
228
|
+
// This is gzipped data
|
|
229
|
+
try {
|
|
230
|
+
const zlib = require('zlib');
|
|
231
|
+
return zlib.gunzipSync(buffer);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return buffer;
|
|
235
|
+
}
|
|
200
236
|
}
|
|
201
|
-
return
|
|
237
|
+
return buffer;
|
|
202
238
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
239
|
+
/**
|
|
240
|
+
* Check if data should be compressed
|
|
241
|
+
*/
|
|
242
|
+
shouldCompress(data) {
|
|
243
|
+
if (typeof data === 'string') {
|
|
244
|
+
return data.length > 1024;
|
|
245
|
+
}
|
|
246
|
+
if (Buffer.isBuffer(data)) {
|
|
247
|
+
return data.length > 1024;
|
|
248
|
+
}
|
|
249
|
+
if (typeof data === 'object') {
|
|
250
|
+
return JSON.stringify(data).length > 1024;
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Close the WebSocket manager and underlying adapter
|
|
256
|
+
*/
|
|
257
|
+
async close() {
|
|
258
|
+
this.logger.info('Closing WebSocket manager', 'Shutdown');
|
|
259
|
+
// Clear rate limiters
|
|
260
|
+
this.rateLimiters.clear();
|
|
261
|
+
// Clear circuit breakers
|
|
262
|
+
this.circuitBreakers.clear();
|
|
263
|
+
// Close adapter
|
|
264
|
+
await this.adapter.close();
|
|
207
265
|
}
|
|
208
266
|
}
|
|
209
267
|
exports.WebSocketManager = WebSocketManager;
|