@push.rocks/smartproxy 26.3.0 → 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.
- package/changelog.md +7 -0
- package/dist_rust/rustproxy_linux_amd64 +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/core/models/wrapped-socket.js +4 -1
- package/dist_ts/core/routing/route-manager.js +9 -7
- package/dist_ts/proxies/smart-proxy/datagram-handler-server.js +7 -5
- package/dist_ts/proxies/smart-proxy/route-preprocessor.js +6 -8
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +186 -184
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +2 -1
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +12 -6
- package/dist_ts/proxies/smart-proxy/socket-handler-server.js +5 -3
- package/dist_ts/proxies/smart-proxy/utils/concurrency-semaphore.js +4 -3
- package/dist_ts/proxies/smart-proxy/utils/index.d.ts +2 -3
- package/dist_ts/proxies/smart-proxy/utils/index.js +4 -6
- package/dist_ts/proxies/smart-proxy/utils/mutex.js +3 -5
- package/dist_ts/proxies/smart-proxy/utils/route-validator.js +7 -7
- package/dist_ts/proxies/smart-proxy/utils/{route-helpers/socket-handlers.d.ts → socket-handlers.d.ts} +2 -10
- package/dist_ts/proxies/smart-proxy/utils/socket-handlers.js +268 -0
- package/dist_ts/routing/models/http-types.js +5 -1
- package/package.json +1 -1
- package/readme.hints.md +42 -20
- package/readme.md +144 -146
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/proxies/smart-proxy/utils/index.ts +3 -11
- package/ts/proxies/smart-proxy/utils/{route-helpers/socket-handlers.ts → socket-handlers.ts} +3 -31
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.d.ts +0 -49
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.js +0 -108
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.d.ts +0 -57
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.js +0 -90
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.d.ts +0 -17
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.js +0 -32
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.d.ts +0 -68
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.js +0 -117
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.d.ts +0 -17
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.js +0 -27
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.d.ts +0 -63
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.js +0 -105
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.d.ts +0 -83
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.js +0 -126
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.d.ts +0 -47
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.js +0 -66
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +0 -286
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.d.ts +0 -46
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.js +0 -67
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +0 -9
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +0 -11
- package/ts/proxies/smart-proxy/utils/route-helpers/api-helpers.ts +0 -144
- package/ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.ts +0 -125
- package/ts/proxies/smart-proxy/utils/route-helpers/http-helpers.ts +0 -40
- package/ts/proxies/smart-proxy/utils/route-helpers/https-helpers.ts +0 -163
- package/ts/proxies/smart-proxy/utils/route-helpers/index.ts +0 -62
- package/ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.ts +0 -154
- package/ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.ts +0 -202
- package/ts/proxies/smart-proxy/utils/route-helpers/security-helpers.ts +0 -96
- package/ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.ts +0 -98
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LWhhbmRsZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvcHJveGllcy9zbWFydC1wcm94eS91dGlscy9zb2NrZXQtaGFuZGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLGlCQUEwQixLQUFLO0lBT3JFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxNQUFNLFVBQVUsR0FBRyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFOUIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEIsaUNBQWlDO0lBQ2pDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUVoRCxNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO0lBQzNDLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDOUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRS9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDckQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCOztPQUVHO0lBQ0gsSUFBSSxFQUFFLENBQUMsTUFBMEIsRUFBRSxPQUFzQixFQUFFLEVBQUU7UUFDM0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssRUFBRSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUEwQixFQUFFLE9BQXNCLEVBQUUsRUFBRTtRQUN4RyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLEVBQUUsQ0FBQyxPQUEyRCxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQTBCLEVBQUUsT0FBc0IsRUFBRSxFQUFFO1FBQ3BJLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksRUFBRSxDQUFDLFVBQWtCLEVBQUUsSUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQTBCLEVBQUUsT0FBc0IsRUFBRSxFQUFFO1FBQ3pHLE1BQU0sUUFBUSxHQUFHO1lBQ2YsWUFBWSxVQUFVLElBQUksVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDL0QsMEJBQTBCO1lBQzFCLG1CQUFtQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hDLG1CQUFtQjtZQUNuQixFQUFFO1lBQ0YsSUFBSTtTQUNMLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWYsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQTBCLEVBQUUsT0FBc0IsRUFBRSxFQUFFO1FBQ2xGLE1BQU0sWUFBWSxHQUFHLE9BQU8sSUFBSSwyQkFBMkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxFQUFFLENBQUMsYUFBcUIsR0FBRyxFQUFFLE9BQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBMEIsRUFBRSxPQUFzQixFQUFFLEVBQUU7UUFDaEgsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BGLE1BQU0sWUFBWSxHQUFHLE9BQU8sSUFBSSxjQUFjLENBQUM7UUFFL0MsTUFBTSxRQUFRLEdBQUc7WUFDZixZQUFZLFVBQVUsSUFBSSxZQUFZLEVBQUU7WUFDeEMsMEJBQTBCO1lBQzFCLG1CQUFtQixZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3hDLG1CQUFtQjtZQUNuQixFQUFFO1lBQ0YsWUFBWTtTQUNiLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWYsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLEVBQUUsQ0FBQyxnQkFBd0IsRUFBRSxhQUFxQixHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBMEIsRUFBRSxPQUFzQixFQUFFLEVBQUU7UUFDM0gsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUNsQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNoQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztnQkFDN0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFFMUIsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCO3FCQUNuQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQztxQkFDM0IsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQy9CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO3FCQUN2QixPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFM0MsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLGFBQWEsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLFFBQVEsR0FBRztvQkFDZixZQUFZLFVBQVUsSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUM5RSxhQUFhLGFBQWEsRUFBRTtvQkFDNUIsMEJBQTBCO29CQUMxQixtQkFBbUIsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDbkMsbUJBQW1CO29CQUNuQixFQUFFO29CQUNGLE9BQU87aUJBQ1IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRWYsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFaEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNuQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsRUFBRSxDQUFDLE9BQThPLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBMEIsRUFBRSxPQUFzQixFQUFFLEVBQUU7UUFDclQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksYUFBYSxHQUEwQixJQUFJLENBQUM7UUFFaEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUNuQyxJQUFJLGFBQWE7Z0JBQUUsT0FBTztZQUUxQixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFNUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLGtDQUFrQztZQUM1QyxDQUFDO1lBRUQsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNyQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUUzQyxNQUFNLEdBQUcsR0FBRztnQkFDVixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDaEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFO2FBQ3hCLENBQUM7WUFFRixJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQTJCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7WUFFbEIsTUFBTSxHQUFHLEdBQUc7Z0JBQ1YsTUFBTSxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUU7b0JBQ3ZCLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxFQUFFLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUN0QyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxDQUFDO2dCQUNELElBQUksRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO29CQUNyQixJQUFJLEtBQUs7d0JBQUUsT0FBTztvQkFDbEIsS0FBSyxHQUFHLElBQUksQ0FBQztvQkFFYixJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQzVCLGFBQWEsR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLENBQUM7b0JBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO3dCQUNyQyxlQUFlLENBQUMsY0FBYyxDQUFDLEdBQUcsWUFBWSxDQUFDO29CQUNqRCxDQUFDO29CQUNELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hELGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBRXhDLE1BQU0sVUFBVSxHQUFHLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QixVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDbEMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztvQkFFM0UsSUFBSSxRQUFRLEdBQUcsWUFBWSxVQUFVLElBQUksVUFBVSxNQUFNLENBQUM7b0JBQzFELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7d0JBQzVELFFBQVEsSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQztvQkFDdEMsQ0FBQztvQkFDRCxRQUFRLElBQUksTUFBTSxDQUFDO29CQUNuQixRQUFRLElBQUksSUFBSSxDQUFDO29CQUVqQixNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFO29CQUNSLElBQUksS0FBSzt3QkFBRSxPQUFPO29CQUNsQixLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztvQkFDbEYsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNmLENBQUM7YUFDRixDQUFDO1lBRUYsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2xCLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUM5QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ1gsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDZixDQUFDO29CQUNELGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDVCxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDbkYsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXpDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQixPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzVCLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDdkIsQ0FBQztZQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDIn0=
|
|
@@ -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,
|
|
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": "
|
|
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",
|
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 {
|
|
465
|
+
import { SocketHandlers } from '@push.rocks/smartproxy';
|
|
466
466
|
|
|
467
|
-
const redirectRoute =
|
|
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
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
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+)
|