@morojs/moro 1.8.11 → 1.8.13

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 (84) hide show
  1. package/README.md +4 -2
  2. package/dist/core/cluster/thread-cluster.d.ts +25 -0
  3. package/dist/core/cluster/thread-cluster.js +95 -3
  4. package/dist/core/cluster/thread-cluster.js.map +1 -1
  5. package/dist/core/config/config-validator.js +15 -0
  6. package/dist/core/config/config-validator.js.map +1 -1
  7. package/dist/core/config/index.js +19 -2
  8. package/dist/core/config/index.js.map +1 -1
  9. package/dist/core/framework.d.ts +26 -0
  10. package/dist/core/framework.js +195 -6
  11. package/dist/core/framework.js.map +1 -1
  12. package/dist/core/http/http-server.d.ts +17 -0
  13. package/dist/core/http/http-server.js +21 -1
  14. package/dist/core/http/http-server.js.map +1 -1
  15. package/dist/core/http/http2-server.d.ts +13 -0
  16. package/dist/core/http/http2-server.js +11 -0
  17. package/dist/core/http/http2-server.js.map +1 -1
  18. package/dist/core/http/moro-engine-server.d.ts +28 -0
  19. package/dist/core/http/moro-engine-server.js +118 -12
  20. package/dist/core/http/moro-engine-server.js.map +1 -1
  21. package/dist/core/http/utils/body-type.d.ts +12 -0
  22. package/dist/core/http/utils/body-type.js +70 -0
  23. package/dist/core/http/utils/body-type.js.map +1 -0
  24. package/dist/core/http/utils/ssl-config.d.ts +11 -0
  25. package/dist/core/http/utils/ssl-config.js +3 -0
  26. package/dist/core/http/utils/ssl-config.js.map +1 -1
  27. package/dist/core/http/utils/uws-worker-clustering.js +5 -4
  28. package/dist/core/http/utils/uws-worker-clustering.js.map +1 -1
  29. package/dist/core/http/uws-http-server.d.ts +3 -0
  30. package/dist/core/http/uws-http-server.js +22 -1
  31. package/dist/core/http/uws-http-server.js.map +1 -1
  32. package/dist/core/middleware/built-in/body-parsers/index.d.ts +18 -0
  33. package/dist/core/middleware/built-in/body-parsers/index.js +41 -0
  34. package/dist/core/middleware/built-in/body-parsers/index.js.map +1 -1
  35. package/dist/core/middleware/built-in/cache/adapters/cache/redis.d.ts +32 -8
  36. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js +117 -25
  37. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -1
  38. package/dist/core/middleware/built-in/compression/core.js +5 -0
  39. package/dist/core/middleware/built-in/compression/core.js.map +1 -1
  40. package/dist/core/middleware/built-in/session/core.d.ts +1 -0
  41. package/dist/core/middleware/built-in/session/core.js.map +1 -1
  42. package/dist/core/middleware/built-in/static/core.d.ts +18 -0
  43. package/dist/core/middleware/built-in/static/core.js +128 -7
  44. package/dist/core/middleware/built-in/static/core.js.map +1 -1
  45. package/dist/core/networking/adapters/engine-adapter.d.ts +2 -2
  46. package/dist/core/networking/adapters/engine-adapter.js +40 -1
  47. package/dist/core/networking/adapters/engine-adapter.js.map +1 -1
  48. package/dist/core/networking/adapters/socketio-adapter.d.ts +2 -2
  49. package/dist/core/networking/adapters/socketio-adapter.js +10 -1
  50. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  51. package/dist/core/networking/adapters/uws-adapter.d.ts +2 -2
  52. package/dist/core/networking/adapters/uws-adapter.js +54 -3
  53. package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
  54. package/dist/core/networking/adapters/ws-adapter.d.ts +9 -2
  55. package/dist/core/networking/adapters/ws-adapter.js +97 -12
  56. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  57. package/dist/core/networking/websocket-adapter.d.ts +19 -1
  58. package/dist/core/networking/websocket-adapter.js.map +1 -1
  59. package/dist/core/routing/index.d.ts +12 -7
  60. package/dist/core/routing/index.js +7 -2
  61. package/dist/core/routing/index.js.map +1 -1
  62. package/dist/core/routing/unified-router.d.ts +48 -9
  63. package/dist/core/routing/unified-router.js +112 -34
  64. package/dist/core/routing/unified-router.js.map +1 -1
  65. package/dist/core/utilities/package-utils.d.ts +11 -0
  66. package/dist/core/utilities/package-utils.js +3 -0
  67. package/dist/core/utilities/package-utils.js.map +1 -1
  68. package/dist/core/workers/worker-manager.js +2 -2
  69. package/dist/core/workers/worker-manager.js.map +1 -1
  70. package/dist/index.d.ts +4 -3
  71. package/dist/index.js +2 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/moro.d.ts +29 -18
  74. package/dist/moro.js +63 -7
  75. package/dist/moro.js.map +1 -1
  76. package/dist/types/cache.d.ts +2 -0
  77. package/dist/types/cache.js.map +1 -1
  78. package/dist/types/config.d.ts +9 -0
  79. package/dist/types/config.js.map +1 -1
  80. package/dist/types/http.d.ts +6 -0
  81. package/dist/types/http.js.map +1 -1
  82. package/dist/types/session.d.ts +1 -0
  83. package/dist/types/session.js.map +1 -1
  84. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace } from '../websocket-adapter.js';
1
+ import { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace, WebSocketNamespaceOptions } from '../websocket-adapter.js';
2
2
  /**
3
3
  * Socket.IO adapter implementation
4
4
  */
@@ -7,7 +7,7 @@ export declare class SocketIOAdapter implements WebSocketAdapter {
7
7
  private customIdGenerator?;
8
8
  private ioLogger;
9
9
  initialize(httpServer: any, options?: WebSocketAdapterOptions): Promise<void>;
10
- createNamespace(namespace: string): WebSocketNamespace;
10
+ createNamespace(namespace: string, options?: WebSocketNamespaceOptions): WebSocketNamespace;
11
11
  getDefaultNamespace(): WebSocketNamespace;
12
12
  close(): Promise<void>;
13
13
  setCompression(enabled: boolean, options?: any): void;
@@ -44,10 +44,15 @@ export class SocketIOAdapter {
44
44
  'Or use a different WebSocket adapter.');
45
45
  }
46
46
  }
