@voltrix/websocket 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Randy stiven Valentin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @voltrix/websocket
2
+
3
+ High-performance, programmatic-first and decorator-driven WebSocket package with pluggable adapters and distributed pub/sub for Voltrix.
4
+
5
+ ## Features
6
+ - **Programmatic-First**: Full programmatic instanciation and routing support without decorators.
7
+ - **Ultra High-Performance**: Optimized for zero-allocation hot paths running directly on uWebSockets.js.
8
+ - **Pre-Upgrade Handshake validation**: Validate tokens and deny connection in HTTP Upgrade phase (zero TCP ws handle leakage).
9
+ - **Pluggable Pub/Sub Engine**: Local C++ uWS pub/sub or clustered Redis Pub/Sub out-of-the-box.
10
+ - **Decorator Gateways**: Optional elegant controllers mimicking high-level clean architectures.
@@ -0,0 +1 @@
1
+ export * from './uws-adapter.js';
@@ -0,0 +1,2 @@
1
+ export * from './uws-adapter.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,87 @@
1
+ import type { IRequest, IResponse } from '@voltrix/core';
2
+ import type { IWebSocketAdapter, WsSocket, WsMessageHandler } from '../types/index.js';
3
+ /**
4
+ * 📦 Options for configuring the uWebSockets.js Adapter
5
+ */
6
+ export interface UwsAdapterOptions {
7
+ app?: any;
8
+ path?: string;
9
+ maxPayloadLength?: number;
10
+ idleTimeout?: number;
11
+ compression?: number;
12
+ maxBackpressure?: number;
13
+ onUpgrade?: (req: IRequest, res: IResponse) => any | Promise<any>;
14
+ }
15
+ /**
16
+ * 📨 Heap-allocated request clone to bypass uWebSockets.js stack-allocation lifetime limitations.
17
+ */
18
+ export declare class HeapRequest implements IRequest {
19
+ private readonly _headers;
20
+ readonly query: Record<string, any>;
21
+ readonly cookies: Record<string, string>;
22
+ readonly url: string;
23
+ readonly method: string;
24
+ readonly ip: string;
25
+ readonly params: Record<string, string>;
26
+ readonly context: Record<string, any>;
27
+ user?: any;
28
+ constructor(req: any, ip: string);
29
+ header(name: string): string | undefined;
30
+ headers(): Record<string, string>;
31
+ getParam(name: string): string | undefined;
32
+ getQuery(name: string): any;
33
+ buffer(): Promise<Uint8Array>;
34
+ body(): Promise<string>;
35
+ json<T = any>(): Promise<T>;
36
+ onData(handler: (chunk: Uint8Array, isLast: boolean) => void): void;
37
+ }
38
+ /**
39
+ * 🔒 Minimal HTTP Response wrapper for validation failures during Handshake/Upgrade phase
40
+ */
41
+ export declare class UpgradeResponse implements IResponse {
42
+ private _status;
43
+ private _headers;
44
+ readonly raw: any;
45
+ headersSent: boolean;
46
+ isAborted: boolean;
47
+ locals: Record<string, any>;
48
+ constructor(res: any);
49
+ setHeader(name: string, value: string): IResponse;
50
+ json(data: any): void;
51
+ send(data: string): void;
52
+ status(code: number): IResponse;
53
+ type(contentType: string): IResponse;
54
+ end(data?: string | Uint8Array): void;
55
+ }
56
+ /**
57
+ * 🔌 Engine Socket wrapper mapping directly onto C++ uWebSockets.js instance.
58
+ */
59
+ export declare class UwsSocket<TUser = any> implements WsSocket<TUser, any> {
60
+ private readonly ws;
61
+ readonly raw: any;
62
+ readonly id: string;
63
+ user?: TUser;
64
+ constructor(ws: any, raw: any);
65
+ send(message: string | ArrayBufferView | ArrayBuffer, isBinary?: boolean): void;
66
+ subscribe(topic: string): void;
67
+ unsubscribe(topic: string): void;
68
+ publish(topic: string, message: string | ArrayBufferView | ArrayBuffer, isBinary?: boolean): void;
69
+ close(code?: number, reason?: string): void;
70
+ }
71
+ /**
72
+ * 🚀 High-performance uWebSockets.js Adapter.
73
+ */
74
+ export declare class UwsWebSocketAdapter implements IWebSocketAdapter<any, UwsSocket, UwsAdapterOptions> {
75
+ private serverApp;
76
+ private isStandalone;
77
+ private readonly socketMap;
78
+ private onConnectCallback?;
79
+ private onDisconnectCallback?;
80
+ private readonly globalHandlers;
81
+ create(port: number, options?: UwsAdapterOptions): any;
82
+ bindClientConnect(server: any, callback: (client: UwsSocket) => void | Promise<void>): void;
83
+ bindClientDisconnect(client: UwsSocket, callback: (client: UwsSocket, code: number, reason: ArrayBuffer) => void | Promise<void>): void;
84
+ bindMessageHandlers(client: UwsSocket, handlers: WsMessageHandler<UwsSocket>[]): void;
85
+ getOrCreateSocket(rawWs: any): UwsSocket;
86
+ close(): void | Promise<void>;
87
+ }
@@ -0,0 +1,295 @@
1
+ /**
2
+ * 📨 Heap-allocated request clone to bypass uWebSockets.js stack-allocation lifetime limitations.
3
+ */
4
+ export class HeapRequest {
5
+ _headers = {};
6
+ query = {};
7
+ cookies = {};
8
+ url;
9
+ method;
10
+ ip;
11
+ params = {};
12
+ context = {};
13
+ user;
14
+ constructor(req, ip) {
15
+ this.url = req.getUrl();
16
+ this.method = req.getMethod().toUpperCase();
17
+ this.ip = ip;
18
+ // Synchronously copy all headers
19
+ req.forEach((key, val) => {
20
+ this._headers[key.toLowerCase()] = val;
21
+ });
22
+ // Synchronously parse query string
23
+ const queryStr = req.getQuery();
24
+ if (queryStr) {
25
+ const searchParams = new URLSearchParams(queryStr);
26
+ for (const [key, val] of searchParams.entries()) {
27
+ this.query[key] = val;
28
+ }
29
+ }
30
+ // Synchronously parse cookies
31
+ const cookieHeader = this._headers['cookie'];
32
+ if (cookieHeader) {
33
+ cookieHeader.split(';').forEach((cookie) => {
34
+ const parts = cookie.split('=');
35
+ const k = parts[0]?.trim();
36
+ const v = parts.slice(1).join('=').trim();
37
+ if (k)
38
+ this.cookies[k] = v;
39
+ });
40
+ }
41
+ }
42
+ header(name) {
43
+ return this._headers[name.toLowerCase()];
44
+ }
45
+ headers() {
46
+ return this._headers;
47
+ }
48
+ getParam(name) {
49
+ return this.params[name];
50
+ }
51
+ getQuery(name) {
52
+ return this.query[name];
53
+ }
54
+ buffer() {
55
+ return Promise.resolve(new Uint8Array(0));
56
+ }
57
+ body() {
58
+ return Promise.resolve('');
59
+ }
60
+ json() {
61
+ return Promise.resolve({});
62
+ }
63
+ onData(handler) {
64
+ // No-op for upgrade requests
65
+ }
66
+ }
67
+ /**
68
+ * 🔒 Minimal HTTP Response wrapper for validation failures during Handshake/Upgrade phase
69
+ */
70
+ export class UpgradeResponse {
71
+ _status = '200 OK';
72
+ _headers = {};
73
+ raw;
74
+ headersSent = false;
75
+ isAborted = false;
76
+ locals = {};
77
+ constructor(res) {
78
+ this.raw = res;
79
+ res.onAborted(() => {
80
+ this.isAborted = true;
81
+ });
82
+ }
83
+ setHeader(name, value) {
84
+ this._headers[name] = value;
85
+ return this;
86
+ }
87
+ json(data) {
88
+ this.setHeader('Content-Type', 'application/json');
89
+ this.send(JSON.stringify(data));
90
+ }
91
+ send(data) {
92
+ if (this.isAborted)
93
+ return;
94
+ this.headersSent = true;
95
+ this.raw.cork(() => {
96
+ this.raw.writeStatus(this._status);
97
+ Object.entries(this._headers).forEach(([k, v]) => {
98
+ this.raw.writeHeader(k, v);
99
+ });
100
+ this.raw.end(data);
101
+ });
102
+ }
103
+ status(code) {
104
+ switch (code) {
105
+ case 400:
106
+ this._status = '400 Bad Request';
107
+ break;
108
+ case 401:
109
+ this._status = '401 Unauthorized';
110
+ break;
111
+ case 403:
112
+ this._status = '403 Forbidden';
113
+ break;
114
+ case 429:
115
+ this._status = '429 Too Many Requests';
116
+ break;
117
+ case 500:
118
+ this._status = '500 Internal Server Error';
119
+ break;
120
+ default: this._status = `${code} Custom`;
121
+ }
122
+ return this;
123
+ }
124
+ type(contentType) {
125
+ this.setHeader('Content-Type', contentType);
126
+ return this;
127
+ }
128
+ end(data) {
129
+ if (this.isAborted)
130
+ return;
131
+ this.headersSent = true;
132
+ this.raw.cork(() => {
133
+ this.raw.writeStatus(this._status);
134
+ Object.entries(this._headers).forEach(([k, v]) => {
135
+ this.raw.writeHeader(k, v);
136
+ });
137
+ this.raw.end(data || '');
138
+ });
139
+ }
140
+ }
141
+ /**
142
+ * 🔌 Engine Socket wrapper mapping directly onto C++ uWebSockets.js instance.
143
+ */
144
+ export class UwsSocket {
145
+ ws;
146
+ raw;
147
+ id;
148
+ user;
149
+ constructor(ws, raw) {
150
+ this.ws = ws;
151
+ this.raw = raw;
152
+ this.id = Math.random().toString(36).slice(2) + Date.now().toString(36);
153
+ const data = ws.getUserData();
154
+ if (data && data.user) {
155
+ this.user = data.user;
156
+ }
157
+ }
158
+ send(message, isBinary) {
159
+ this.ws.send(message, isBinary);
160
+ }
161
+ subscribe(topic) {
162
+ this.ws.subscribe(topic);
163
+ }
164
+ unsubscribe(topic) {
165
+ this.ws.unsubscribe(topic);
166
+ }
167
+ publish(topic, message, isBinary) {
168
+ this.ws.publish(topic, message, isBinary);
169
+ }
170
+ close(code, reason) {
171
+ this.ws.end(code, reason);
172
+ }
173
+ }
174
+ /**
175
+ * 🚀 High-performance uWebSockets.js Adapter.
176
+ */
177
+ export class UwsWebSocketAdapter {
178
+ serverApp = null;
179
+ isStandalone = false;
180
+ socketMap = new WeakMap();
181
+ onConnectCallback;
182
+ onDisconnectCallback;
183
+ globalHandlers = new Map();
184
+ create(port, options = {}) {
185
+ const uWSModule = require('uWebSockets.js');
186
+ this.serverApp = options.app || uWSModule.App({});
187
+ this.isStandalone = !options.app;
188
+ const path = options.path || '/ws';
189
+ const maxPayloadLength = options.maxPayloadLength ?? 16 * 1024 * 1024;
190
+ const idleTimeout = options.idleTimeout ?? 120;
191
+ const compression = options.compression ?? 0;
192
+ const maxBackpressure = options.maxBackpressure ?? 1024 * 1024;
193
+ this.serverApp.ws(path, {
194
+ compression,
195
+ maxPayloadLength,
196
+ idleTimeout,
197
+ maxBackpressure,
198
+ upgrade: async (res, req, context) => {
199
+ let aborted = false;
200
+ res.onAborted(() => {
201
+ aborted = true;
202
+ });
203
+ const remoteIp = Buffer.from(res.getRemoteAddressAsText()).toString();
204
+ const heapReq = new HeapRequest(req, remoteIp);
205
+ const uwsKey = req.getHeader('sec-websocket-key');
206
+ const uwsProtocol = req.getHeader('sec-websocket-protocol');
207
+ const uwsExtensions = req.getHeader('sec-websocket-extensions');
208
+ try {
209
+ let userContext = null;
210
+ if (options.onUpgrade) {
211
+ const wrapRes = new UpgradeResponse(res);
212
+ userContext = await options.onUpgrade(heapReq, wrapRes);
213
+ if (wrapRes.isAborted || aborted)
214
+ return;
215
+ if (userContext === false) {
216
+ wrapRes.status(401).json({ error: 'Unauthorized', message: 'Handshake validation failed' });
217
+ return;
218
+ }
219
+ }
220
+ if (!aborted) {
221
+ res.upgrade({ user: userContext || heapReq.user }, uwsKey, uwsProtocol, uwsExtensions, context);
222
+ }
223
+ }
224
+ catch (err) {
225
+ if (!aborted) {
226
+ const wrapRes = new UpgradeResponse(res);
227
+ wrapRes.status(500).json({ error: 'Internal Server Error', message: err.message });
228
+ }
229
+ }
230
+ },
231
+ open: (ws) => {
232
+ const socket = this.getOrCreateSocket(ws);
233
+ if (this.onConnectCallback) {
234
+ this.onConnectCallback(socket);
235
+ }
236
+ },
237
+ message: (ws, message, isBinary) => {
238
+ const socket = this.getOrCreateSocket(ws);
239
+ const payloadStr = Buffer.from(message).toString('utf8');
240
+ try {
241
+ const packet = JSON.parse(payloadStr);
242
+ if (packet && typeof packet === 'object' && packet.event) {
243
+ const handler = this.globalHandlers.get(packet.event);
244
+ if (handler) {
245
+ handler(socket, packet.data);
246
+ }
247
+ }
248
+ }
249
+ catch (err) {
250
+ // Stable under spam
251
+ }
252
+ },
253
+ close: (ws, code, message) => {
254
+ const socket = this.getOrCreateSocket(ws);
255
+ if (this.onDisconnectCallback) {
256
+ this.onDisconnectCallback(socket, code, message);
257
+ }
258
+ this.socketMap.delete(ws);
259
+ }
260
+ });
261
+ if (this.isStandalone) {
262
+ this.serverApp.listen(port, (token) => {
263
+ if (!token) {
264
+ throw new Error(`Failed to start standalone uWS WebSocket Server on port ${port}`);
265
+ }
266
+ });
267
+ }
268
+ return this.serverApp;
269
+ }
270
+ bindClientConnect(server, callback) {
271
+ this.onConnectCallback = callback;
272
+ }
273
+ bindClientDisconnect(client, callback) {
274
+ this.onDisconnectCallback = callback;
275
+ }
276
+ bindMessageHandlers(client, handlers) {
277
+ handlers.forEach((h) => {
278
+ this.globalHandlers.set(h.event, h.handler);
279
+ });
280
+ }
281
+ getOrCreateSocket(rawWs) {
282
+ let socket = this.socketMap.get(rawWs);
283
+ if (!socket) {
284
+ socket = new UwsSocket(rawWs, rawWs);
285
+ this.socketMap.set(rawWs, socket);
286
+ }
287
+ return socket;
288
+ }
289
+ close() {
290
+ if (this.isStandalone && this.serverApp) {
291
+ // Standalone server cleanup
292
+ }
293
+ }
294
+ }
295
+ //# sourceMappingURL=uws-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uws-adapter.js","sourceRoot":"","sources":["../../src/adapters/uws-adapter.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,QAAQ,GAA2B,EAAE,CAAC;IAC9C,KAAK,GAAwB,EAAE,CAAC;IAChC,OAAO,GAA2B,EAAE,CAAC;IACrC,GAAG,CAAS;IACZ,MAAM,CAAS;IACf,EAAE,CAAS;IACX,MAAM,GAA2B,EAAE,CAAC;IACpC,OAAO,GAAwB,EAAE,CAAC;IAC3C,IAAI,CAAO;IAEX,YAAY,GAAQ,EAAE,EAAU;QAC9B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,iCAAiC;QACjC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACxB,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM;QACJ,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI;QACF,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,OAAO,CAAC,OAAO,CAAC,EAAO,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,OAAqD;QAC1D,6BAA6B;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,QAAQ,CAAC;IACnB,QAAQ,GAA2B,EAAE,CAAC;IACrC,GAAG,CAAM;IAClB,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,GAAwB,EAAE,CAAC;IAEjC,YAAY,GAAQ;QAClB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,KAAa;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAS;QACZ,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC/C,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;gBAAC,MAAM;YAClD,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC;gBAAC,MAAM;YACnD,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC;gBAAC,MAAM;YAChD,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC;gBAAC,MAAM;YACxD,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,GAAG,2BAA2B,CAAC;gBAAC,MAAM;YAC5D,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,SAAS,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,WAAmB;QACtB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAA0B;QAC5B,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC/C,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IAKD;IACR;IALF,EAAE,CAAS;IACpB,IAAI,CAAS;IAEb,YACmB,EAAO,EACf,GAAQ;QADA,OAAE,GAAF,EAAE,CAAK;QACf,QAAG,GAAH,GAAG,CAAK;QAEjB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAA+C,EAAE,QAAkB;QACtE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,OAA+C,EAAE,QAAkB;QACxF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAa,EAAE,MAAe;QAClC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACtB,SAAS,GAAQ,IAAI,CAAC;IACtB,YAAY,GAAG,KAAK,CAAC;IACZ,SAAS,GAAG,IAAI,OAAO,EAAkB,CAAC;IAEnD,iBAAiB,CAA+C;IAChE,oBAAoB,CAAkF;IAC7F,cAAc,GAAG,IAAI,GAAG,EAAkE,CAAC;IAE5G,MAAM,CAAC,IAAY,EAAE,UAA6B,EAAE;QAClD,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;QAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;QACnC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;QACtE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QAC7C,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,GAAG,IAAI,CAAC;QAE/D,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;YACtB,WAAW;YACX,gBAAgB;YAChB,WAAW;YACX,eAAe;YAEf,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,OAAY,EAAE,EAAE;gBAClD,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACtE,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;gBAClD,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;gBAC5D,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;gBAEhE,IAAI,CAAC;oBACH,IAAI,WAAW,GAAQ,IAAI,CAAC;oBAE5B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;wBACtB,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;wBACzC,WAAW,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAExD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO;4BAAE,OAAO;wBAEzC,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;4BAC1B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;4BAC5F,OAAO;wBACT,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,GAAG,CAAC,OAAO,CACT,EAAE,IAAI,EAAE,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,EACrC,MAAM,EACN,WAAW,EACX,aAAa,EACb,OAAO,CACR,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;wBACzC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,EAAE,CAAC,EAAO,EAAE,EAAE;gBAChB,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC3B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAED,OAAO,EAAE,CAAC,EAAO,EAAE,OAAoB,EAAE,QAAiB,EAAE,EAAE;gBAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAEzD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACtC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACzD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBACtD,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;wBAC/B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,oBAAoB;gBACtB,CAAC;YACH,CAAC;YAED,KAAK,EAAE,CAAC,EAAO,EAAE,IAAY,EAAE,OAAoB,EAAE,EAAE;gBACrD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9B,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAU,EAAE,EAAE;gBACzC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,2DAA2D,IAAI,EAAE,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,iBAAiB,CAAC,MAAW,EAAE,QAAqD;QAClF,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,oBAAoB,CAAC,MAAiB,EAAE,QAAwF;QAC9H,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IACvC,CAAC;IAED,mBAAmB,CAAC,MAAiB,EAAE,QAAuC;QAC5E,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,KAAU;QAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,4BAA4B;QAC9B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 🏷️ Global Symbols and Keys for WebSocket metadata storage
3
+ */
4
+ export declare const WS_KEYS: {
5
+ readonly GATEWAY: "voltrix:ws:gateway";
6
+ readonly EVENTS: "voltrix:ws:events";
7
+ readonly PARAMS: "voltrix:ws:params";
8
+ readonly ON_CONNECT: "voltrix:ws:on_connect";
9
+ readonly ON_DISCONNECT: "voltrix:ws:on_disconnect";
10
+ };
11
+ /**
12
+ * 🚀 WebSocketGateway Decorator.
13
+ * Declares a class as an injectable WebSocket Gateway.
14
+ */
15
+ export declare function WebSocketGateway(options?: {
16
+ path?: string;
17
+ guard?: any;
18
+ }): ClassDecorator;
19
+ /**
20
+ * 📡 SubscribeMessage Decorator.
21
+ * Binds a gateway method to intercept incoming client messages matching the specified event.
22
+ */
23
+ export declare function SubscribeMessage(event: string): MethodDecorator;
24
+ /**
25
+ * 🔌 OnConnect Decorator.
26
+ * Binds a gateway method to connection established events.
27
+ */
28
+ export declare function OnConnect(): MethodDecorator;
29
+ /**
30
+ * 🔌 OnDisconnect Decorator.
31
+ * Binds a gateway method to connection closed events.
32
+ */
33
+ export declare function OnDisconnect(): MethodDecorator;
34
+ /**
35
+ * 🎛️ ConnectedSocket Parameter Decorator.
36
+ * Injects the normalized WsSocket wrapper into the decorated parameter.
37
+ */
38
+ export declare function ConnectedSocket(): ParameterDecorator;
39
+ /**
40
+ * 📦 MessageBody Parameter Decorator.
41
+ * Injects the parsed packet data payload into the decorated parameter.
42
+ */
43
+ export declare function MessageBody(): ParameterDecorator;
@@ -0,0 +1,90 @@
1
+ import { Metadata } from '@voltrix/core';
2
+ import { Injectable } from '@voltrix/injector';
3
+ /**
4
+ * 🏷️ Global Symbols and Keys for WebSocket metadata storage
5
+ */
6
+ export const WS_KEYS = {
7
+ GATEWAY: 'voltrix:ws:gateway',
8
+ EVENTS: 'voltrix:ws:events',
9
+ PARAMS: 'voltrix:ws:params',
10
+ ON_CONNECT: 'voltrix:ws:on_connect',
11
+ ON_DISCONNECT: 'voltrix:ws:on_disconnect'
12
+ };
13
+ /**
14
+ * 🚀 WebSocketGateway Decorator.
15
+ * Declares a class as an injectable WebSocket Gateway.
16
+ */
17
+ export function WebSocketGateway(options = {}) {
18
+ return (target) => {
19
+ const meta = Metadata.get(target);
20
+ meta[WS_KEYS.GATEWAY] = options;
21
+ // Programmatically apply the DI @Injectable() decorator to register within the DI Container
22
+ Injectable()(target);
23
+ };
24
+ }
25
+ /**
26
+ * 📡 SubscribeMessage Decorator.
27
+ * Binds a gateway method to intercept incoming client messages matching the specified event.
28
+ */
29
+ export function SubscribeMessage(event) {
30
+ return (target, propertyKey) => {
31
+ const ctor = target.constructor;
32
+ const meta = Metadata.get(ctor);
33
+ const events = meta[WS_KEYS.EVENTS] || [];
34
+ events.push({ event, propertyKey });
35
+ meta[WS_KEYS.EVENTS] = events;
36
+ };
37
+ }
38
+ /**
39
+ * 🔌 OnConnect Decorator.
40
+ * Binds a gateway method to connection established events.
41
+ */
42
+ export function OnConnect() {
43
+ return (target, propertyKey) => {
44
+ const ctor = target.constructor;
45
+ const meta = Metadata.get(ctor);
46
+ meta[WS_KEYS.ON_CONNECT] = propertyKey;
47
+ };
48
+ }
49
+ /**
50
+ * 🔌 OnDisconnect Decorator.
51
+ * Binds a gateway method to connection closed events.
52
+ */
53
+ export function OnDisconnect() {
54
+ return (target, propertyKey) => {
55
+ const ctor = target.constructor;
56
+ const meta = Metadata.get(ctor);
57
+ meta[WS_KEYS.ON_DISCONNECT] = propertyKey;
58
+ };
59
+ }
60
+ /**
61
+ * 🎛️ ConnectedSocket Parameter Decorator.
62
+ * Injects the normalized WsSocket wrapper into the decorated parameter.
63
+ */
64
+ export function ConnectedSocket() {
65
+ return (target, propertyKey, parameterIndex) => {
66
+ if (!propertyKey)
67
+ return;
68
+ const ctor = target.constructor;
69
+ const meta = Metadata.get(ctor, propertyKey);
70
+ const params = meta[WS_KEYS.PARAMS] || [];
71
+ params.push({ index: parameterIndex, type: 'socket' });
72
+ meta[WS_KEYS.PARAMS] = params;
73
+ };
74
+ }
75
+ /**
76
+ * 📦 MessageBody Parameter Decorator.
77
+ * Injects the parsed packet data payload into the decorated parameter.
78
+ */
79
+ export function MessageBody() {
80
+ return (target, propertyKey, parameterIndex) => {
81
+ if (!propertyKey)
82
+ return;
83
+ const ctor = target.constructor;
84
+ const meta = Metadata.get(ctor, propertyKey);
85
+ const params = meta[WS_KEYS.PARAMS] || [];
86
+ params.push({ index: parameterIndex, type: 'body' });
87
+ meta[WS_KEYS.PARAMS] = params;
88
+ };
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './types/index.js';
2
+ export * from './adapters/index.js';
3
+ export * from './pubsub/index.js';
4
+ export * from './pipeline/index.js';
5
+ export * from './decorators/index.js';
6
+ export * from './processors/websocket.processor.js';
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // 🔌 Unified Entry Point for @voltrix/websocket
2
+ export * from './types/index.js';
3
+ export * from './adapters/index.js';
4
+ export * from './pubsub/index.js';
5
+ export * from './pipeline/index.js';
6
+ export * from './decorators/index.js';
7
+ export * from './processors/websocket.processor.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qCAAqC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { WsSocket, WsMiddleware } from '../types/index.js';
2
+ export * from './parser.js';
3
+ /**
4
+ * 🧅 High-performance Onion-style Message Execution Pipeline.
5
+ * Enables sequential middleware/interceptor execution with full support for asynchronous validation,
6
+ * short-circuiting, payload mutation, and error propagation.
7
+ */
8
+ export declare class WsPipeline<TUser = any> {
9
+ private readonly middlewares;
10
+ /**
11
+ * Registers a new middleware/interceptor in the message pipeline.
12
+ */
13
+ use(middleware: WsMiddleware<TUser>): this;
14
+ /**
15
+ * Executes the registered middleware pipeline sequentially.
16
+ * If all middlewares successfully call next(), the final handler is executed.
17
+ */
18
+ run(client: WsSocket<TUser>, event: string, payload: any, handler: (client: WsSocket<TUser>, data: any) => void | Promise<void>): Promise<void>;
19
+ }
@@ -0,0 +1,45 @@
1
+ export * from './parser.js';
2
+ /**
3
+ * 🧅 High-performance Onion-style Message Execution Pipeline.
4
+ * Enables sequential middleware/interceptor execution with full support for asynchronous validation,
5
+ * short-circuiting, payload mutation, and error propagation.
6
+ */
7
+ export class WsPipeline {
8
+ middlewares = [];
9
+ /**
10
+ * Registers a new middleware/interceptor in the message pipeline.
11
+ */
12
+ use(middleware) {
13
+ this.middlewares.push(middleware);
14
+ return this;
15
+ }
16
+ /**
17
+ * Executes the registered middleware pipeline sequentially.
18
+ * If all middlewares successfully call next(), the final handler is executed.
19
+ */
20
+ async run(client, event, payload, handler) {
21
+ const context = {
22
+ client,
23
+ event,
24
+ payload
25
+ };
26
+ let index = -1;
27
+ const dispatch = async (i) => {
28
+ if (i <= index) {
29
+ throw new Error('next() called multiple times inside WsPipeline');
30
+ }
31
+ index = i;
32
+ // When we reach the end of the middleware list, invoke the final message handler
33
+ if (i === this.middlewares.length) {
34
+ await handler(context.client, context.payload);
35
+ return;
36
+ }
37
+ const middleware = this.middlewares[i];
38
+ await middleware(context, async () => {
39
+ await dispatch(i + 1);
40
+ });
41
+ };
42
+ await dispatch(0);
43
+ }
44
+ }
45
+ //# sourceMappingURL=index.js.map