@push.rocks/smartproxy 26.2.4 → 27.0.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.
Files changed (64) hide show
  1. package/changelog.md +16 -0
  2. package/dist_rust/rustproxy_linux_amd64 +0 -0
  3. package/dist_rust/rustproxy_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/core/models/wrapped-socket.js +4 -1
  6. package/dist_ts/core/routing/route-manager.js +9 -7
  7. package/dist_ts/plugins.d.ts +2 -1
  8. package/dist_ts/plugins.js +3 -2
  9. package/dist_ts/proxies/smart-proxy/datagram-handler-server.js +7 -5
  10. package/dist_ts/proxies/smart-proxy/route-preprocessor.js +6 -8
  11. package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +186 -184
  12. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +0 -1
  13. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +2 -4
  14. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +9 -4
  15. package/dist_ts/proxies/smart-proxy/smart-proxy.js +70 -10
  16. package/dist_ts/proxies/smart-proxy/socket-handler-server.js +5 -3
  17. package/dist_ts/proxies/smart-proxy/utils/concurrency-semaphore.js +4 -3
  18. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +2 -3
  19. package/dist_ts/proxies/smart-proxy/utils/index.js +4 -6
  20. package/dist_ts/proxies/smart-proxy/utils/mutex.js +3 -5
  21. package/dist_ts/proxies/smart-proxy/utils/route-validator.js +7 -7
  22. package/dist_ts/proxies/smart-proxy/utils/{route-helpers/socket-handlers.d.ts → socket-handlers.d.ts} +2 -10
  23. package/dist_ts/proxies/smart-proxy/utils/socket-handlers.js +268 -0
  24. package/dist_ts/routing/models/http-types.js +5 -1
  25. package/package.json +2 -1
  26. package/readme.hints.md +42 -20
  27. package/readme.md +165 -163
  28. package/ts/00_commitinfo_data.ts +1 -1
  29. package/ts/plugins.ts +2 -0
  30. package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +0 -5
  31. package/ts/proxies/smart-proxy/smart-proxy.ts +67 -5
  32. package/ts/proxies/smart-proxy/utils/index.ts +3 -11
  33. package/ts/proxies/smart-proxy/utils/{route-helpers/socket-handlers.ts → socket-handlers.ts} +3 -31
  34. package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.d.ts +0 -49
  35. package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.js +0 -108
  36. package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.d.ts +0 -57
  37. package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.js +0 -90
  38. package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.d.ts +0 -17
  39. package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.js +0 -32
  40. package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.d.ts +0 -68
  41. package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.js +0 -117
  42. package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.d.ts +0 -17
  43. package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.js +0 -27
  44. package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.d.ts +0 -63
  45. package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.js +0 -105
  46. package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.d.ts +0 -83
  47. package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.js +0 -126
  48. package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.d.ts +0 -47
  49. package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.js +0 -66
  50. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +0 -286
  51. package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.d.ts +0 -46
  52. package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.js +0 -67
  53. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +0 -9
  54. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +0 -11
  55. package/ts/proxies/smart-proxy/utils/route-helpers/api-helpers.ts +0 -144
  56. package/ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.ts +0 -125
  57. package/ts/proxies/smart-proxy/utils/route-helpers/http-helpers.ts +0 -40
  58. package/ts/proxies/smart-proxy/utils/route-helpers/https-helpers.ts +0 -163
  59. package/ts/proxies/smart-proxy/utils/route-helpers/index.ts +0 -62
  60. package/ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.ts +0 -154
  61. package/ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.ts +0 -202
  62. package/ts/proxies/smart-proxy/utils/route-helpers/security-helpers.ts +0 -96
  63. package/ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.ts +0 -98
  64. package/ts/proxies/smart-proxy/utils/route-helpers.ts +0 -11
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Socket Handler Functions
3
+ *
4
+ * This module provides pre-built socket handlers for common use cases
5
+ * like echoing, proxying, HTTP responses, and redirects.
6
+ */
7
+ import * as plugins from '../../../plugins.js';
8
+ import { createSocketTracker } from '../../../core/utils/socket-tracker.js';
9
+ /**
10
+ * Minimal HTTP request parser for socket handlers.
11
+ * Parses method, path, and optionally headers from a raw buffer.
12
+ */
13
+ function parseHttpRequest(data, extractHeaders = false) {
14
+ const str = data.toString('utf8');
15
+ const headerEnd = str.indexOf('\r\n\r\n');
16
+ const isComplete = headerEnd !== -1;
17
+ const headerSection = isComplete ? str.slice(0, headerEnd) : str;
18
+ const lines = headerSection.split('\r\n');
19
+ const requestLine = lines[0];
20
+ if (!requestLine)
21
+ return null;
22
+ const parts = requestLine.split(' ');
23
+ if (parts.length < 2)
24
+ return null;
25
+ const method = parts[0];
26
+ const path = parts[1];
27
+ // Quick check: valid HTTP method
28
+ const validMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS', 'CONNECT', 'TRACE'];
29
+ if (!validMethods.includes(method))
30
+ return null;
31
+ const headers = {};
32
+ if (extractHeaders) {
33
+ for (let i = 1; i < lines.length; i++) {
34
+ const colonIdx = lines[i].indexOf(':');
35
+ if (colonIdx > 0) {
36
+ const name = lines[i].slice(0, colonIdx).trim().toLowerCase();
37
+ const value = lines[i].slice(colonIdx + 1).trim();
38
+ headers[name] = value;
39
+ }
40
+ }
41
+ }
42
+ const body = isComplete ? str.slice(headerEnd + 4) : undefined;
43
+ return { method, path, headers, isComplete, body };
44
+ }
45
+ /**
46
+ * Pre-built socket handlers for common use cases
47
+ */
48
+ export const SocketHandlers = {
49
+ /**
50
+ * Simple echo server handler
51
+ */
52
+ echo: (socket, context) => {
53
+ socket.write('ECHO SERVER READY\n');
54
+ socket.on('data', data => socket.write(data));
55
+ },
56
+ /**
57
+ * TCP proxy handler
58
+ */
59
+ proxy: (targetHost, targetPort) => (socket, context) => {
60
+ const target = plugins.net.connect(targetPort, targetHost);
61
+ socket.pipe(target);
62
+ target.pipe(socket);
63
+ socket.on('close', () => target.destroy());
64
+ target.on('close', () => socket.destroy());
65
+ target.on('error', (err) => {
66
+ console.error('Proxy target error:', err);
67
+ socket.destroy();
68
+ });
69
+ },
70
+ /**
71
+ * Line-based protocol handler
72
+ */
73
+ lineProtocol: (handler) => (socket, context) => {
74
+ let buffer = '';
75
+ socket.on('data', (data) => {
76
+ buffer += data.toString();
77
+ const lines = buffer.split('\n');
78
+ buffer = lines.pop() || '';
79
+ lines.forEach(line => {
80
+ if (line.trim()) {
81
+ handler(line.trim(), socket);
82
+ }
83
+ });
84
+ });
85
+ },
86
+ /**
87
+ * Simple HTTP response handler (for testing)
88
+ */
89
+ httpResponse: (statusCode, body) => (socket, context) => {
90
+ const response = [
91
+ `HTTP/1.1 ${statusCode} ${statusCode === 200 ? 'OK' : 'Error'}`,
92
+ 'Content-Type: text/plain',
93
+ `Content-Length: ${body.length}`,
94
+ 'Connection: close',
95
+ '',
96
+ body
97
+ ].join('\r\n');
98
+ socket.write(response);
99
+ socket.end();
100
+ },
101
+ /**
102
+ * Block connection immediately
103
+ */
104
+ block: (message) => (socket, context) => {
105
+ const finalMessage = message || `Connection blocked from ${context.clientIp}`;
106
+ if (finalMessage) {
107
+ socket.write(finalMessage);
108
+ }
109
+ socket.end();
110
+ },
111
+ /**
112
+ * HTTP block response
113
+ */
114
+ httpBlock: (statusCode = 403, message) => (socket, context) => {
115
+ const defaultMessage = `Access forbidden for ${context.domain || context.clientIp}`;
116
+ const finalMessage = message || defaultMessage;
117
+ const response = [
118
+ `HTTP/1.1 ${statusCode} ${finalMessage}`,
119
+ 'Content-Type: text/plain',
120
+ `Content-Length: ${finalMessage.length}`,
121
+ 'Connection: close',
122
+ '',
123
+ finalMessage
124
+ ].join('\r\n');
125
+ socket.write(response);
126
+ socket.end();
127
+ },
128
+ /**
129
+ * HTTP redirect handler
130
+ */
131
+ httpRedirect: (locationTemplate, statusCode = 301) => (socket, context) => {
132
+ const tracker = createSocketTracker(socket);
133
+ const handleData = (data) => {
134
+ const parsed = parseHttpRequest(data);
135
+ if (parsed) {
136
+ const path = parsed.path || '/';
137
+ const domain = context.domain || 'localhost';
138
+ const port = context.port;
139
+ const finalLocation = locationTemplate
140
+ .replace('{domain}', domain)
141
+ .replace('{port}', String(port))
142
+ .replace('{path}', path)
143
+ .replace('{clientIp}', context.clientIp);
144
+ const message = `Redirecting to ${finalLocation}`;
145
+ const response = [
146
+ `HTTP/1.1 ${statusCode} ${statusCode === 301 ? 'Moved Permanently' : 'Found'}`,
147
+ `Location: ${finalLocation}`,
148
+ 'Content-Type: text/plain',
149
+ `Content-Length: ${message.length}`,
150
+ 'Connection: close',
151
+ '',
152
+ message
153
+ ].join('\r\n');
154
+ socket.write(response);
155
+ }
156
+ else {
157
+ socket.write('HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n');
158
+ }
159
+ socket.end();
160
+ tracker.cleanup();
161
+ };
162
+ socket.once('data', handleData);
163
+ tracker.addListener('error', (err) => {
164
+ tracker.safeDestroy(err);
165
+ });
166
+ tracker.addListener('close', () => {
167
+ tracker.cleanup();
168
+ });
169
+ },
170
+ /**
171
+ * HTTP server handler for ACME challenges and other HTTP needs
172
+ */
173
+ httpServer: (handler) => (socket, context) => {
174
+ const tracker = createSocketTracker(socket);
175
+ let requestParsed = false;
176
+ let responseTimer = null;
177
+ const processData = (data) => {
178
+ if (requestParsed)
179
+ return;
180
+ const parsed = parseHttpRequest(data, true);
181
+ if (!parsed || !parsed.isComplete) {
182
+ return; // Not a complete HTTP request yet
183
+ }
184
+ requestParsed = true;
185
+ socket.removeListener('data', processData);
186
+ const req = {
187
+ method: parsed.method,
188
+ url: parsed.path,
189
+ headers: parsed.headers,
190
+ body: parsed.body || ''
191
+ };
192
+ let statusCode = 200;
193
+ const responseHeaders = {};
194
+ let ended = false;
195
+ const res = {
196
+ status: (code) => {
197
+ statusCode = code;
198
+ },
199
+ header: (name, value) => {
200
+ responseHeaders[name] = value;
201
+ },
202
+ send: (data) => {
203
+ if (ended)
204
+ return;
205
+ ended = true;
206
+ if (responseTimer) {
207
+ clearTimeout(responseTimer);
208
+ responseTimer = null;
209
+ }
210
+ if (!responseHeaders['content-type']) {
211
+ responseHeaders['content-type'] = 'text/plain';
212
+ }
213
+ responseHeaders['content-length'] = String(data.length);
214
+ responseHeaders['connection'] = 'close';
215
+ const statusText = statusCode === 200 ? 'OK' :
216
+ statusCode === 404 ? 'Not Found' :
217
+ statusCode === 500 ? 'Internal Server Error' : 'Response';
218
+ let response = `HTTP/1.1 ${statusCode} ${statusText}\r\n`;
219
+ for (const [name, value] of Object.entries(responseHeaders)) {
220
+ response += `${name}: ${value}\r\n`;
221
+ }
222
+ response += '\r\n';
223
+ response += data;
224
+ socket.write(response);
225
+ socket.end();
226
+ },
227
+ end: () => {
228
+ if (ended)
229
+ return;
230
+ ended = true;
231
+ socket.write('HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: close\r\n\r\n');
232
+ socket.end();
233
+ }
234
+ };
235
+ try {
236
+ handler(req, res);
237
+ responseTimer = setTimeout(() => {
238
+ if (!ended) {
239
+ res.send('');
240
+ }
241
+ responseTimer = null;
242
+ }, 1000);
243
+ tracker.addTimer(responseTimer);
244
+ }
245
+ catch (error) {
246
+ if (!ended) {
247
+ res.status(500);
248
+ res.send('Internal Server Error');
249
+ }
250
+ tracker.safeDestroy(error instanceof Error ? error : new Error('Handler error'));
251
+ }
252
+ };
253
+ tracker.addListener('data', processData);
254
+ tracker.addListener('error', (err) => {
255
+ if (!requestParsed) {
256
+ tracker.safeDestroy(err);
257
+ }
258
+ });
259
+ tracker.addListener('close', () => {
260
+ if (responseTimer) {
261
+ clearTimeout(responseTimer);
262
+ responseTimer = null;
263
+ }
264
+ tracker.cleanup();
265
+ });
266
+ }
267
+ };
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LWhhbmRsZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvcHJveGllcy9zbWFydC1wcm94eS91dGlscy9zb2NrZXQtaGFuZGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLGlCQUEwQixLQUFLO0lBT3JFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxNQUFNLFVBQVUsR0FBRyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFOUIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixNQUFNLElBQUksR0FBRyxLQUFLLENB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
@@ -38,6 +38,7 @@ export const HttpStatus = {
38
38
  * Base error class for HTTP-related errors
39
39
  */
40
40
  export class HttpError extends Error {
41
+ statusCode;
41
42
  constructor(message, statusCode = HttpStatus.INTERNAL_SERVER_ERROR) {
42
43
  super(message);
43
44
  this.statusCode = statusCode;
@@ -48,6 +49,8 @@ export class HttpError extends Error {
48
49
  * Error related to certificate operations
49
50
  */
50
51
  export class CertificateError extends HttpError {
52
+ domain;
53
+ isRenewal;
51
54
  constructor(message, domain, isRenewal = false) {
52
55
  super(`${message} for domain ${domain}${isRenewal ? ' (renewal)' : ''}`, HttpStatus.INTERNAL_SERVER_ERROR);
53
56
  this.domain = domain;
@@ -59,6 +62,7 @@ export class CertificateError extends HttpError {
59
62
  * Error related to server operations
60
63
  */
61
64
  export class ServerError extends HttpError {
65
+ code;
62
66
  constructor(message, code, statusCode = HttpStatus.INTERNAL_SERVER_ERROR) {
63
67
  super(message, statusCode);
64
68
  this.code = code;
@@ -92,4 +96,4 @@ export function getStatusText(status) {
92
96
  // Backward compatibility exports
93
97
  export { HttpError as Port80HandlerError };
94
98
  export { CertificateError as CertError };
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3JvdXRpbmcvbW9kZWxzL2h0dHAtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxJQUFJLGtCQUFrQixFQUFFLGFBQWEsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXpIOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixtREFBcUMsQ0FBQTtJQUNyQyxxREFBdUMsQ0FBQTtJQUN2QyxpREFBbUMsQ0FBQTtJQUNuQyw2Q0FBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCwwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3pCLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGlCQUFpQjtJQUN2RCxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSztJQUMvQixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxrQkFBa0I7SUFDekQsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsa0JBQWtCO0lBQ3pELFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO0lBQzNDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUFZO0lBQzdDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO0lBQ3ZDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO0lBQ3ZDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLGtCQUFrQjtJQUN6RCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtJQUNuRCxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUI7SUFDdkQscUJBQXFCLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCO0lBQy9ELGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxlQUFlO0lBQ25ELFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO0lBQzNDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLG1CQUFtQjtJQUMzRCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtDQUMzQyxDQUFDO0FBRVg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLEtBQUs7SUFDbEMsWUFBWSxPQUFlLEVBQWtCLGFBQXFCLFVBQVUsQ0FBQyxxQkFBcUI7UUFDaEcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRDRCLGVBQVUsR0FBVixVQUFVLENBQTJDO1FBRWhHLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFDN0MsWUFDRSxPQUFlLEVBQ0MsTUFBYyxFQUNkLFlBQXFCLEtBQUs7UUFFMUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxlQUFlLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFIM0YsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBRzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLFNBQVM7SUFDeEMsWUFBWSxPQUFlLEVBQWtCLElBQWEsRUFBRSxhQUFxQixVQUFVLENBQUMscUJBQXFCO1FBQy9HLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFEZ0IsU0FBSSxHQUFKLElBQUksQ0FBUztRQUV4RCxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFDNUMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLFNBQVM7SUFDMUMsWUFBWSxVQUFrQixvQkFBb0I7UUFDaEQsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBOEJEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFjO0lBQzFDLE9BQU8scUJBQXFCLENBQUMsTUFBNEIsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFxQkQsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLElBQUksa0JBQWtCLEVBQUUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksU0FBUyxFQUFFLENBQUMifQ==
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3JvdXRpbmcvbW9kZWxzL2h0dHAtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxJQUFJLGtCQUFrQixFQUFFLGFBQWEsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXpIOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixtREFBcUMsQ0FBQTtJQUNyQyxxREFBdUMsQ0FBQTtJQUN2QyxpREFBbUMsQ0FBQTtJQUNuQyw2Q0FBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCwwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3pCLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLGlCQUFpQjtJQUN2RCxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSztJQUMvQixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxrQkFBa0I7SUFDekQsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsa0JBQWtCO0lBQ3pELFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO0lBQzNDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUFZO0lBQzdDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO0lBQ3ZDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO0lBQ3ZDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLGtCQUFrQjtJQUN6RCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtJQUNuRCxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUI7SUFDdkQscUJBQXFCLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCO0lBQy9ELGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxlQUFlO0lBQ25ELFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO0lBQzNDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLG1CQUFtQjtJQUMzRCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtDQUMzQyxDQUFDO0FBRVg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLEtBQUs7SUFDVztJQUE3QyxZQUFZLE9BQWUsRUFBa0IsYUFBcUIsVUFBVSxDQUFDLHFCQUFxQjtRQUNoRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFENEIsZUFBVSxHQUFWLFVBQVUsQ0FBMkM7UUFFaEcsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQUczQjtJQUNBO0lBSGxCLFlBQ0UsT0FBZSxFQUNDLE1BQWMsRUFDZCxZQUFxQixLQUFLO1FBRTFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sZUFBZSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBSDNGLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUcxQyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVksU0FBUSxTQUFTO0lBQ0s7SUFBN0MsWUFBWSxPQUFlLEVBQWtCLElBQWEsRUFBRSxhQUFxQixVQUFVLENBQUMscUJBQXFCO1FBQy9HLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFEZ0IsU0FBSSxHQUFKLElBQUksQ0FBUztRQUV4RCxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFDNUMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLFNBQVM7SUFDMUMsWUFBWSxVQUFrQixvQkFBb0I7UUFDaEQsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBOEJEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFjO0lBQzFDLE9BQU8scUJBQXFCLENBQUMsTUFBNEIsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFxQkQsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLElBQUksa0JBQWtCLEVBQUUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksU0FBUyxFQUFFLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartproxy",
3
- "version": "26.2.4",
3
+ "version": "27.0.0",
4
4
  "private": false,
5
5
  "description": "A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.",
6
6
  "main": "dist_ts/index.js",
@@ -28,6 +28,7 @@
28
28
  "dependencies": {
29
29
  "@push.rocks/smartcrypto": "^2.0.4",
30
30
  "@push.rocks/smartlog": "^3.2.1",
31
+ "@push.rocks/smartnftables": "^1.0.1",
31
32
  "@push.rocks/smartrust": "^1.3.2",
32
33
  "@tsclass/tsclass": "^9.5.0",
33
34
  "minimatch": "^10.2.4"
package/readme.hints.md CHANGED
@@ -462,35 +462,57 @@ For TLS termination modes (`terminate` and `terminate-and-reencrypt`), SmartProx
462
462
 
463
463
  **HTTP to HTTPS Redirect**:
464
464
  ```typescript
465
- import { createHttpToHttpsRedirect } from '@push.rocks/smartproxy';
465
+ import { SocketHandlers } from '@push.rocks/smartproxy';
466
466
 
467
- const redirectRoute = createHttpToHttpsRedirect(['example.com', 'www.example.com']);
467
+ const redirectRoute = {
468
+ name: 'http-to-https',
469
+ match: { ports: 80, domains: ['example.com', 'www.example.com'] },
470
+ action: {
471
+ type: 'socket-handler' as const,
472
+ socketHandler: SocketHandlers.httpRedirect('https://{domain}:443{path}', 301)
473
+ }
474
+ };
468
475
  ```
469
476
 
470
477
  **Complete HTTPS Server (with redirect)**:
471
478
  ```typescript
472
- import { createCompleteHttpsServer } from '@push.rocks/smartproxy';
473
-
474
- const routes = createCompleteHttpsServer(
475
- 'example.com',
476
- { host: 'localhost', port: 8080 },
477
- { certificate: 'auto' }
478
- );
479
+ const routes = [
480
+ {
481
+ name: 'https-server',
482
+ match: { ports: 443, domains: 'example.com' },
483
+ action: {
484
+ type: 'forward' as const,
485
+ targets: [{ host: 'localhost', port: 8080 }],
486
+ tls: { mode: 'terminate' as const, certificate: 'auto' as const }
487
+ }
488
+ },
489
+ {
490
+ name: 'http-redirect',
491
+ match: { ports: 80, domains: 'example.com' },
492
+ action: {
493
+ type: 'socket-handler' as const,
494
+ socketHandler: SocketHandlers.httpRedirect('https://{domain}:443{path}', 301)
495
+ }
496
+ }
497
+ ];
479
498
  ```
480
499
 
481
500
  **Load Balancer with Health Checks**:
482
501
  ```typescript
483
- import { createLoadBalancerRoute } from '@push.rocks/smartproxy';
484
-
485
- const lbRoute = createLoadBalancerRoute(
486
- 'api.example.com',
487
- [
488
- { host: 'backend1', port: 8080 },
489
- { host: 'backend2', port: 8080 },
490
- { host: 'backend3', port: 8080 }
491
- ],
492
- { tls: { mode: 'terminate', certificate: 'auto' } }
493
- );
502
+ const lbRoute = {
503
+ name: 'load-balancer',
504
+ match: { ports: 443, domains: 'api.example.com' },
505
+ action: {
506
+ type: 'forward' as const,
507
+ targets: [
508
+ { host: 'backend1', port: 8080 },
509
+ { host: 'backend2', port: 8080 },
510
+ { host: 'backend3', port: 8080 }
511
+ ],
512
+ tls: { mode: 'terminate' as const, certificate: 'auto' as const },
513
+ loadBalancing: { algorithm: 'round-robin' as const }
514
+ }
515
+ };
494
516
  ```
495
517
 
496
518
  ### Smart SNI Requirement (v22.3+)