quantum-flow 1.0.1

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 (102) hide show
  1. package/.prettierrc.json +9 -0
  2. package/README.md +37 -0
  3. package/dist/app/aws/index.d.ts +1 -0
  4. package/dist/app/aws/index.js +17 -0
  5. package/dist/app/aws/lambda.d.ts +13 -0
  6. package/dist/app/aws/lambda.js +241 -0
  7. package/dist/app/http/Application.d.ts +23 -0
  8. package/dist/app/http/Application.js +208 -0
  9. package/dist/app/http/Socket.d.ts +16 -0
  10. package/dist/app/http/Socket.js +32 -0
  11. package/dist/app/http/decorators.d.ts +7 -0
  12. package/dist/app/http/decorators.js +81 -0
  13. package/dist/app/http/index.d.ts +3 -0
  14. package/dist/app/http/index.js +19 -0
  15. package/dist/app/http/websocket/WebsocetService.d.ts +20 -0
  16. package/dist/app/http/websocket/WebsocetService.js +41 -0
  17. package/dist/app/http/websocket/WebsocketServer.d.ts +30 -0
  18. package/dist/app/http/websocket/WebsocketServer.js +221 -0
  19. package/dist/constants.d.ts +16 -0
  20. package/dist/constants.js +24 -0
  21. package/dist/core/Controller.d.ts +43 -0
  22. package/dist/core/Controller.js +159 -0
  23. package/dist/core/Endpoint.d.ts +8 -0
  24. package/dist/core/Endpoint.js +43 -0
  25. package/dist/core/index.d.ts +4 -0
  26. package/dist/core/index.js +19 -0
  27. package/dist/core/utils/extractors.d.ts +15 -0
  28. package/dist/core/utils/extractors.js +29 -0
  29. package/dist/core/utils/helpers.d.ts +4 -0
  30. package/dist/core/utils/helpers.js +22 -0
  31. package/dist/core/utils/index.d.ts +3 -0
  32. package/dist/core/utils/index.js +19 -0
  33. package/dist/core/utils/websocket.d.ts +8 -0
  34. package/dist/core/utils/websocket.js +45 -0
  35. package/dist/types/common.d.ts +47 -0
  36. package/dist/types/common.js +2 -0
  37. package/dist/types/controller.d.ts +4 -0
  38. package/dist/types/controller.js +2 -0
  39. package/dist/types/http.d.ts +18 -0
  40. package/dist/types/http.js +2 -0
  41. package/dist/types/index.d.ts +5 -0
  42. package/dist/types/index.js +21 -0
  43. package/dist/types/lambda.d.ts +26 -0
  44. package/dist/types/lambda.js +2 -0
  45. package/dist/types/websocket.d.ts +55 -0
  46. package/dist/types/websocket.js +2 -0
  47. package/dist/utils/controller.d.ts +9 -0
  48. package/dist/utils/controller.js +111 -0
  49. package/dist/utils/helper.d.ts +1 -0
  50. package/dist/utils/helper.js +24 -0
  51. package/dist/utils/index.d.ts +7 -0
  52. package/dist/utils/index.js +23 -0
  53. package/dist/utils/multipart.d.ts +15 -0
  54. package/dist/utils/multipart.js +109 -0
  55. package/dist/utils/parsers.d.ts +4 -0
  56. package/dist/utils/parsers.js +76 -0
  57. package/dist/utils/server.d.ts +4 -0
  58. package/dist/utils/server.js +46 -0
  59. package/dist/utils/transform.d.ts +1 -0
  60. package/dist/utils/transform.js +23 -0
  61. package/dist/utils/validate.d.ts +1 -0
  62. package/dist/utils/validate.js +46 -0
  63. package/dist/validators/Validate.d.ts +3 -0
  64. package/dist/validators/Validate.js +40 -0
  65. package/dist/validators/index.d.ts +1 -0
  66. package/dist/validators/index.js +17 -0
  67. package/eslint.config.mjs +84 -0
  68. package/nodemon.json +5 -0
  69. package/package.json +70 -0
  70. package/src/app/aws/index.ts +1 -0
  71. package/src/app/aws/lambda.ts +283 -0
  72. package/src/app/http/Application.ts +250 -0
  73. package/src/app/http/Socket.ts +38 -0
  74. package/src/app/http/decorators.ts +115 -0
  75. package/src/app/http/index.ts +3 -0
  76. package/src/app/http/websocket/WebsocetService.ts +44 -0
  77. package/src/app/http/websocket/WebsocketServer.ts +262 -0
  78. package/src/constants.ts +25 -0
  79. package/src/core/Controller.ts +229 -0
  80. package/src/core/Endpoint.ts +39 -0
  81. package/src/core/index.ts +14 -0
  82. package/src/core/utils/extractors.ts +32 -0
  83. package/src/core/utils/helpers.ts +22 -0
  84. package/src/core/utils/index.ts +3 -0
  85. package/src/core/utils/websocket.ts +45 -0
  86. package/src/types/common.ts +60 -0
  87. package/src/types/controller.ts +2 -0
  88. package/src/types/http.ts +19 -0
  89. package/src/types/index.ts +5 -0
  90. package/src/types/lambda.ts +28 -0
  91. package/src/types/websocket.ts +57 -0
  92. package/src/utils/controller.ts +143 -0
  93. package/src/utils/helper.ts +24 -0
  94. package/src/utils/index.ts +7 -0
  95. package/src/utils/multipart.ts +93 -0
  96. package/src/utils/parsers.ts +87 -0
  97. package/src/utils/server.ts +49 -0
  98. package/src/utils/transform.ts +24 -0
  99. package/src/utils/validate.ts +53 -0
  100. package/src/validators/Validate.ts +48 -0
  101. package/src/validators/index.ts +1 -0
  102. package/tsconfig.json +51 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "trailingComma": "all",