47
- createNamespace(namespace) {
47
+ createNamespace(namespace, options) {
48
48
  if (!this.io) {
49
49
  throw new Error('Socket.IO adapter not initialized');
50
50
  }
51
+ if (options?.raw) {
52
+ // Socket.IO clients speak the Socket.IO protocol, so there is no raw
53
+ // frame to expose; the namespace behaves as an event namespace.
54
+ createFrameworkLogger('SocketIOAdapter').warn(`WebSocket namespace ${namespace}: { raw: true } is not supported by the Socket.IO adapter (use the engine, ws or uWS adapter for raw frames)`, 'Namespace');
55
+ }
51
56
  const ns = this.io.of(namespace);
52
57
  return new SocketIONamespaceWrapper(ns);
53
58
  }
@@ -163,6 +168,10 @@ class SocketIOConnectionWrapper {
163
168
  emit(event, data) {
164
169
  this.socket.emit(event, data);
165
170
  }
171
+ /** Socket.IO's own send(): delivers a 'message' event to the client */
172
+ send(data, _isBinary) {
173
+ this.socket.send(data);
174
+ }
166
175
  compressedEmit(event, data) {
167
176
  this.socket.compress(true).emit(event, data);
168
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"socketio-adapter.js","sourceRoot":"","sources":["../../../../src/core/networking/adapters/socketio-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// Socket.IO WebSocket Adapter for Moro Framework\n// Implements the WebSocket adapter interface using Socket.IO\n\nimport { resolveUserPackage } from '../../utilities/package-utils.js';\nimport {\n WebSocketAdapter,\n WebSocketAdapterOptions,\n WebSocketNamespace,\n WebSocketConnection,\n WebSocketEmitter,\n WebSocketMiddleware,\n} from '../websocket-adapter.js';\nimport { createFrameworkLogger } from '../../logger/index.js';\n\n/**\n * Socket.IO adapter implementation\n */\nexport class SocketIOAdapter implements WebSocketAdapter {\n private io: any; // Socket.IO server instance\n private customIdGenerator?: () => string;\n private ioLogger = createFrameworkLogger('SOCKETIO_ADAPTER');\n\n async initialize(httpServer: any, options: WebSocketAdapterOptions = {}): Promise<void> {\n try {\n // Dynamic import from user's context to find their installed socket.io\n const socketIOPath = resolveUserPackage('socket.io');\n const { Server } = await import(socketIOPath);\n\n // Never default to a wildcard origin. `{ origin: '*' }` disables\n // Socket.IO's same-origin protection for every deployment that doesn't\n // set CORS, exposing cookie-authenticated apps to cross-site hijacking.\n // When unset, keep Socket.IO's safe same-origin default and warn.\n const corsConfig = options.cors;\n if (!corsConfig) {\n this.ioLogger.warn(\n '[MoroJS Security] WebSocket CORS origin not configured; defaulting to same-origin. ' +\n 'Set websocket.options.cors.origin to allow specific cross-origin clients.'\n );\n }\n\n this.io = new Server(httpServer, {\n ...(corsConfig ? { cors: corsConfig } : {}),\n path: options.path || '/socket.io/',\n compression: options.compression !== false,\n maxHttpBufferSize: options.maxPayloadLength,\n ...options,\n });\n\n // Apply custom ID generator if set\n if (this.customIdGenerator) {\n (this.io.engine as any).generateId = this.customIdGenerator;\n }\n\n // Setup compression if enabled\n if (options.compression) {\n this.setCompression(true);\n }\n } catch {\n throw new Error(\n 'Socket.IO not found. Install it with: npm install socket.io\\n' +\n 'Or use a different WebSocket adapter.'\n );\n }\n }\n\n createNamespace(namespace: string): WebSocketNamespace {\n if (!this.io) {\n throw new Error('Socket.IO adapter not initialized');\n }\n\n const ns = this.io.of(namespace);\n return new SocketIONamespaceWrapper(ns);\n }\n\n getDefaultNamespace(): WebSocketNamespace {\n return this.createNamespace('/');\n }\n\n async close(): Promise<void> {\n if (this.io) {\n return new Promise(resolve => {\n this.io.close(() => resolve());\n });\n }\n }\n\n setCompression(enabled: boolean, options: any = {}): void {\n if (this.io && enabled) {\n (this.io.engine as any).compression = true;\n (this.io.engine as any).perMessageDeflate = {\n threshold: 1024,\n concurrencyLimit: 10,\n memLevel: 8,\n ...options,\n };\n }\n }\n\n setCustomIdGenerator(generator: () => string): void {\n this.customIdGenerator = generator;\n if (this.io) {\n (this.io.engine as any).generateId = generator;\n }\n }\n\n getAdapterName(): string {\n return 'socket.io';\n }\n\n getConnectionCount(): number {\n if (!this.io) return 0;\n return this.io.engine.clientsCount || 0;\n }\n}\n\n/**\n * Socket.IO namespace wrapper\n */\nclass SocketIONamespaceWrapper implements WebSocketNamespace {\n constructor(private namespace: any) {}\n\n on(event: 'connection', handler: (socket: WebSocketConnection) => void): void {\n this.namespace.on(event, (socket: any) => {\n handler(new SocketIOConnectionWrapper(socket));\n });\n }\n\n emit(event: string, data: any): void {\n this.namespace.emit(event, data);\n }\n\n to(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.to(r), this.namespace)\n : this.namespace.to(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n except(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.except(r), this.namespace)\n : this.namespace.except(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n getSockets(): WebSocketConnection[] {\n const sockets = this.namespace.sockets;\n return Array.from(sockets.values()).map((socket: any) => new SocketIOConnectionWrapper(socket));\n }\n\n getConnectionCount(): number {\n return this.namespace.sockets.size;\n }\n\n use(middleware: WebSocketMiddleware): void {\n this.namespace.use((socket: any, next: any) => {\n middleware(new SocketIOConnectionWrapper(socket), next);\n });\n }\n}\n\n/**\n * Socket.IO connection wrapper\n */\nclass SocketIOConnectionWrapper implements WebSocketConnection {\n public data: Record<string, any> = {};\n\n constructor(private socket: any) {\n // Map socket.data to our data property\n this.data = socket.data || {};\n }\n\n get id(): string {\n return this.socket.id;\n }\n\n get ip(): string | undefined {\n return this.socket.handshake?.address;\n }\n\n get headers(): Record<string, string> | undefined {\n return this.socket.handshake?.headers;\n }\n\n get connected(): boolean {\n return this.socket.connected;\n }\n\n get broadcast(): WebSocketEmitter {\n return new SocketIOEmitterWrapper(this.socket.broadcast);\n }\n\n on(event: string, handler: (data: any, callback?: (response?: any) => void) => void): void {\n this.socket.on(event, handler);\n }\n\n onAny(handler: (event: string, ...args: any[]) => void): void {\n this.socket.onAny(handler);\n }\n\n emit(event: string, data: any): void {\n this.socket.emit(event, data);\n }\n\n compressedEmit(event: string, data: any): void {\n this.socket.compress(true).emit(event, data);\n }\n\n join(room: string | string[]): void {\n if (Array.isArray(room)) {\n room.forEach(r => this.socket.join(r));\n } else {\n this.socket.join(room);\n }\n }\n\n leave(room: string | string[]): void {\n if (Array.isArray(room)) {\n room.forEach(r => this.socket.leave(r));\n } else {\n this.socket.leave(room);\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.to(r), this.socket)\n : this.socket.to(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n getRooms(): Set<string> {\n return new Set(this.socket.rooms);\n }\n\n disconnect(close?: boolean): void {\n this.socket.disconnect(close);\n }\n}\n\n/**\n * Socket.IO emitter wrapper\n */\nclass SocketIOEmitterWrapper implements WebSocketEmitter {\n constructor(private emitter: any) {}\n\n emit(event: string, data: any): void {\n this.emitter.emit(event, data);\n }\n\n to(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.to(r), this.emitter)\n : this.emitter.to(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n except(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.except(r), this.emitter)\n : this.emitter.except(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n compress(compress: boolean): WebSocketEmitter {\n return new SocketIOEmitterWrapper(this.emitter.compress(compress));\n }\n}\n"]}
1
+ {"version":3,"file":"socketio-adapter.js","sourceRoot":"","sources":["../../../../src/core/networking/adapters/socketio-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// Socket.IO WebSocket Adapter for Moro Framework\n// Implements the WebSocket adapter interface using Socket.IO\n\nimport { resolveUserPackage } from '../../utilities/package-utils.js';\nimport {\n WebSocketAdapter,\n WebSocketAdapterOptions,\n WebSocketNamespace,\n WebSocketNamespaceOptions,\n WebSocketConnection,\n WebSocketEmitter,\n WebSocketMiddleware,\n} from '../websocket-adapter.js';\nimport { createFrameworkLogger } from '../../logger/index.js';\n\n/**\n * Socket.IO adapter implementation\n */\nexport class SocketIOAdapter implements WebSocketAdapter {\n private io: any; // Socket.IO server instance\n private customIdGenerator?: () => string;\n private ioLogger = createFrameworkLogger('SOCKETIO_ADAPTER');\n\n async initialize(httpServer: any, options: WebSocketAdapterOptions = {}): Promise<void> {\n try {\n // Dynamic import from user's context to find their installed socket.io\n const socketIOPath = resolveUserPackage('socket.io');\n const { Server } = await import(socketIOPath);\n\n // Never default to a wildcard origin. `{ origin: '*' }` disables\n // Socket.IO's same-origin protection for every deployment that doesn't\n // set CORS, exposing cookie-authenticated apps to cross-site hijacking.\n // When unset, keep Socket.IO's safe same-origin default and warn.\n const corsConfig = options.cors;\n if (!corsConfig) {\n this.ioLogger.warn(\n '[MoroJS Security] WebSocket CORS origin not configured; defaulting to same-origin. ' +\n 'Set websocket.options.cors.origin to allow specific cross-origin clients.'\n );\n }\n\n this.io = new Server(httpServer, {\n ...(corsConfig ? { cors: corsConfig } : {}),\n path: options.path || '/socket.io/',\n compression: options.compression !== false,\n maxHttpBufferSize: options.maxPayloadLength,\n ...options,\n });\n\n // Apply custom ID generator if set\n if (this.customIdGenerator) {\n (this.io.engine as any).generateId = this.customIdGenerator;\n }\n\n // Setup compression if enabled\n if (options.compression) {\n this.setCompression(true);\n }\n } catch {\n throw new Error(\n 'Socket.IO not found. Install it with: npm install socket.io\\n' +\n 'Or use a different WebSocket adapter.'\n );\n }\n }\n\n createNamespace(namespace: string, options?: WebSocketNamespaceOptions): WebSocketNamespace {\n if (!this.io) {\n throw new Error('Socket.IO adapter not initialized');\n }\n if (options?.raw) {\n // Socket.IO clients speak the Socket.IO protocol, so there is no raw\n // frame to expose; the namespace behaves as an event namespace.\n createFrameworkLogger('SocketIOAdapter').warn(\n `WebSocket namespace ${namespace}: { raw: true } is not supported by the Socket.IO adapter (use the engine, ws or uWS adapter for raw frames)`,\n 'Namespace'\n );\n }\n\n const ns = this.io.of(namespace);\n return new SocketIONamespaceWrapper(ns);\n }\n\n getDefaultNamespace(): WebSocketNamespace {\n return this.createNamespace('/');\n }\n\n async close(): Promise<void> {\n if (this.io) {\n return new Promise(resolve => {\n this.io.close(() => resolve());\n });\n }\n }\n\n setCompression(enabled: boolean, options: any = {}): void {\n if (this.io && enabled) {\n (this.io.engine as any).compression = true;\n (this.io.engine as any).perMessageDeflate = {\n threshold: 1024,\n concurrencyLimit: 10,\n memLevel: 8,\n ...options,\n };\n }\n }\n\n setCustomIdGenerator(generator: () => string): void {\n this.customIdGenerator = generator;\n if (this.io) {\n (this.io.engine as any).generateId = generator;\n }\n }\n\n getAdapterName(): string {\n return 'socket.io';\n }\n\n getConnectionCount(): number {\n if (!this.io) return 0;\n return this.io.engine.clientsCount || 0;\n }\n}\n\n/**\n * Socket.IO namespace wrapper\n */\nclass SocketIONamespaceWrapper implements WebSocketNamespace {\n constructor(private namespace: any) {}\n\n on(event: 'connection', handler: (socket: WebSocketConnection) => void): void {\n this.namespace.on(event, (socket: any) => {\n handler(new SocketIOConnectionWrapper(socket));\n });\n }\n\n emit(event: string, data: any): void {\n this.namespace.emit(event, data);\n }\n\n to(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.to(r), this.namespace)\n : this.namespace.to(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n except(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.except(r), this.namespace)\n : this.namespace.except(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n getSockets(): WebSocketConnection[] {\n const sockets = this.namespace.sockets;\n return Array.from(sockets.values()).map((socket: any) => new SocketIOConnectionWrapper(socket));\n }\n\n getConnectionCount(): number {\n return this.namespace.sockets.size;\n }\n\n use(middleware: WebSocketMiddleware): void {\n this.namespace.use((socket: any, next: any) => {\n middleware(new SocketIOConnectionWrapper(socket), next);\n });\n }\n}\n\n/**\n * Socket.IO connection wrapper\n */\nclass SocketIOConnectionWrapper implements WebSocketConnection {\n public data: Record<string, any> = {};\n\n constructor(private socket: any) {\n // Map socket.data to our data property\n this.data = socket.data || {};\n }\n\n get id(): string {\n return this.socket.id;\n }\n\n get ip(): string | undefined {\n return this.socket.handshake?.address;\n }\n\n get headers(): Record<string, string> | undefined {\n return this.socket.handshake?.headers;\n }\n\n get connected(): boolean {\n return this.socket.connected;\n }\n\n get broadcast(): WebSocketEmitter {\n return new SocketIOEmitterWrapper(this.socket.broadcast);\n }\n\n on(event: string, handler: (data: any, callback?: (response?: any) => void) => void): void {\n this.socket.on(event, handler);\n }\n\n onAny(handler: (event: string, ...args: any[]) => void): void {\n this.socket.onAny(handler);\n }\n\n emit(event: string, data: any): void {\n this.socket.emit(event, data);\n }\n\n /** Socket.IO's own send(): delivers a 'message' event to the client */\n send(data: string | Buffer | ArrayBuffer | Uint8Array, _isBinary?: boolean): void {\n this.socket.send(data);\n }\n\n compressedEmit(event: string, data: any): void {\n this.socket.compress(true).emit(event, data);\n }\n\n join(room: string | string[]): void {\n if (Array.isArray(room)) {\n room.forEach(r => this.socket.join(r));\n } else {\n this.socket.join(room);\n }\n }\n\n leave(room: string | string[]): void {\n if (Array.isArray(room)) {\n room.forEach(r => this.socket.leave(r));\n } else {\n this.socket.leave(room);\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.to(r), this.socket)\n : this.socket.to(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n getRooms(): Set<string> {\n return new Set(this.socket.rooms);\n }\n\n disconnect(close?: boolean): void {\n this.socket.disconnect(close);\n }\n}\n\n/**\n * Socket.IO emitter wrapper\n */\nclass SocketIOEmitterWrapper implements WebSocketEmitter {\n constructor(private emitter: any) {}\n\n emit(event: string, data: any): void {\n this.emitter.emit(event, data);\n }\n\n to(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.to(r), this.emitter)\n : this.emitter.to(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n except(room: string | string[]): WebSocketEmitter {\n const target = Array.isArray(room)\n ? room.reduce((acc, r) => acc.except(r), this.emitter)\n : this.emitter.except(room);\n return new SocketIOEmitterWrapper(target);\n }\n\n compress(compress: boolean): WebSocketEmitter {\n return new SocketIOEmitterWrapper(this.emitter.compress(compress));\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace } from '../websocket-adapter.js';
1
+ import { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace, WebSocketNamespaceOptions } from '../websocket-adapter.js';
2
2
  /**
3
3
  * uWebSockets adapter implementation
4
4
  * Provides high-performance WebSocket support using uWebSockets.js
@@ -30,7 +30,7 @@ export declare class UWebSocketsAdapter implements WebSocketAdapter {
30
30
  private handleClose;
31
31
  private handleDrain;
32
32
  private generateId;
33
- createNamespace(namespace: string): WebSocketNamespace;
33
+ createNamespace(namespace: string, options?: WebSocketNamespaceOptions): WebSocketNamespace;
34
34
  getDefaultNamespace(): WebSocketNamespace;
35
35
  close(): Promise<void>;
36
36
  setCompression(enabled: boolean, options?: any): void;
@@ -156,17 +156,27 @@ export class UWebSocketsAdapter {
156
156
  // Notify default namespace of new connection
157
157
  const defaultNamespace = this.namespaces.get('/');
158
158
  if (defaultNamespace) {
159
+ connection.raw = defaultNamespace.raw;
159
160
  defaultNamespace.handleConnection(connection);
160
161
  }
161
162
  this.logger.debug(`WebSocket connection opened: ${id} from ${ip}`, 'Connection');
162
163
  }
163
- handleMessage(ws, message, _isBinary) {
164
+ handleMessage(ws, message, isBinary) {
164
165
  const connectionId = ws.connectionId;
165
166
  const connection = this.connections.get(connectionId);
166
167
  if (!connection) {
167
168
  this.logger.warn(`Message received for unknown connection: ${connectionId}`, 'Message');
168
169
  return;
169
170
  }
171
+ if (connection.raw) {
172
+ // Raw namespace: the uWS ArrayBuffer is only valid inside this callback,
173
+ // so the bytes are copied out before any handler can hold on to them.
174
+ if (isBinary)
175
+ connection.handleBinary(Buffer.from(new Uint8Array(message)));
176
+ else
177
+ connection.handleRawText(textDecoder.decode(message));
178
+ return;
179
+ }
170
180
  try {
171
181
  // Parse message - expect JSON format for compatibility with socket.io-like behavior
172
182
  const messageStr = textDecoder.decode(message);
@@ -201,14 +211,17 @@ export class UWebSocketsAdapter {
201
211
  }
202
212
  return `uws_${++this.connectionCounter}_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
203
213
  }
204
- createNamespace(namespace) {
214
+ createNamespace(namespace, options) {
205
215
  if (!this.namespaces.has(namespace)) {
206
216
  const ns = new UWSNamespaceWrapper(namespace, this.connections);
207
217
  this.namespaces.set(namespace, ns);
208
218
  this.logger.debug(`Created namespace: ${namespace}`, 'Namespace');
209
219
  }
210
220
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
211
- return this.namespaces.get(namespace);
221
+ const ns = this.namespaces.get(namespace);
222
+ if (options?.raw)
223
+ ns.raw = true;
224
+ return ns;
212
225
  }
213
226
  getDefaultNamespace() {
214
227
  return this.createNamespace('/');
@@ -257,6 +270,8 @@ export class UWebSocketsAdapter {
257
270
  class UWSNamespaceWrapper {
258
271
  namespace;
259
272
  connections;
273
+ /** Raw framing for connections routed here (see WebSocketNamespaceOptions) */
274
+ raw = false;
260
275
  connectionHandlers = [];
261
276
  middlewares = [];
262
277
  constructor(namespace, connections) {
@@ -343,6 +358,8 @@ class UWSConnectionWrapper {
343
358
  namespaces;
344
359
  data = {};
345
360
  connected = true;
361
+ /** Raw framing (set from the namespace at connection) */
362
+ raw = false;
346
363
  rooms = new Set();
347
364
  eventHandlers = new Map();
348
365
  anyHandlers = [];
@@ -391,6 +408,40 @@ class UWSConnectionWrapper {
391
408
  // So this is the same as regular emit
392
409
  this.emit(event, data);
393
410
  }
411
+ send(data, isBinary) {
412
+ if (!this.connected)
413
+ return;
414
+ try {
415
+ const sent = this.ws.send(data, isBinary ?? typeof data !== 'string');
416
+ if (!sent)
417
+ this.logger.warn(`Backpressure detected for connection ${this.id}`, 'Backpressure');
418
+ }
419
+ catch (error) {
420
+ this.logger.error(`Failed to send frame: ${error instanceof Error ? error.message : String(error)}`, 'Send');
421
+ }
422
+ }
423
+ /** Raw namespace: a text frame reaches the 'message' handlers verbatim */
424
+ handleRawText(text) {
425
+ if (!this.connected)
426
+ return;
427
+ for (const handler of this.anyHandlers)
428
+ handler('message', text);
429
+ const handlers = this.eventHandlers.get('message');
430
+ if (handlers)
431
+ for (const handler of handlers)
432
+ handler(text);
433
+ }
434
+ /** A binary frame reaches the 'binary' handlers as a Buffer */
435
+ handleBinary(data) {
436
+ if (!this.connected)
437
+ return;
438
+ for (const handler of this.anyHandlers)
439
+ handler('binary', data);
440
+ const handlers = this.eventHandlers.get('binary');
441
+ if (handlers)
442
+ for (const handler of handlers)
443
+ handler(data);
444
+ }
394
445
  handleMessage(data) {
395
446
  if (!data || typeof data !== 'object') {
396
447
  this.logger.warn(`Invalid message format from ${this.id}`, 'Message');
@@ -1 +1 @@
1
- {"version":3,"file":"uws-adapter.js","sourceRoot":"","sources":["../../../../src/core/networking/adapters/uws-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// uWebSockets Adapter for Moro Framework\n// Implements the WebSocket adapter interface using uWebSockets.js\n// High-performance C++ WebSocket implementation with native Node.js bindings\n\nimport crypto from 'crypto';\nimport { TextDecoder } from 'util';\nimport { loadNativeEngine } from '../../utilities/package-utils.js';\n\n// Reusable TextDecoder instance — avoids Buffer allocation per WS message\nconst textDecoder = new TextDecoder('utf-8');\n\nimport {\n WebSocketAdapter,\n WebSocketAdapterOptions,\n WebSocketNamespace,\n WebSocketConnection,\n WebSocketEmitter,\n WebSocketMiddleware,\n} from '../websocket-adapter.js';\nimport { createFrameworkLogger } from '../../logger/index.js';\n\n/**\n * uWebSockets adapter implementation\n * Provides high-performance WebSocket support using uWebSockets.js\n */\nexport class UWebSocketsAdapter implements WebSocketAdapter {\n private app: any; // uWebSockets app instance\n private uws: any; // uWebSockets module reference (stored to avoid re-importing)\n private listenSocket: any; // uWebSockets listen socket\n private namespaces = new Map<string, UWSNamespaceWrapper>();\n private connections = new Map<string, UWSConnectionWrapper>();\n private logger = createFrameworkLogger('UWS_ADAPTER');\n private customIdGenerator?: () => string;\n private connectionCounter = 0;\n private compressionEnabled = false;\n private compressionOptions: any = {};\n private httpServer: any; // Reference to Node.js HTTP server for compatibility\n\n async initialize(httpServer: any, options: WebSocketAdapterOptions = {}): Promise<void> {\n try {\n // This adapter needs the uWS-shaped API (App/SSLApp/ws/us_listen_socket_*)\n // - specifically uWebSockets.js, NOT the Moro-shaped @morojs/engine.\n const engine = loadNativeEngine({ candidates: ['uWebSockets.js'] });\n if (!engine) {\n throw new Error('uWebSockets.js is not available for the uws WebSocket adapter');\n }\n this.uws = engine.module.default || engine.module;\n\n // Store HTTP server reference for compatibility\n this.httpServer = httpServer;\n\n // Check if SSL/TLS options are provided\n const sslOptions = (options as any).ssl;\n\n if (httpServer && typeof httpServer.ws === 'function') {\n // Integrated mode: the framework passes the engine's own uWS app.\n // Register .ws() routes directly on it so WebSocket upgrades share\n // the HTTP listen socket. (Creating a second App() here would attach\n // the routes to an app that never listens - upgrades on the real\n // port would fail.)\n this.app = httpServer;\n this.logger.info('Using integrated uWebSockets app from HTTP server', 'Init');\n } else if (sslOptions && sslOptions.key_file_name && sslOptions.cert_file_name) {\n // Standalone SSL app (adapter owns the listen socket via listen())\n this.app = this.uws.SSLApp({\n key_file_name: sslOptions.key_file_name,\n cert_file_name: sslOptions.cert_file_name,\n passphrase: sslOptions.passphrase,\n ...sslOptions,\n });\n this.logger.info('uWebSockets SSL/TLS app created', 'Init');\n } else {\n // Standalone app (adapter owns the listen socket via listen())\n this.app = this.uws.App();\n this.logger.info('uWebSockets app created', 'Init');\n }\n\n // Setup WebSocket route with configurable path\n const wsPath = options.path || '/*';\n const maxPayloadLength = options.maxPayloadLength || 16 * 1024 * 1024; // 16MB default\n const idleTimeout = options.idleTimeout || 120; // 2 minutes default\n\n // Configure compression if enabled\n const compression = options.compression !== false;\n\n this.app.ws(wsPath, {\n // Compression settings - uWebSockets.js has built-in compression\n compression: compression ? 1 : 0, // 0 = disabled, 1 = shared compressor, 2 = dedicated compressor\n maxPayloadLength,\n idleTimeout,\n maxBackpressure: 1024 * 1024, // 1MB backpressure limit\n\n // Connection opened\n open: (ws: any) => {\n this.handleConnection(ws);\n },\n\n // Message received\n message: (ws: any, message: ArrayBuffer, isBinary: boolean) => {\n this.handleMessage(ws, message, isBinary);\n },\n\n // Connection closed\n close: (ws: any, code: number, message: ArrayBuffer) => {\n this.handleClose(ws, code, message);\n },\n\n // Drain handler for backpressure management\n drain: (ws: any) => {\n this.handleDrain(ws);\n },\n });\n\n // Setup default namespace\n this.createNamespace('/');\n\n this.logger.info('uWebSockets adapter initialized', 'Init');\n } catch (error) {\n // Throw helpful error with installation instructions. This adapter only\n // works with uWebSockets.js - do not suggest @morojs/engine, which it\n // deliberately refuses to load.\n throw new Error(\n 'Failed to load uWebSockets.js for the uws WebSocket adapter\\n' +\n 'Install it with:\\n' +\n ' npm install github:uNetworking/uWebSockets.js#v20.52.0\\n' +\n 'Or use a different WebSocket adapter (socket.io or ws) in your config.\\n' +\n 'Error: ' +\n (error instanceof Error ? error.message : String(error))\n );\n }\n }\n\n /**\n * Start listening on a specific port\n * This is necessary because uWebSockets.js manages its own server\n */\n listen(port: number, callback?: (token: any) => void): void {\n if (!this.app) {\n throw new Error('uWebSockets app not initialized. Call initialize() first.');\n }\n\n this.app.listen(port, (token: any) => {\n if (token) {\n this.listenSocket = token;\n this.logger.info(`uWebSockets listening on port ${port}`, 'Listen');\n if (callback) callback(token);\n } else {\n this.logger.error(`Failed to listen on port ${port}`, 'Listen');\n }\n });\n }\n\n /**\n * Start listening on host and port\n */\n listenWithHost(host: string, port: number, callback?: (token: any) => void): void {\n if (!this.app) {\n throw new Error('uWebSockets app not initialized. Call initialize() first.');\n }\n\n this.app.listen(host, port, (token: any) => {\n if (token) {\n this.listenSocket = token;\n this.logger.info(`uWebSockets listening on ${host}:${port}`, 'Listen');\n if (callback) callback(token);\n } else {\n this.logger.error(`Failed to listen on ${host}:${port}`, 'Listen');\n }\n });\n }\n\n private handleConnection(ws: any): void {\n const id = this.generateId();\n\n // Extract connection info\n const ip = Buffer.from(ws.getRemoteAddressAsText()).toString();\n\n // Create connection wrapper\n const connection = new UWSConnectionWrapper(ws, id, ip, this.namespaces);\n this.connections.set(id, connection);\n\n // Store connection ID on the WebSocket for later retrieval\n ws.connectionId = id;\n\n // Notify default namespace of new connection\n const defaultNamespace = this.namespaces.get('/');\n if (defaultNamespace) {\n defaultNamespace.handleConnection(connection);\n }\n\n this.logger.debug(`WebSocket connection opened: ${id} from ${ip}`, 'Connection');\n }\n\n private handleMessage(ws: any, message: ArrayBuffer, _isBinary: boolean): void {\n const connectionId = ws.connectionId;\n const connection = this.connections.get(connectionId);\n\n if (!connection) {\n this.logger.warn(`Message received for unknown connection: ${connectionId}`, 'Message');\n return;\n }\n\n try {\n // Parse message - expect JSON format for compatibility with socket.io-like behavior\n const messageStr = textDecoder.decode(message);\n const data = JSON.parse(messageStr);\n\n // Handle message in connection wrapper\n connection.handleMessage(data);\n } catch (error) {\n this.logger.error(\n `Failed to parse message from ${connectionId}: ${error instanceof Error ? error.message : String(error)}`,\n 'Message'\n );\n }\n }\n\n private handleClose(ws: any, code: number, message: ArrayBuffer): void {\n const connectionId = ws.connectionId;\n const connection = this.connections.get(connectionId);\n\n if (connection) {\n connection.handleClose(code, message);\n this.connections.delete(connectionId);\n this.logger.debug(`WebSocket connection closed: ${connectionId}`, 'Connection');\n }\n }\n\n private handleDrain(ws: any): void {\n // Handle backpressure drain event\n const connectionId = ws.connectionId;\n const connection = this.connections.get(connectionId);\n\n if (connection) {\n connection.handleDrain();\n }\n }\n\n private generateId(): string {\n if (this.customIdGenerator) {\n return this.customIdGenerator();\n }\n return `uws_${++this.connectionCounter}_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;\n }\n\n createNamespace(namespace: string): WebSocketNamespace {\n if (!this.namespaces.has(namespace)) {\n const ns = new UWSNamespaceWrapper(namespace, this.connections);\n this.namespaces.set(namespace, ns);\n this.logger.debug(`Created namespace: ${namespace}`, 'Namespace');\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.namespaces.get(namespace)!;\n }\n\n getDefaultNamespace(): WebSocketNamespace {\n return this.createNamespace('/');\n }\n\n async close(): Promise<void> {\n // Close all connections\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [id, connection] of this.connections) {\n connection.disconnect(true);\n }\n this.connections.clear();\n this.namespaces.clear();\n\n // Close the uWebSockets listen socket\n if (this.listenSocket && this.uws) {\n // Use stored module reference instead of re-importing\n this.uws.us_listen_socket_close(this.listenSocket);\n this.listenSocket = null;\n }\n\n this.logger.info('uWebSockets adapter closed', 'Close');\n }\n\n setCompression(enabled: boolean, options?: any): void {\n this.compressionEnabled = enabled;\n this.compressionOptions = options || {};\n this.logger.debug(`Compression ${enabled ? 'enabled' : 'disabled'}`, 'Compression');\n }\n\n setCustomIdGenerator(generator: () => string): void {\n this.customIdGenerator = generator;\n this.logger.debug('Custom ID generator set', 'Config');\n }\n\n getAdapterName(): string {\n return 'uWebSockets.js';\n }\n\n getConnectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Get the underlying uWebSockets app for advanced usage\n */\n getApp(): any {\n return this.app;\n }\n}\n\n/**\n * Namespace wrapper for uWebSockets\n */\nclass UWSNamespaceWrapper implements WebSocketNamespace {\n private connectionHandlers: ((socket: WebSocketConnection) => void)[] = [];\n private middlewares: WebSocketMiddleware[] = [];\n\n constructor(\n private namespace: string,\n private connections: Map<string, UWSConnectionWrapper>\n ) {}\n\n on(event: 'connection', handler: (socket: WebSocketConnection) => void): void {\n if (event === 'connection') {\n this.connectionHandlers.push(handler);\n }\n }\n\n handleConnection(connection: UWSConnectionWrapper): void {\n // Run middlewares\n this.runMiddlewares(connection, err => {\n if (err) {\n connection.disconnect(true);\n return;\n }\n\n // Notify all connection handlers\n for (const handler of this.connectionHandlers) {\n handler(connection);\n }\n });\n }\n\n private runMiddlewares(\n connection: UWSConnectionWrapper,\n finalCallback: (err?: Error) => void\n ): void {\n let index = 0;\n\n const next = (err?: Error) => {\n if (err) {\n finalCallback(err);\n return;\n }\n\n if (index >= this.middlewares.length) {\n finalCallback();\n return;\n }\n\n const middleware = this.middlewares[index++];\n middleware?.(connection, next);\n };\n\n next();\n }\n\n emit(event: string, data: any): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [id, connection] of this.connections) {\n if (connection.connected) {\n connection.emit(event, data);\n }\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n return new UWSEmitterWrapper(this.connections, { rooms: Array.isArray(room) ? room : [room] });\n }\n\n except(room: string | string[]): WebSocketEmitter {\n return new UWSEmitterWrapper(this.connections, {\n exceptRooms: Array.isArray(room) ? room : [room],\n });\n }\n\n getSockets(): WebSocketConnection[] {\n const result: WebSocketConnection[] = [];\n for (const conn of this.connections.values()) {\n if (conn.connected) result.push(conn);\n }\n return result;\n }\n\n getConnectionCount(): number {\n let count = 0;\n for (const conn of this.connections.values()) {\n if (conn.connected) count++;\n }\n return count;\n }\n\n use(middleware: WebSocketMiddleware): void {\n this.middlewares.push(middleware);\n }\n}\n\n/**\n * Connection wrapper for uWebSockets\n */\nclass UWSConnectionWrapper implements WebSocketConnection {\n public data: Record<string, any> = {};\n public connected = true;\n private rooms = new Set<string>();\n private eventHandlers = new Map<\n string,\n Array<(data: any, callback?: (response?: any) => void) => void>\n >();\n private anyHandlers: Array<(event: string, ...args: any[]) => void> = [];\n private logger = createFrameworkLogger('UWS_CONNECTION');\n\n constructor(\n private ws: any,\n public readonly id: string,\n public readonly ip: string,\n private namespaces: Map<string, UWSNamespaceWrapper>\n ) {\n this.headers = this.parseHeaders();\n }\n\n public readonly headers: Record<string, string>;\n\n private parseHeaders(): Record<string, string> {\n // uWebSockets doesn't provide easy header access\n // We'll return empty headers for now, but this could be enhanced\n return {};\n }\n\n on(event: string, handler: (data: any, callback?: (response?: any) => void) => void): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.eventHandlers.get(event)!.push(handler);\n }\n\n onAny(handler: (event: string, ...args: any[]) => void): void {\n this.anyHandlers.push(handler);\n }\n\n emit(event: string, data: any): void {\n if (!this.connected) return;\n\n try {\n const message = JSON.stringify({ event, data });\n const buffer = Buffer.from(message);\n\n // Send message with backpressure handling\n const sent = this.ws.send(buffer, false); // false = not binary\n\n if (!sent) {\n this.logger.warn(`Backpressure detected for connection ${this.id}`, 'Backpressure');\n }\n } catch (error) {\n this.logger.error(\n `Failed to emit event ${event}: ${error instanceof Error ? error.message : String(error)}`,\n 'Emit'\n );\n }\n }\n\n compressedEmit(event: string, data: any): void {\n // uWebSockets.js handles compression automatically based on app configuration\n // So this is the same as regular emit\n this.emit(event, data);\n }\n\n handleMessage(data: any): void {\n if (!data || typeof data !== 'object') {\n this.logger.warn(`Invalid message format from ${this.id}`, 'Message');\n return;\n }\n\n const { event, data: eventData, callback: hasCallback } = data;\n\n if (!event) {\n this.logger.warn(`Message without event from ${this.id}`, 'Message');\n return;\n }\n\n // Create callback function if client expects response\n const callback = hasCallback\n ? (response?: any) => {\n this.emit(`${event}:response`, response);\n }\n : undefined;\n\n // Notify any handlers\n for (const handler of this.anyHandlers) {\n handler(event, eventData);\n }\n\n // Notify specific event handlers\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(eventData, callback);\n } catch (error) {\n this.logger.error(\n `Error in event handler for ${event}: ${error instanceof Error ? error.message : String(error)}`,\n 'Handler'\n );\n }\n }\n }\n }\n\n handleClose(code: number, _message: ArrayBuffer): void {\n this.connected = false;\n this.logger.debug(`Connection ${this.id} closed with code ${code}`, 'Close');\n }\n\n handleDrain(): void {\n // Backpressure has been relieved\n this.logger.debug(`Connection ${this.id} drained`, 'Drain');\n }\n\n join(room: string | string[]): void {\n const roomsToJoin = Array.isArray(room) ? room : [room];\n for (const r of roomsToJoin) {\n this.rooms.add(r);\n this.logger.debug(`Connection ${this.id} joined room ${r}`, 'Room');\n }\n }\n\n leave(room: string | string[]): void {\n const roomsToLeave = Array.isArray(room) ? room : [room];\n for (const r of roomsToLeave) {\n this.rooms.delete(r);\n this.logger.debug(`Connection ${this.id} left room ${r}`, 'Room');\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n return new UWSEmitterWrapper(new Map([[this.id, this]]), {\n rooms: Array.isArray(room) ? room : [room],\n });\n }\n\n get broadcast(): WebSocketEmitter {\n const filtered = new Map<string, UWSConnectionWrapper>();\n const namespace = this.namespaces.get('/');\n if (namespace) {\n for (const conn of (namespace as any).connections.values()) {\n if (conn.connected && conn.id !== this.id) {\n filtered.set(conn.id, conn as UWSConnectionWrapper);\n }\n }\n }\n return new UWSEmitterWrapper(filtered, {});\n }\n\n getRooms(): Set<string> {\n return new Set(this.rooms);\n }\n\n disconnect(close = false): void {\n if (!this.connected) return;\n\n this.connected = false;\n\n if (close && this.ws) {\n try {\n this.ws.end(1000, 'Normal closure');\n } catch (error) {\n this.logger.error(\n `Error closing WebSocket: ${error instanceof Error ? error.message : String(error)}`,\n 'Disconnect'\n );\n }\n }\n }\n}\n\n/**\n * Emitter wrapper for room-based broadcasting\n */\nclass UWSEmitterWrapper implements WebSocketEmitter {\n private targetRooms: string[] = [];\n private excludedRooms: string[] = [];\n private useCompression = false;\n\n constructor(\n private connections: Map<string, UWSConnectionWrapper>,\n private options: { rooms?: string[]; exceptRooms?: string[] } = {}\n ) {\n this.targetRooms = options.rooms || [];\n this.excludedRooms = options.exceptRooms || [];\n }\n\n emit(event: string, data: any): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [id, connection] of this.connections) {\n if (!connection.connected) continue;\n\n // Check room filtering\n const connectionRooms = connection.getRooms();\n\n // If target rooms specified, connection must be in at least one\n if (this.targetRooms.length > 0) {\n let inTargetRoom = false;\n const targetLen = this.targetRooms.length;\n for (let i = 0; i < targetLen; i++) {\n if (connectionRooms.has(this.targetRooms[i] as string)) {\n inTargetRoom = true;\n break;\n }\n }\n if (!inTargetRoom) continue;\n }\n\n // If excluded rooms specified, connection must not be in any\n if (this.excludedRooms.length > 0) {\n let inExcludedRoom = false;\n const excludeLen = this.excludedRooms.length;\n for (let i = 0; i < excludeLen; i++) {\n if (connectionRooms.has(this.excludedRooms[i] as string)) {\n inExcludedRoom = true;\n break;\n }\n }\n if (inExcludedRoom) continue;\n }\n\n // Emit to connection\n if (this.useCompression && connection.compressedEmit) {\n connection.compressedEmit(event, data);\n } else {\n connection.emit(event, data);\n }\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n // Avoid unnecessary array wrapping and spreading\n let newTargetRooms: string[];\n if (Array.isArray(room)) {\n if (this.targetRooms.length === 0) {\n newTargetRooms = room;\n } else {\n newTargetRooms = this.targetRooms.concat(room);\n }\n } else {\n if (this.targetRooms.length === 0) {\n newTargetRooms = [room];\n } else {\n newTargetRooms = [...this.targetRooms, room];\n }\n }\n return new UWSEmitterWrapper(this.connections, {\n rooms: newTargetRooms,\n exceptRooms: this.excludedRooms,\n });\n }\n\n except(room: string | string[]): WebSocketEmitter {\n // Avoid unnecessary array wrapping and spreading\n let newExcludedRooms: string[];\n if (Array.isArray(room)) {\n if (this.excludedRooms.length === 0) {\n newExcludedRooms = room;\n } else {\n newExcludedRooms = this.excludedRooms.concat(room);\n }\n } else {\n if (this.excludedRooms.length === 0) {\n newExcludedRooms = [room];\n } else {\n newExcludedRooms = [...this.excludedRooms, room];\n }\n }\n return new UWSEmitterWrapper(this.connections, {\n rooms: this.targetRooms,\n exceptRooms: newExcludedRooms,\n });\n }\n\n compress(compress: boolean): WebSocketEmitter {\n this.useCompression = compress;\n return this;\n }\n}\n"]}
1
+ {"version":3,"file":"uws-adapter.js","sourceRoot":"","sources":["../../../../src/core/networking/adapters/uws-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// uWebSockets Adapter for Moro Framework\n// Implements the WebSocket adapter interface using uWebSockets.js\n// High-performance C++ WebSocket implementation with native Node.js bindings\n\nimport crypto from 'crypto';\nimport { TextDecoder } from 'util';\nimport { loadNativeEngine } from '../../utilities/package-utils.js';\n\n// Reusable TextDecoder instance — avoids Buffer allocation per WS message\nconst textDecoder = new TextDecoder('utf-8');\n\nimport {\n WebSocketAdapter,\n WebSocketAdapterOptions,\n WebSocketNamespace,\n WebSocketNamespaceOptions,\n WebSocketConnection,\n WebSocketEmitter,\n WebSocketMiddleware,\n} from '../websocket-adapter.js';\nimport { createFrameworkLogger } from '../../logger/index.js';\n\n/**\n * uWebSockets adapter implementation\n * Provides high-performance WebSocket support using uWebSockets.js\n */\nexport class UWebSocketsAdapter implements WebSocketAdapter {\n private app: any; // uWebSockets app instance\n private uws: any; // uWebSockets module reference (stored to avoid re-importing)\n private listenSocket: any; // uWebSockets listen socket\n private namespaces = new Map<string, UWSNamespaceWrapper>();\n private connections = new Map<string, UWSConnectionWrapper>();\n private logger = createFrameworkLogger('UWS_ADAPTER');\n private customIdGenerator?: () => string;\n private connectionCounter = 0;\n private compressionEnabled = false;\n private compressionOptions: any = {};\n private httpServer: any; // Reference to Node.js HTTP server for compatibility\n\n async initialize(httpServer: any, options: WebSocketAdapterOptions = {}): Promise<void> {\n try {\n // This adapter needs the uWS-shaped API (App/SSLApp/ws/us_listen_socket_*)\n // - specifically uWebSockets.js, NOT the Moro-shaped @morojs/engine.\n const engine = loadNativeEngine({ candidates: ['uWebSockets.js'] });\n if (!engine) {\n throw new Error('uWebSockets.js is not available for the uws WebSocket adapter');\n }\n this.uws = engine.module.default || engine.module;\n\n // Store HTTP server reference for compatibility\n this.httpServer = httpServer;\n\n // Check if SSL/TLS options are provided\n const sslOptions = (options as any).ssl;\n\n if (httpServer && typeof httpServer.ws === 'function') {\n // Integrated mode: the framework passes the engine's own uWS app.\n // Register .ws() routes directly on it so WebSocket upgrades share\n // the HTTP listen socket. (Creating a second App() here would attach\n // the routes to an app that never listens - upgrades on the real\n // port would fail.)\n this.app = httpServer;\n this.logger.info('Using integrated uWebSockets app from HTTP server', 'Init');\n } else if (sslOptions && sslOptions.key_file_name && sslOptions.cert_file_name) {\n // Standalone SSL app (adapter owns the listen socket via listen())\n this.app = this.uws.SSLApp({\n key_file_name: sslOptions.key_file_name,\n cert_file_name: sslOptions.cert_file_name,\n passphrase: sslOptions.passphrase,\n ...sslOptions,\n });\n this.logger.info('uWebSockets SSL/TLS app created', 'Init');\n } else {\n // Standalone app (adapter owns the listen socket via listen())\n this.app = this.uws.App();\n this.logger.info('uWebSockets app created', 'Init');\n }\n\n // Setup WebSocket route with configurable path\n const wsPath = options.path || '/*';\n const maxPayloadLength = options.maxPayloadLength || 16 * 1024 * 1024; // 16MB default\n const idleTimeout = options.idleTimeout || 120; // 2 minutes default\n\n // Configure compression if enabled\n const compression = options.compression !== false;\n\n this.app.ws(wsPath, {\n // Compression settings - uWebSockets.js has built-in compression\n compression: compression ? 1 : 0, // 0 = disabled, 1 = shared compressor, 2 = dedicated compressor\n maxPayloadLength,\n idleTimeout,\n maxBackpressure: 1024 * 1024, // 1MB backpressure limit\n\n // Connection opened\n open: (ws: any) => {\n this.handleConnection(ws);\n },\n\n // Message received\n message: (ws: any, message: ArrayBuffer, isBinary: boolean) => {\n this.handleMessage(ws, message, isBinary);\n },\n\n // Connection closed\n close: (ws: any, code: number, message: ArrayBuffer) => {\n this.handleClose(ws, code, message);\n },\n\n // Drain handler for backpressure management\n drain: (ws: any) => {\n this.handleDrain(ws);\n },\n });\n\n // Setup default namespace\n this.createNamespace('/');\n\n this.logger.info('uWebSockets adapter initialized', 'Init');\n } catch (error) {\n // Throw helpful error with installation instructions. This adapter only\n // works with uWebSockets.js - do not suggest @morojs/engine, which it\n // deliberately refuses to load.\n throw new Error(\n 'Failed to load uWebSockets.js for the uws WebSocket adapter\\n' +\n 'Install it with:\\n' +\n ' npm install github:uNetworking/uWebSockets.js#v20.52.0\\n' +\n 'Or use a different WebSocket adapter (socket.io or ws) in your config.\\n' +\n 'Error: ' +\n (error instanceof Error ? error.message : String(error))\n );\n }\n }\n\n /**\n * Start listening on a specific port\n * This is necessary because uWebSockets.js manages its own server\n */\n listen(port: number, callback?: (token: any) => void): void {\n if (!this.app) {\n throw new Error('uWebSockets app not initialized. Call initialize() first.');\n }\n\n this.app.listen(port, (token: any) => {\n if (token) {\n this.listenSocket = token;\n this.logger.info(`uWebSockets listening on port ${port}`, 'Listen');\n if (callback) callback(token);\n } else {\n this.logger.error(`Failed to listen on port ${port}`, 'Listen');\n }\n });\n }\n\n /**\n * Start listening on host and port\n */\n listenWithHost(host: string, port: number, callback?: (token: any) => void): void {\n if (!this.app) {\n throw new Error('uWebSockets app not initialized. Call initialize() first.');\n }\n\n this.app.listen(host, port, (token: any) => {\n if (token) {\n this.listenSocket = token;\n this.logger.info(`uWebSockets listening on ${host}:${port}`, 'Listen');\n if (callback) callback(token);\n } else {\n this.logger.error(`Failed to listen on ${host}:${port}`, 'Listen');\n }\n });\n }\n\n private handleConnection(ws: any): void {\n const id = this.generateId();\n\n // Extract connection info\n const ip = Buffer.from(ws.getRemoteAddressAsText()).toString();\n\n // Create connection wrapper\n const connection = new UWSConnectionWrapper(ws, id, ip, this.namespaces);\n this.connections.set(id, connection);\n\n // Store connection ID on the WebSocket for later retrieval\n ws.connectionId = id;\n\n // Notify default namespace of new connection\n const defaultNamespace = this.namespaces.get('/');\n if (defaultNamespace) {\n connection.raw = defaultNamespace.raw;\n defaultNamespace.handleConnection(connection);\n }\n\n this.logger.debug(`WebSocket connection opened: ${id} from ${ip}`, 'Connection');\n }\n\n private handleMessage(ws: any, message: ArrayBuffer, isBinary: boolean): void {\n const connectionId = ws.connectionId;\n const connection = this.connections.get(connectionId);\n\n if (!connection) {\n this.logger.warn(`Message received for unknown connection: ${connectionId}`, 'Message');\n return;\n }\n\n if (connection.raw) {\n // Raw namespace: the uWS ArrayBuffer is only valid inside this callback,\n // so the bytes are copied out before any handler can hold on to them.\n if (isBinary) connection.handleBinary(Buffer.from(new Uint8Array(message)));\n else connection.handleRawText(textDecoder.decode(message));\n return;\n }\n\n try {\n // Parse message - expect JSON format for compatibility with socket.io-like behavior\n const messageStr = textDecoder.decode(message);\n const data = JSON.parse(messageStr);\n\n // Handle message in connection wrapper\n connection.handleMessage(data);\n } catch (error) {\n this.logger.error(\n `Failed to parse message from ${connectionId}: ${error instanceof Error ? error.message : String(error)}`,\n 'Message'\n );\n }\n }\n\n private handleClose(ws: any, code: number, message: ArrayBuffer): void {\n const connectionId = ws.connectionId;\n const connection = this.connections.get(connectionId);\n\n if (connection) {\n connection.handleClose(code, message);\n this.connections.delete(connectionId);\n this.logger.debug(`WebSocket connection closed: ${connectionId}`, 'Connection');\n }\n }\n\n private handleDrain(ws: any): void {\n // Handle backpressure drain event\n const connectionId = ws.connectionId;\n const connection = this.connections.get(connectionId);\n\n if (connection) {\n connection.handleDrain();\n }\n }\n\n private generateId(): string {\n if (this.customIdGenerator) {\n return this.customIdGenerator();\n }\n return `uws_${++this.connectionCounter}_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;\n }\n\n createNamespace(namespace: string, options?: WebSocketNamespaceOptions): WebSocketNamespace {\n if (!this.namespaces.has(namespace)) {\n const ns = new UWSNamespaceWrapper(namespace, this.connections);\n this.namespaces.set(namespace, ns);\n this.logger.debug(`Created namespace: ${namespace}`, 'Namespace');\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const ns = this.namespaces.get(namespace)!;\n if (options?.raw) ns.raw = true;\n return ns;\n }\n\n getDefaultNamespace(): WebSocketNamespace {\n return this.createNamespace('/');\n }\n\n async close(): Promise<void> {\n // Close all connections\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [id, connection] of this.connections) {\n connection.disconnect(true);\n }\n this.connections.clear();\n this.namespaces.clear();\n\n // Close the uWebSockets listen socket\n if (this.listenSocket && this.uws) {\n // Use stored module reference instead of re-importing\n this.uws.us_listen_socket_close(this.listenSocket);\n this.listenSocket = null;\n }\n\n this.logger.info('uWebSockets adapter closed', 'Close');\n }\n\n setCompression(enabled: boolean, options?: any): void {\n this.compressionEnabled = enabled;\n this.compressionOptions = options || {};\n this.logger.debug(`Compression ${enabled ? 'enabled' : 'disabled'}`, 'Compression');\n }\n\n setCustomIdGenerator(generator: () => string): void {\n this.customIdGenerator = generator;\n this.logger.debug('Custom ID generator set', 'Config');\n }\n\n getAdapterName(): string {\n return 'uWebSockets.js';\n }\n\n getConnectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Get the underlying uWebSockets app for advanced usage\n */\n getApp(): any {\n return this.app;\n }\n}\n\n/**\n * Namespace wrapper for uWebSockets\n */\nclass UWSNamespaceWrapper implements WebSocketNamespace {\n /** Raw framing for connections routed here (see WebSocketNamespaceOptions) */\n raw = false;\n private connectionHandlers: ((socket: WebSocketConnection) => void)[] = [];\n private middlewares: WebSocketMiddleware[] = [];\n\n constructor(\n private namespace: string,\n private connections: Map<string, UWSConnectionWrapper>\n ) {}\n\n on(event: 'connection', handler: (socket: WebSocketConnection) => void): void {\n if (event === 'connection') {\n this.connectionHandlers.push(handler);\n }\n }\n\n handleConnection(connection: UWSConnectionWrapper): void {\n // Run middlewares\n this.runMiddlewares(connection, err => {\n if (err) {\n connection.disconnect(true);\n return;\n }\n\n // Notify all connection handlers\n for (const handler of this.connectionHandlers) {\n handler(connection);\n }\n });\n }\n\n private runMiddlewares(\n connection: UWSConnectionWrapper,\n finalCallback: (err?: Error) => void\n ): void {\n let index = 0;\n\n const next = (err?: Error) => {\n if (err) {\n finalCallback(err);\n return;\n }\n\n if (index >= this.middlewares.length) {\n finalCallback();\n return;\n }\n\n const middleware = this.middlewares[index++];\n middleware?.(connection, next);\n };\n\n next();\n }\n\n emit(event: string, data: any): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [id, connection] of this.connections) {\n if (connection.connected) {\n connection.emit(event, data);\n }\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n return new UWSEmitterWrapper(this.connections, { rooms: Array.isArray(room) ? room : [room] });\n }\n\n except(room: string | string[]): WebSocketEmitter {\n return new UWSEmitterWrapper(this.connections, {\n exceptRooms: Array.isArray(room) ? room : [room],\n });\n }\n\n getSockets(): WebSocketConnection[] {\n const result: WebSocketConnection[] = [];\n for (const conn of this.connections.values()) {\n if (conn.connected) result.push(conn);\n }\n return result;\n }\n\n getConnectionCount(): number {\n let count = 0;\n for (const conn of this.connections.values()) {\n if (conn.connected) count++;\n }\n return count;\n }\n\n use(middleware: WebSocketMiddleware): void {\n this.middlewares.push(middleware);\n }\n}\n\n/**\n * Connection wrapper for uWebSockets\n */\nclass UWSConnectionWrapper implements WebSocketConnection {\n public data: Record<string, any> = {};\n public connected = true;\n /** Raw framing (set from the namespace at connection) */\n public raw = false;\n private rooms = new Set<string>();\n private eventHandlers = new Map<\n string,\n Array<(data: any, callback?: (response?: any) => void) => void>\n >();\n private anyHandlers: Array<(event: string, ...args: any[]) => void> = [];\n private logger = createFrameworkLogger('UWS_CONNECTION');\n\n constructor(\n private ws: any,\n public readonly id: string,\n public readonly ip: string,\n private namespaces: Map<string, UWSNamespaceWrapper>\n ) {\n this.headers = this.parseHeaders();\n }\n\n public readonly headers: Record<string, string>;\n\n private parseHeaders(): Record<string, string> {\n // uWebSockets doesn't provide easy header access\n // We'll return empty headers for now, but this could be enhanced\n return {};\n }\n\n on(event: string, handler: (data: any, callback?: (response?: any) => void) => void): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.eventHandlers.get(event)!.push(handler);\n }\n\n onAny(handler: (event: string, ...args: any[]) => void): void {\n this.anyHandlers.push(handler);\n }\n\n emit(event: string, data: any): void {\n if (!this.connected) return;\n\n try {\n const message = JSON.stringify({ event, data });\n const buffer = Buffer.from(message);\n\n // Send message with backpressure handling\n const sent = this.ws.send(buffer, false); // false = not binary\n\n if (!sent) {\n this.logger.warn(`Backpressure detected for connection ${this.id}`, 'Backpressure');\n }\n } catch (error) {\n this.logger.error(\n `Failed to emit event ${event}: ${error instanceof Error ? error.message : String(error)}`,\n 'Emit'\n );\n }\n }\n\n compressedEmit(event: string, data: any): void {\n // uWebSockets.js handles compression automatically based on app configuration\n // So this is the same as regular emit\n this.emit(event, data);\n }\n\n send(data: string | Buffer | ArrayBuffer | Uint8Array, isBinary?: boolean): void {\n if (!this.connected) return;\n try {\n const sent = this.ws.send(data, isBinary ?? typeof data !== 'string');\n if (!sent)\n this.logger.warn(`Backpressure detected for connection ${this.id}`, 'Backpressure');\n } catch (error) {\n this.logger.error(\n `Failed to send frame: ${error instanceof Error ? error.message : String(error)}`,\n 'Send'\n );\n }\n }\n\n /** Raw namespace: a text frame reaches the 'message' handlers verbatim */\n handleRawText(text: string): void {\n if (!this.connected) return;\n for (const handler of this.anyHandlers) handler('message', text);\n const handlers = this.eventHandlers.get('message');\n if (handlers) for (const handler of handlers) handler(text);\n }\n\n /** A binary frame reaches the 'binary' handlers as a Buffer */\n handleBinary(data: Buffer): void {\n if (!this.connected) return;\n for (const handler of this.anyHandlers) handler('binary', data);\n const handlers = this.eventHandlers.get('binary');\n if (handlers) for (const handler of handlers) handler(data);\n }\n\n handleMessage(data: any): void {\n if (!data || typeof data !== 'object') {\n this.logger.warn(`Invalid message format from ${this.id}`, 'Message');\n return;\n }\n\n const { event, data: eventData, callback: hasCallback } = data;\n\n if (!event) {\n this.logger.warn(`Message without event from ${this.id}`, 'Message');\n return;\n }\n\n // Create callback function if client expects response\n const callback = hasCallback\n ? (response?: any) => {\n this.emit(`${event}:response`, response);\n }\n : undefined;\n\n // Notify any handlers\n for (const handler of this.anyHandlers) {\n handler(event, eventData);\n }\n\n // Notify specific event handlers\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(eventData, callback);\n } catch (error) {\n this.logger.error(\n `Error in event handler for ${event}: ${error instanceof Error ? error.message : String(error)}`,\n 'Handler'\n );\n }\n }\n }\n }\n\n handleClose(code: number, _message: ArrayBuffer): void {\n this.connected = false;\n this.logger.debug(`Connection ${this.id} closed with code ${code}`, 'Close');\n }\n\n handleDrain(): void {\n // Backpressure has been relieved\n this.logger.debug(`Connection ${this.id} drained`, 'Drain');\n }\n\n join(room: string | string[]): void {\n const roomsToJoin = Array.isArray(room) ? room : [room];\n for (const r of roomsToJoin) {\n this.rooms.add(r);\n this.logger.debug(`Connection ${this.id} joined room ${r}`, 'Room');\n }\n }\n\n leave(room: string | string[]): void {\n const roomsToLeave = Array.isArray(room) ? room : [room];\n for (const r of roomsToLeave) {\n this.rooms.delete(r);\n this.logger.debug(`Connection ${this.id} left room ${r}`, 'Room');\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n return new UWSEmitterWrapper(new Map([[this.id, this]]), {\n rooms: Array.isArray(room) ? room : [room],\n });\n }\n\n get broadcast(): WebSocketEmitter {\n const filtered = new Map<string, UWSConnectionWrapper>();\n const namespace = this.namespaces.get('/');\n if (namespace) {\n for (const conn of (namespace as any).connections.values()) {\n if (conn.connected && conn.id !== this.id) {\n filtered.set(conn.id, conn as UWSConnectionWrapper);\n }\n }\n }\n return new UWSEmitterWrapper(filtered, {});\n }\n\n getRooms(): Set<string> {\n return new Set(this.rooms);\n }\n\n disconnect(close = false): void {\n if (!this.connected) return;\n\n this.connected = false;\n\n if (close && this.ws) {\n try {\n this.ws.end(1000, 'Normal closure');\n } catch (error) {\n this.logger.error(\n `Error closing WebSocket: ${error instanceof Error ? error.message : String(error)}`,\n 'Disconnect'\n );\n }\n }\n }\n}\n\n/**\n * Emitter wrapper for room-based broadcasting\n */\nclass UWSEmitterWrapper implements WebSocketEmitter {\n private targetRooms: string[] = [];\n private excludedRooms: string[] = [];\n private useCompression = false;\n\n constructor(\n private connections: Map<string, UWSConnectionWrapper>,\n private options: { rooms?: string[]; exceptRooms?: string[] } = {}\n ) {\n this.targetRooms = options.rooms || [];\n this.excludedRooms = options.exceptRooms || [];\n }\n\n emit(event: string, data: any): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [id, connection] of this.connections) {\n if (!connection.connected) continue;\n\n // Check room filtering\n const connectionRooms = connection.getRooms();\n\n // If target rooms specified, connection must be in at least one\n if (this.targetRooms.length > 0) {\n let inTargetRoom = false;\n const targetLen = this.targetRooms.length;\n for (let i = 0; i < targetLen; i++) {\n if (connectionRooms.has(this.targetRooms[i] as string)) {\n inTargetRoom = true;\n break;\n }\n }\n if (!inTargetRoom) continue;\n }\n\n // If excluded rooms specified, connection must not be in any\n if (this.excludedRooms.length > 0) {\n let inExcludedRoom = false;\n const excludeLen = this.excludedRooms.length;\n for (let i = 0; i < excludeLen; i++) {\n if (connectionRooms.has(this.excludedRooms[i] as string)) {\n inExcludedRoom = true;\n break;\n }\n }\n if (inExcludedRoom) continue;\n }\n\n // Emit to connection\n if (this.useCompression && connection.compressedEmit) {\n connection.compressedEmit(event, data);\n } else {\n connection.emit(event, data);\n }\n }\n }\n\n to(room: string | string[]): WebSocketEmitter {\n // Avoid unnecessary array wrapping and spreading\n let newTargetRooms: string[];\n if (Array.isArray(room)) {\n if (this.targetRooms.length === 0) {\n newTargetRooms = room;\n } else {\n newTargetRooms = this.targetRooms.concat(room);\n }\n } else {\n if (this.targetRooms.length === 0) {\n newTargetRooms = [room];\n } else {\n newTargetRooms = [...this.targetRooms, room];\n }\n }\n return new UWSEmitterWrapper(this.connections, {\n rooms: newTargetRooms,\n exceptRooms: this.excludedRooms,\n });\n }\n\n except(room: string | string[]): WebSocketEmitter {\n // Avoid unnecessary array wrapping and spreading\n let newExcludedRooms: string[];\n if (Array.isArray(room)) {\n if (this.excludedRooms.length === 0) {\n newExcludedRooms = room;\n } else {\n newExcludedRooms = this.excludedRooms.concat(room);\n }\n } else {\n if (this.excludedRooms.length === 0) {\n newExcludedRooms = [room];\n } else {\n newExcludedRooms = [...this.excludedRooms, room];\n }\n }\n return new UWSEmitterWrapper(this.connections, {\n rooms: this.targetRooms,\n exceptRooms: newExcludedRooms,\n });\n }\n\n compress(compress: boolean): WebSocketEmitter {\n this.useCompression = compress;\n return this;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace, WebSocketConnection, WebSocketEmitter } from '../websocket-adapter.js';
1
+ import { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace, WebSocketNamespaceOptions, WebSocketConnection, WebSocketEmitter } from '../websocket-adapter.js';
2
2
  /**
3
3
  * Native WebSocket adapter using the 'ws' library
4
4
  * Provides a lightweight, standards-compliant WebSocket implementation
@@ -11,6 +11,10 @@ export declare class WSAdapter implements WebSocketAdapter {
11
11
  private customIdGenerator?;
12
12
  private connectionCounter;
13
13
  private heartbeatTimer?;
14
+ /** Upgrade path prefix (options.path, default '/ws'): namespaces live below it */
15
+ private basePath;
16
+ private httpServer;
17
+ private upgradeHandler;
14
18
  initialize(httpServer: any, options?: WebSocketAdapterOptions): Promise<void>;
15
19
  /**
16
20
  * Build a `ws` verifyClient callback enforcing the configured CORS origin
@@ -27,7 +31,7 @@ export declare class WSAdapter implements WebSocketAdapter {
27
31
  */
28
32
  private buildVerifyClient;
29
33
  private handleConnection;
30
- createNamespace(namespace: string): WebSocketNamespace;
34
+ createNamespace(namespace: string, options?: WebSocketNamespaceOptions): WebSocketNamespace;
31
35
  getDefaultNamespace(): WebSocketNamespace;
32
36
  close(): Promise<void>;
33
37
  setCompression(enabled: boolean, _options?: any): void;
@@ -47,6 +51,8 @@ declare class WSConnectionWrapper implements WebSocketConnection {
47
51
  readonly ws: any;
48
52
  private request;
49
53
  data: Record<string, any>;
54
+ /** Raw framing (set from the namespace at connection) */
55
+ raw: boolean;
50
56
  private eventHandlers;
51
57
  private anyHandlers;
52
58
  private rooms;
@@ -65,6 +71,7 @@ declare class WSConnectionWrapper implements WebSocketConnection {
65
71
  to(room: string | string[]): WebSocketEmitter;
66
72
  getRooms(): Set<string>;
67
73
  disconnect(close?: boolean): void;
74
+ send(data: string | Buffer | ArrayBuffer | Uint8Array, isBinary?: boolean): void;
68
75
  private handleMessage;
69
76
  }
70
77
  export {};