3
+ "useTabs": false,
4
+ "tabWidth": 2,
5
+ "semi": true,
6
+ "singleQuote": true,
7
+ "printWidth": 100,
8
+ "bracketSpacing": true
9
+ }
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Your Package Name
2
+
3
+ Description of your package.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install your-package-name
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { greet } from 'your-package-name';
15
+
16
+ console.log(greet('World'));
17
+ ```
18
+
19
+ ## Build
20
+
21
+ To build the package, run:
22
+
23
+ ```bash
24
+ npm run build
25
+ ```
26
+
27
+ ## Test
28
+
29
+ To run tests, run:
30
+
31
+ ```bash
32
+ npm run test
33
+ ```
34
+
35
+ ## License
36
+
37
+ MIT
@@ -0,0 +1 @@
1
+ export * from './lambda';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./lambda"), exports);
@@ -0,0 +1,13 @@
1
+ import { APIGatewayProxyEvent, APIGatewayProxyResult, Context, Handler } from 'aws-lambda';
2
+ import { LambdaRequest, LambdaResponse } from '@types';
3
+ export declare class LambdaAdapter {
4
+ private static getHeaderValue;
5
+ static toRequest(event: APIGatewayProxyEvent, context: Context): LambdaRequest;
6
+ static createResponseBody(response: any): any;
7
+ static toLambdaResponse(response: any, request?: LambdaRequest): LambdaResponse;
8
+ static createHandler(Contoller: any): Handler<APIGatewayProxyEvent, APIGatewayProxyResult>;
9
+ private static safeHeaders;
10
+ private static safeParams;
11
+ private static getSourceIp;
12
+ private static getUserAgent;
13
+ }
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LambdaAdapter = void 0;
4
+ const _constants_1 = require("@constants");
5
+ const _utils_1 = require("@utils");
6
+ class LambdaAdapter {
7
+ static getHeaderValue(headers, headerName) {
8
+ const value = headers?.[headerName] || headers?.[headerName.toLowerCase()];
9
+ if (!value)
10
+ return undefined;
11
+ if (Array.isArray(value)) {
12
+ return value[0];
13
+ }
14
+ return value;
15
+ }
16
+ static toRequest(event, context) {
17
+ const query = {};
18
+ if (event.queryStringParameters) {
19
+ Object.entries(event.queryStringParameters).forEach(([key, value]) => {
20
+ if (event.multiValueQueryStringParameters?.[key]) {
21
+ query[key] = event.multiValueQueryStringParameters[key];
22
+ }
23
+ else {
24
+ query[key] = value || '';
25
+ }
26
+ });
27
+ }
28
+ const cookies = {};
29
+ const cookieHeader = event.headers?.Cookie || event.headers?.cookie;
30
+ if (cookieHeader) {
31
+ cookieHeader.split(';').forEach((cookie) => {
32
+ const [name, value] = cookie.trim().split('=');
33
+ if (name && value) {
34
+ cookies[name] = decodeURIComponent(value);
35
+ }
36
+ });
37
+ }
38
+ let body = (0, _utils_1.ParseBody)(event);
39
+ const protocol = event.headers?.['x-forwarded-proto'] || 'http';
40
+ const host = event.headers?.host || 'localhost';
41
+ const cleanPath = event.path.split('?')[0];
42
+ const fullUrl = `${protocol}://${host}${cleanPath.startsWith('/') ? '' : '/'}${cleanPath}`;
43
+ let url;
44
+ try {
45
+ url = new URL(fullUrl);
46
+ if (event.queryStringParameters) {
47
+ Object.entries(event.queryStringParameters).forEach(([key, value]) => {
48
+ if (value)
49
+ url.searchParams.append(key, value);
50
+ });
51
+ }
52
+ }
53
+ catch (error) {
54
+ console.error('❌ Failed to create URL:', fullUrl, error);
55
+ url = new URL('http://localhost/');
56
+ }
57
+ return {
58
+ method: event.httpMethod,
59
+ path: cleanPath,
60
+ url,
61
+ headers: this.safeHeaders(event.headers),
62
+ query,
63
+ body,
64
+ params: this.safeParams(event.pathParameters),
65
+ cookies,
66
+ raw: event,
67
+ context,
68
+ isBase64Encoded: event.isBase64Encoded || false,
69
+ requestId: context.awsRequestId,
70
+ stage: event.requestContext?.stage || '$default',
71
+ sourceIp: this.getSourceIp(event),
72
+ userAgent: this.getUserAgent(event),
73
+ };
74
+ }
75
+ static createResponseBody(response) {
76
+ let body = response;
77
+ if (response && typeof response === 'object') {
78
+ if ('data' in response) {
79
+ body = {
80
+ data: response.data,
81
+ timestamp: new Date().toISOString(),
82
+ };
83
+ }
84
+ else if (response.body) {
85
+ return response;
86
+ }
87
+ else {
88
+ body = {
89
+ data: response,
90
+ timestamp: new Date().toISOString(),
91
+ };
92
+ }
93
+ }
94
+ return body;
95
+ }
96
+ static toLambdaResponse(response, request) {
97
+ let statusCode = response.status ?? 200;
98
+ let body = this.createResponseBody(response);
99
+ let headers = {
100
+ 'Content-Type': 'application/json',
101
+ 'X-Request-Id': request?.requestId || 'unknown',
102
+ 'X-Powered-By': 'Lambda Decorators',
103
+ };
104
+ const cookies = [];
105
+ if (response && typeof response === 'object') {
106
+ if ('data' in response) {
107
+ body = {
108
+ success: _constants_1.OK_STATUSES.includes(statusCode),
109
+ data: response.data,
110
+ timestamp: new Date().toISOString(),
111
+ requestId: request?.requestId,
112
+ };
113
+ }
114
+ else if (response.body) {
115
+ return response;
116
+ }
117
+ else {
118
+ body = {
119
+ success: _constants_1.OK_STATUSES.includes(statusCode),
120
+ data: response,
121
+ timestamp: new Date().toISOString(),
122
+ requestId: request?.requestId,
123
+ };
124
+ }
125
+ }
126
+ let originHeader = LambdaAdapter.getHeaderValue(request?.headers, 'origin');
127
+ if (originHeader) {
128
+ if (Array.isArray(originHeader)) {
129
+ origin = originHeader[0];
130
+ }
131
+ else {
132
+ origin = originHeader;
133
+ }
134
+ }
135
+ if (request?.cookies && Object.keys(request.cookies).length > 0) {
136
+ Object.entries(request.cookies).forEach(([name, value]) => {
137
+ cookies.push(`${name}=${encodeURIComponent(value)}; Path=/; HttpOnly`);
138
+ });
139
+ }
140
+ const lambdaResponse = {
141
+ statusCode,
142
+ headers,
143
+ body: JSON.stringify(body),
144
+ isBase64Encoded: false,
145
+ };
146
+ if (cookies.length > 0) {
147
+ lambdaResponse.cookies = cookies;
148
+ }
149
+ if (cookies.length > 0) {
150
+ lambdaResponse.multiValueHeaders = {
151
+ 'Set-Cookie': cookies,
152
+ };
153
+ }
154
+ return lambdaResponse;
155
+ }
156
+ static createHandler(Contoller) {
157
+ const handler = async (event, context) => {
158
+ const instance = new Contoller();
159
+ try {
160
+ const request = LambdaAdapter.toRequest(event, context);
161
+ if (typeof instance.handleRequest === 'function') {
162
+ const response = await instance.handleRequest(request);
163
+ return LambdaAdapter.toLambdaResponse(response, request);
164
+ }
165
+ else {
166
+ throw new Error('Controller must have handleRequest method');
167
+ }
168
+ }
169
+ catch (error) {
170
+ console.error('❌ Lambda error:', error);
171
+ const errorResponse = {
172
+ statusCode: error.status || 500,
173
+ headers: {
174
+ 'Content-Type': 'application/json',
175
+ 'X-Request-Id': context.awsRequestId,
176
+ 'Access-Control-Allow-Origin': event.headers?.origin || event.headers?.Origin || '*',
177
+ 'Access-Control-Allow-Credentials': 'true',
178
+ },
179
+ body: JSON.stringify({
180
+ success: false,
181
+ message: error.message || 'Internal Server Error',
182
+ requestId: context.awsRequestId,
183
+ }),
184
+ };
185
+ if (error.cookies) {
186
+ errorResponse.cookies = error.cookies;
187
+ }
188
+ return errorResponse;
189
+ }
190
+ };
191
+ return handler;
192
+ }
193
+ static safeHeaders(headers) {
194
+ const result = {};
195
+ if (!headers)
196
+ return result;
197
+ Object.entries(headers).forEach(([key, value]) => {
198
+ if (value !== undefined) {
199
+ result[key] = value;
200
+ }
201
+ });
202
+ return result;
203
+ }
204
+ static safeParams(params) {
205
+ const result = {};
206
+ if (!params)
207
+ return result;
208
+ Object.entries(params).forEach(([key, value]) => {
209
+ if (value !== undefined) {
210
+ result[key] = value;
211
+ }
212
+ });
213
+ return result;
214
+ }
215
+ static getSourceIp(event) {
216
+ if (event.requestContext?.identity?.sourceIp) {
217
+ return event.requestContext.identity.sourceIp;
218
+ }
219
+ const forwardedFor = event.headers?.['x-forwarded-for'];
220
+ if (forwardedFor) {
221
+ if (typeof forwardedFor === 'string') {
222
+ return forwardedFor.split(',')[0].trim();
223
+ }
224
+ if (Array.isArray(forwardedFor) && forwardedFor.length > 0) {
225
+ return forwardedFor[0].split(',')[0].trim();
226
+ }
227
+ }
228
+ return '0.0.0.0';
229
+ }
230
+ static getUserAgent(event) {
231
+ const ua = event.headers?.['user-agent'];
232
+ if (!ua)
233
+ return 'unknown';
234
+ if (typeof ua === 'string')
235
+ return ua;
236
+ if (Array.isArray(ua) && ua.length > 0)
237
+ return ua[0];
238
+ return 'unknown';
239
+ }
240
+ }
241
+ exports.LambdaAdapter = LambdaAdapter;
@@ -0,0 +1,23 @@
1
+ import { ServerConfig } from '@types';
2
+ import http from 'http';
3
+ import { Socket } from './Socket';
4
+ export declare class HttpServer extends Socket {
5
+ private app;
6
+ private config;
7
+ private isRunning;
8
+ constructor(configOrClass: new (...args: any[]) => any);
9
+ private logConfig;
10
+ listen(port?: number, host?: string): Promise<http.Server>;
11
+ close(): Promise<void>;
12
+ status(): {
13
+ running: boolean;
14
+ config: ServerConfig;
15
+ };
16
+ private requestHandler;
17
+ private createRequest;
18
+ private applyMiddlewares;
19
+ private findController;
20
+ private applyInterceptors;
21
+ private sendResponse;
22
+ private handleError;
23
+ }
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpServer = void 0;
7
+ const _constants_1 = require("@constants");
8
+ const _utils_1 = require("@utils");
9
+ const http_1 = __importDefault(require("http"));
10
+ const Socket_1 = require("./Socket");
11
+ const WebsocetService_1 = require("./websocket/WebsocetService");
12
+ const WebsocketServer_1 = require("./websocket/WebsocketServer");
13
+ class HttpServer extends Socket_1.Socket {
14
+ app;
15
+ config;
16
+ isRunning = false;
17
+ constructor(configOrClass) {
18
+ super();
19
+ this.config = (0, _utils_1.resolveConfig)(configOrClass);
20
+ const app = http_1.default.createServer(this.requestHandler.bind(this));
21
+ if (this.config.websocket?.enabled) {
22
+ this.wss = new WebsocketServer_1.WebSocketServer(app, {
23
+ path: this.config.websocket.path || '/',
24
+ });
25
+ WebsocetService_1.WebSocketService.getInstance().initialize(this.wss);
26
+ }
27
+ this.app = app;
28
+ this.logConfig();
29
+ }
30
+ logConfig() {
31
+ console.log(`
32
+ ╔════════════════════════════════════════╗
33
+ ║ 🚀 Server Configuration
34
+ ╠════════════════════════════════════════╣
35
+ ║ 📍 Host: ${this.config.host}
36
+ ║ 🔌 Port: ${this.config.port}
37
+ ║ 🔌 Websocket: ${!!this.config.websocket}
38
+ ║ 🔧 Middlewares: ${this.config.globalMiddlewares?.length || 0}
39
+ ║ 🎯 Interceptors: ${this.config.globalInterceptors?.length || 0}
40
+ ║ 📦 Controllers: ${this.config.controllers?.length || 0}
41
+ ╚════════════════════════════════════════╝
42
+ `);
43
+ }
44
+ async listen(port, host) {
45
+ if (this.isRunning) {
46
+ console.log('⚠️ Server is already running');
47
+ return this.app;
48
+ }
49
+ const listenPort = port || this.config.port || 3000;
50
+ const listenHost = host || this.config.host || 'localhost';
51
+ return new Promise((resolve, reject) => {
52
+ try {
53
+ this.app.listen(listenPort, listenHost, () => {
54
+ this.isRunning = true;
55
+ console.log(`
56
+ ╔════════════════════════════════════════╗
57
+ ║ 🎉 Server started successfully!
58
+ ║ 📍 http://${listenHost}:${listenPort}
59
+ ║ 📊 Status: RUNNING
60
+ ╚════════════════════════════════════════╝
61
+ `);
62
+ resolve(this.app);
63
+ });
64
+ this.app.on('error', (error) => {
65
+ console.error('❌ Server error:', error);
66
+ reject(error);
67
+ });
68
+ }
69
+ catch (error) {
70
+ reject(error);
71
+ }
72
+ });
73
+ }
74
+ async close() {
75
+ return new Promise((resolve, reject) => {
76
+ if (!this.isRunning) {
77
+ resolve();
78
+ return;
79
+ }
80
+ this.app.close((err) => {
81
+ if (err) {
82
+ reject(err);
83
+ }
84
+ else {
85
+ this.isRunning = false;
86
+ console.log(_constants_1.STOPPED);
87
+ resolve();
88
+ }
89
+ });
90
+ });
91
+ }
92
+ status() {
93
+ return {
94
+ running: this.isRunning,
95
+ config: this.config,
96
+ };
97
+ }
98
+ async requestHandler(req, res) {
99
+ const startTime = Date.now();
100
+ try {
101
+ const request = await this.createRequest(req);
102
+ let processedRequest = await this.applyMiddlewares(request, res);
103
+ const data = await this.findController(processedRequest, res);
104
+ const finalResponse = await this.applyInterceptors(data, request, res);
105
+ await this.sendResponse(res, finalResponse, startTime);
106
+ }
107
+ catch (error) {
108
+ await this.handleError(error, req, res, startTime);
109
+ }
110
+ }
111
+ async createRequest(req) {
112
+ const rawBody = await (0, _utils_1.collectRawBody)(req);
113
+ const parseRequest = {
114
+ body: rawBody,
115
+ headers: req.headers,
116
+ isBase64Encoded: false,
117
+ };
118
+ const parsedBody = (0, _utils_1.ParseBody)(parseRequest);
119
+ const protocol = req.headers['x-forwarded-proto'] || 'http';
120
+ const host = req.headers.host || 'localhost';
121
+ const fullUrl = `${protocol}://${host}${req.url}`;
122
+ const whatwgUrl = new URL(fullUrl);
123
+ return {
124
+ method: req.method,
125
+ url: whatwgUrl,
126
+ path: whatwgUrl.pathname,
127
+ headers: req.headers,
128
+ body: parsedBody,
129
+ rawBody: rawBody,
130
+ query: (0, _utils_1.ParseQuery)(whatwgUrl),
131
+ params: {},
132
+ cookies: (0, _utils_1.ParseCookies)(req),
133
+ isBase64Encoded: false,
134
+ _startTime: Date.now(),
135
+ };
136
+ }
137
+ async applyMiddlewares(request, res) {
138
+ let processed = request;
139
+ for (const middleware of this.config.globalMiddlewares || []) {
140
+ const result = await middleware(processed, res);
141
+ if (result) {
142
+ processed = { ...processed, ...result };
143
+ }
144
+ }
145
+ return processed;
146
+ }
147
+ async findController(request, response) {
148
+ for (const ControllerClass of this.config.controllers || []) {
149
+ const instance = new ControllerClass();
150
+ if (typeof instance.handleRequest === 'function') {
151
+ const data = await instance.handleRequest(request, response);
152
+ if (data && data.status !== 404) {
153
+ return data;
154
+ }
155
+ }
156
+ }
157
+ return {
158
+ status: 404,
159
+ data: { message: `Route ${request.method} ${request.path} not found` },
160
+ };
161
+ }
162
+ async applyInterceptors(data, request, response) {
163
+ let processed = data;
164
+ for (const interceptor of this.config.globalInterceptors || []) {
165
+ processed = await interceptor(processed, request, response);
166
+ }
167
+ return processed;
168
+ }
169
+ async sendResponse(res, data, startTime) {
170
+ const resp = data?.data !== undefined ? data.data : data;
171
+ if (!res.headersSent) {
172
+ if (!res.getHeader('Content-Type')) {
173
+ res.setHeader('Content-Type', 'application/json');
174
+ }
175
+ if (data?.headers) {
176
+ Object.entries(data.headers).forEach(([key, value]) => {
177
+ if (!res.getHeader(key)) {
178
+ res.setHeader(key, value);
179
+ }
180
+ });
181
+ }
182
+ }
183
+ res.setHeader('X-Response-Time', `${Date.now() - startTime}ms`);
184
+ res.statusCode = data.status ?? 200;
185
+ res.end(JSON.stringify(resp));
186
+ }
187
+ async handleError(error, req, res, startTime) {
188
+ let errorResponse = {
189
+ status: error.status || 500,
190
+ data: {
191
+ message: error.message || 'Internal Server Error',
192
+ errors: error.errors || [],
193
+ },
194
+ };
195
+ if (!this.config.globalErrorHandler) {
196
+ return this.sendResponse(res, errorResponse, startTime);
197
+ }
198
+ try {
199
+ const intercepted = await this.config.globalErrorHandler(error, req, res);
200
+ errorResponse = { ...errorResponse, ...intercepted };
201
+ }
202
+ catch (cathed) {
203
+ Object.assign(errorResponse, cathed);
204
+ }
205
+ return this.sendResponse(res, errorResponse, startTime);
206
+ }
207
+ }
208
+ exports.HttpServer = HttpServer;
@@ -0,0 +1,16 @@
1
+ import { WebSocketServer } from './websocket/WebsocketServer';
2
+ export declare class Socket {
3
+ protected wss: WebSocketServer;
4
+ registerWebSocketControllers(controllers: any[]): this;
5
+ sendToClient(clientId: string, message: any): boolean;
6
+ publishToTopic(topic: string, data: any): void;
7
+ broadcast(message: any, excludeClientId?: string): void;
8
+ getWebSocketStats(): {
9
+ clients: number;
10
+ topics: {
11
+ topic: string;
12
+ subscribers: number;
13
+ }[];
14
+ };
15
+ isWebSocketAvailable(): boolean;
16
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Socket = void 0;
4
+ const WebsocetService_1 = require("./websocket/WebsocetService");
5
+ class Socket {
6
+ wss;
7
+ registerWebSocketControllers(controllers) {
8
+ if (!this.wss) {
9
+ console.warn('⚠️ WebSocket is disabled. Enable it in config: { websocket: { enabled: true } }');
10
+ return this;
11
+ }
12
+ this.wss.registerControllers(controllers);
13
+ console.log(`📝 Registered ${controllers.length} WebSocket controllers`);
14
+ return this;
15
+ }
16
+ sendToClient(clientId, message) {
17
+ return WebsocetService_1.WebSocketService.getInstance().sendToClient(clientId, message);
18
+ }
19
+ publishToTopic(topic, data) {
20
+ WebsocetService_1.WebSocketService.getInstance().publishToTopic(topic, data);
21
+ }
22
+ broadcast(message, excludeClientId) {
23
+ WebsocetService_1.WebSocketService.getInstance().broadcast(message, excludeClientId);
24
+ }
25
+ getWebSocketStats() {
26
+ return WebsocetService_1.WebSocketService.getInstance().getStats();
27
+ }
28
+ isWebSocketAvailable() {
29
+ return WebsocetService_1.WebSocketService.getInstance().isAvailable();
30
+ }
31
+ }
32
+ exports.Socket = Socket;
@@ -0,0 +1,7 @@
1
+ import { Conf, Interceptor } from '@types';
2
+ export declare function Server(config?: Conf): (target: any) => any;
3
+ export declare function Use(middleware: any): (target: any) => any;
4
+ export declare function Intercept(interceptor: Interceptor): (target: any) => any;
5
+ export declare function Catch(handler: any): (target: any) => any;
6
+ export declare function Port(port: number): (target: any) => any;
7
+ export declare function Host(host: string): (target: any) => any;