@push.rocks/smartproxy 15.0.2 → 16.0.2
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/certificate/index.d.ts +10 -4
- package/dist_ts/certificate/index.js +5 -7
- package/dist_ts/certificate/models/certificate-types.d.ts +35 -15
- package/dist_ts/certificate/providers/cert-provisioner.d.ts +41 -15
- package/dist_ts/certificate/providers/cert-provisioner.js +201 -41
- package/dist_ts/forwarding/config/forwarding-types.d.ts +40 -76
- package/dist_ts/forwarding/config/forwarding-types.js +19 -18
- package/dist_ts/forwarding/config/index.d.ts +4 -2
- package/dist_ts/forwarding/config/index.js +5 -3
- package/dist_ts/forwarding/handlers/base-handler.js +3 -1
- package/dist_ts/forwarding/index.d.ts +5 -6
- package/dist_ts/forwarding/index.js +3 -3
- package/dist_ts/http/models/http-types.js +1 -1
- package/dist_ts/http/port80/acme-interfaces.d.ts +30 -0
- package/dist_ts/http/port80/acme-interfaces.js +46 -1
- package/dist_ts/http/port80/port80-handler.d.ts +17 -2
- package/dist_ts/http/port80/port80-handler.js +49 -11
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +2 -61
- package/dist_ts/proxies/smart-proxy/models/interfaces.js +5 -4
- package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +118 -4
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +70 -4
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +193 -43
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +2 -5
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +25 -146
- package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +7 -0
- package/dist_ts/proxies/smart-proxy/route-helpers/index.js +9 -0
- package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +54 -1
- package/dist_ts/proxies/smart-proxy/route-helpers.js +102 -1
- package/dist_ts/proxies/smart-proxy/route-manager.d.ts +3 -9
- package/dist_ts/proxies/smart-proxy/route-manager.js +3 -115
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +72 -10
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +135 -268
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +3 -3
- package/dist_ts/proxies/smart-proxy/utils/index.d.ts +12 -0
- package/dist_ts/proxies/smart-proxy/utils/index.js +19 -0
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +174 -0
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +332 -0
- package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.d.ts +51 -0
- package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.js +124 -0
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +131 -0
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +217 -0
- package/dist_ts/proxies/smart-proxy/utils/route-utils.d.ts +79 -0
- package/dist_ts/proxies/smart-proxy/utils/route-utils.js +266 -0
- package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +73 -0
- package/dist_ts/proxies/smart-proxy/utils/route-validators.js +242 -0
- package/package.json +1 -1
- package/readme.md +139 -111
- package/readme.plan.md +164 -312
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/certificate/index.ts +17 -9
- package/ts/certificate/models/certificate-types.ts +37 -16
- package/ts/certificate/providers/cert-provisioner.ts +247 -54
- package/ts/forwarding/config/forwarding-types.ts +79 -107
- package/ts/forwarding/config/index.ts +4 -2
- package/ts/forwarding/handlers/base-handler.ts +4 -2
- package/ts/forwarding/index.ts +3 -2
- package/ts/http/models/http-types.ts +0 -1
- package/ts/http/port80/acme-interfaces.ts +84 -0
- package/ts/http/port80/port80-handler.ts +61 -15
- package/ts/proxies/smart-proxy/models/interfaces.ts +7 -64
- package/ts/proxies/smart-proxy/models/route-types.ts +152 -22
- package/ts/proxies/smart-proxy/network-proxy-bridge.ts +226 -55
- package/ts/proxies/smart-proxy/route-connection-handler.ts +36 -205
- package/ts/proxies/smart-proxy/route-helpers/index.ts +9 -0
- package/ts/proxies/smart-proxy/route-helpers.ts +165 -11
- package/ts/proxies/smart-proxy/route-manager.ts +3 -130
- package/ts/proxies/smart-proxy/smart-proxy.ts +157 -329
- package/ts/proxies/smart-proxy/timeout-manager.ts +2 -2
- package/ts/proxies/smart-proxy/utils/index.ts +40 -0
- package/ts/proxies/smart-proxy/utils/route-helpers.ts +455 -0
- package/ts/proxies/smart-proxy/utils/route-migration-utils.ts +165 -0
- package/ts/proxies/smart-proxy/utils/route-patterns.ts +309 -0
- package/ts/proxies/smart-proxy/utils/route-utils.ts +330 -0
- package/ts/proxies/smart-proxy/utils/route-validators.ts +269 -0
- package/ts/forwarding/config/domain-config.ts +0 -28
- package/ts/forwarding/config/domain-manager.ts +0 -283
- package/ts/proxies/smart-proxy/connection-handler.ts +0 -1240
- package/ts/proxies/smart-proxy/port-range-manager.ts +0 -211
- /package/ts/proxies/smart-proxy/{domain-config-manager.ts → domain-config-manager.ts.bak} +0 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Utilities
|
|
3
|
+
*
|
|
4
|
+
* This file provides utility functions for working with route configurations,
|
|
5
|
+
* including merging, finding, and managing route collections.
|
|
6
|
+
*/
|
|
7
|
+
import { validateRouteConfig } from './route-validators.js';
|
|
8
|
+
/**
|
|
9
|
+
* Merge two route configurations
|
|
10
|
+
* The second route's properties will override the first route's properties where they exist
|
|
11
|
+
* @param baseRoute The base route configuration
|
|
12
|
+
* @param overrideRoute The route configuration with overriding properties
|
|
13
|
+
* @returns A new merged route configuration
|
|
14
|
+
*/
|
|
15
|
+
export function mergeRouteConfigs(baseRoute, overrideRoute) {
|
|
16
|
+
// Create deep copies to avoid modifying original objects
|
|
17
|
+
const mergedRoute = JSON.parse(JSON.stringify(baseRoute));
|
|
18
|
+
// Apply overrides at the top level
|
|
19
|
+
if (overrideRoute.id)
|
|
20
|
+
mergedRoute.id = overrideRoute.id;
|
|
21
|
+
if (overrideRoute.name)
|
|
22
|
+
mergedRoute.name = overrideRoute.name;
|
|
23
|
+
if (overrideRoute.enabled !== undefined)
|
|
24
|
+
mergedRoute.enabled = overrideRoute.enabled;
|
|
25
|
+
if (overrideRoute.priority !== undefined)
|
|
26
|
+
mergedRoute.priority = overrideRoute.priority;
|
|
27
|
+
// Merge match configuration
|
|
28
|
+
if (overrideRoute.match) {
|
|
29
|
+
mergedRoute.match = { ...mergedRoute.match };
|
|
30
|
+
if (overrideRoute.match.ports !== undefined) {
|
|
31
|
+
mergedRoute.match.ports = overrideRoute.match.ports;
|
|
32
|
+
}
|
|
33
|
+
if (overrideRoute.match.domains !== undefined) {
|
|
34
|
+
mergedRoute.match.domains = overrideRoute.match.domains;
|
|
35
|
+
}
|
|
36
|
+
if (overrideRoute.match.path !== undefined) {
|
|
37
|
+
mergedRoute.match.path = overrideRoute.match.path;
|
|
38
|
+
}
|
|
39
|
+
if (overrideRoute.match.headers !== undefined) {
|
|
40
|
+
mergedRoute.match.headers = overrideRoute.match.headers;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Merge action configuration
|
|
44
|
+
if (overrideRoute.action) {
|
|
45
|
+
// If action types are different, replace the entire action
|
|
46
|
+
if (overrideRoute.action.type && overrideRoute.action.type !== mergedRoute.action.type) {
|
|
47
|
+
mergedRoute.action = JSON.parse(JSON.stringify(overrideRoute.action));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Otherwise merge the action properties
|
|
51
|
+
mergedRoute.action = { ...mergedRoute.action };
|
|
52
|
+
// Merge target
|
|
53
|
+
if (overrideRoute.action.target) {
|
|
54
|
+
mergedRoute.action.target = {
|
|
55
|
+
...mergedRoute.action.target,
|
|
56
|
+
...overrideRoute.action.target
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Merge TLS options
|
|
60
|
+
if (overrideRoute.action.tls) {
|
|
61
|
+
mergedRoute.action.tls = {
|
|
62
|
+
...mergedRoute.action.tls,
|
|
63
|
+
...overrideRoute.action.tls
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Merge redirect options
|
|
67
|
+
if (overrideRoute.action.redirect) {
|
|
68
|
+
mergedRoute.action.redirect = {
|
|
69
|
+
...mergedRoute.action.redirect,
|
|
70
|
+
...overrideRoute.action.redirect
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Merge static options
|
|
74
|
+
if (overrideRoute.action.static) {
|
|
75
|
+
mergedRoute.action.static = {
|
|
76
|
+
...mergedRoute.action.static,
|
|
77
|
+
...overrideRoute.action.static
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return mergedRoute;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if a route matches a domain
|
|
86
|
+
* @param route The route to check
|
|
87
|
+
* @param domain The domain to match against
|
|
88
|
+
* @returns True if the route matches the domain, false otherwise
|
|
89
|
+
*/
|
|
90
|
+
export function routeMatchesDomain(route, domain) {
|
|
91
|
+
if (!route.match?.domains) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const domains = Array.isArray(route.match.domains)
|
|
95
|
+
? route.match.domains
|
|
96
|
+
: [route.match.domains];
|
|
97
|
+
return domains.some(d => {
|
|
98
|
+
// Handle wildcard domains
|
|
99
|
+
if (d.startsWith('*.')) {
|
|
100
|
+
const suffix = d.substring(2);
|
|
101
|
+
return domain.endsWith(suffix) && domain.split('.').length > suffix.split('.').length;
|
|
102
|
+
}
|
|
103
|
+
return d.toLowerCase() === domain.toLowerCase();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if a route matches a port
|
|
108
|
+
* @param route The route to check
|
|
109
|
+
* @param port The port to match against
|
|
110
|
+
* @returns True if the route matches the port, false otherwise
|
|
111
|
+
*/
|
|
112
|
+
export function routeMatchesPort(route, port) {
|
|
113
|
+
if (!route.match?.ports) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
if (typeof route.match.ports === 'number') {
|
|
117
|
+
return route.match.ports === port;
|
|
118
|
+
}
|
|
119
|
+
if (Array.isArray(route.match.ports)) {
|
|
120
|
+
// Simple case - array of numbers
|
|
121
|
+
if (typeof route.match.ports[0] === 'number') {
|
|
122
|
+
return route.match.ports.includes(port);
|
|
123
|
+
}
|
|
124
|
+
// Complex case - array of port ranges
|
|
125
|
+
if (typeof route.match.ports[0] === 'object') {
|
|
126
|
+
return route.match.ports.some(range => port >= range.from && port <= range.to);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check if a route matches a path
|
|
133
|
+
* @param route The route to check
|
|
134
|
+
* @param path The path to match against
|
|
135
|
+
* @returns True if the route matches the path, false otherwise
|
|
136
|
+
*/
|
|
137
|
+
export function routeMatchesPath(route, path) {
|
|
138
|
+
if (!route.match?.path) {
|
|
139
|
+
return true; // No path specified means it matches any path
|
|
140
|
+
}
|
|
141
|
+
// Handle exact path
|
|
142
|
+
if (route.match.path === path) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
// Handle path prefix with trailing slash (e.g., /api/)
|
|
146
|
+
if (route.match.path.endsWith('/') && path.startsWith(route.match.path)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
// Handle exact path match without trailing slash
|
|
150
|
+
if (!route.match.path.endsWith('/') && path === route.match.path) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
// Handle wildcard paths (e.g., /api/*)
|
|
154
|
+
if (route.match.path.endsWith('*')) {
|
|
155
|
+
const prefix = route.match.path.slice(0, -1);
|
|
156
|
+
return path.startsWith(prefix);
|
|
157
|
+
}
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if a route matches headers
|
|
162
|
+
* @param route The route to check
|
|
163
|
+
* @param headers The headers to match against
|
|
164
|
+
* @returns True if the route matches the headers, false otherwise
|
|
165
|
+
*/
|
|
166
|
+
export function routeMatchesHeaders(route, headers) {
|
|
167
|
+
if (!route.match?.headers || Object.keys(route.match.headers).length === 0) {
|
|
168
|
+
return true; // No headers specified means it matches any headers
|
|
169
|
+
}
|
|
170
|
+
// Check each header in the route's match criteria
|
|
171
|
+
return Object.entries(route.match.headers).every(([key, value]) => {
|
|
172
|
+
// If the header isn't present in the request, it doesn't match
|
|
173
|
+
if (!headers[key]) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
// Handle exact match
|
|
177
|
+
if (typeof value === 'string') {
|
|
178
|
+
return headers[key] === value;
|
|
179
|
+
}
|
|
180
|
+
// Handle regex match
|
|
181
|
+
if (value instanceof RegExp) {
|
|
182
|
+
return value.test(headers[key]);
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Find all routes that match the given criteria
|
|
189
|
+
* @param routes Array of routes to search
|
|
190
|
+
* @param criteria Matching criteria
|
|
191
|
+
* @returns Array of matching routes sorted by priority
|
|
192
|
+
*/
|
|
193
|
+
export function findMatchingRoutes(routes, criteria) {
|
|
194
|
+
// Filter routes that are enabled and match all provided criteria
|
|
195
|
+
const matchingRoutes = routes.filter(route => {
|
|
196
|
+
// Skip disabled routes
|
|
197
|
+
if (route.enabled === false) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
// Check domain match if specified
|
|
201
|
+
if (criteria.domain && !routeMatchesDomain(route, criteria.domain)) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
// Check port match if specified
|
|
205
|
+
if (criteria.port !== undefined && !routeMatchesPort(route, criteria.port)) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
// Check path match if specified
|
|
209
|
+
if (criteria.path && !routeMatchesPath(route, criteria.path)) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// Check headers match if specified
|
|
213
|
+
if (criteria.headers && !routeMatchesHeaders(route, criteria.headers)) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
return true;
|
|
217
|
+
});
|
|
218
|
+
// Sort matching routes by priority (higher priority first)
|
|
219
|
+
return matchingRoutes.sort((a, b) => {
|
|
220
|
+
const priorityA = a.priority || 0;
|
|
221
|
+
const priorityB = b.priority || 0;
|
|
222
|
+
return priorityB - priorityA; // Higher priority first
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Find the best matching route for the given criteria
|
|
227
|
+
* @param routes Array of routes to search
|
|
228
|
+
* @param criteria Matching criteria
|
|
229
|
+
* @returns The best matching route or undefined if no match
|
|
230
|
+
*/
|
|
231
|
+
export function findBestMatchingRoute(routes, criteria) {
|
|
232
|
+
const matchingRoutes = findMatchingRoutes(routes, criteria);
|
|
233
|
+
return matchingRoutes.length > 0 ? matchingRoutes[0] : undefined;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Create a route ID based on route properties
|
|
237
|
+
* @param route Route configuration
|
|
238
|
+
* @returns Generated route ID
|
|
239
|
+
*/
|
|
240
|
+
export function generateRouteId(route) {
|
|
241
|
+
// Create a deterministic ID based on route properties
|
|
242
|
+
const domains = Array.isArray(route.match?.domains)
|
|
243
|
+
? route.match.domains.join('-')
|
|
244
|
+
: route.match?.domains || 'any';
|
|
245
|
+
let portsStr = 'any';
|
|
246
|
+
if (route.match?.ports) {
|
|
247
|
+
if (Array.isArray(route.match.ports)) {
|
|
248
|
+
portsStr = route.match.ports.join('-');
|
|
249
|
+
}
|
|
250
|
+
else if (typeof route.match.ports === 'number') {
|
|
251
|
+
portsStr = route.match.ports.toString();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const path = route.match?.path || 'any';
|
|
255
|
+
const action = route.action?.type || 'unknown';
|
|
256
|
+
return `route-${domains}-${portsStr}-${path}-${action}`.replace(/[^a-zA-Z0-9-]/g, '-');
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Clone a route configuration
|
|
260
|
+
* @param route Route to clone
|
|
261
|
+
* @returns Deep copy of the route
|
|
262
|
+
*/
|
|
263
|
+
export function cloneRoute(route) {
|
|
264
|
+
return JSON.parse(JSON.stringify(route));
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUF1QixFQUN2QixhQUFvQztJQUVwQyx5REFBeUQ7SUFDekQsTUFBTSxXQUFXLEdBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhFLG1DQUFtQztJQUNuQyxJQUFJLGFBQWEsQ0FBQyxFQUFFO1FBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLElBQUk7UUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckYsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFFeEYsNEJBQTRCO0lBQzVCLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3BELENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLDJEQUEyRDtRQUMzRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkYsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQzthQUFNLENBQUM7WUFDTix3Q0FBd0M7WUFDeEMsV0FBVyxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRS9DLGVBQWU7WUFDZixJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHO29CQUMxQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTTtvQkFDNUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU07aUJBQy9CLENBQUM7WUFDSixDQUFDO1lBRUQsb0JBQW9CO1lBQ3BCLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUc7b0JBQ3ZCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHO29CQUN6QixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRztpQkFDNUIsQ0FBQztZQUNKLENBQUM7WUFFRCx5QkFBeUI7WUFDekIsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRztvQkFDNUIsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVE7b0JBQzlCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztZQUVELHVCQUF1QjtZQUN2QixJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHO29CQUMxQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTTtvQkFDNUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU07aUJBQy9CLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBbUIsRUFBRSxNQUFjO0lBQ3BFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDaEQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTztRQUNyQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTFCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN0QiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEYsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFtQixFQUFFLElBQVk7SUFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLGlDQUFpQztRQUNqQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0MsT0FBUSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdDLE9BQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUE2QyxDQUFDLElBQUksQ0FDcEUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FDaEQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBbUIsRUFBRSxJQUFZO0lBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLENBQUMsOENBQThDO0lBQzdELENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1CLEVBQ25CLE9BQStCO0lBRS9CLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNFLE9BQU8sSUFBSSxDQUFDLENBQUMsb0RBQW9EO0lBQ25FLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUNoRSwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUNoQyxDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBc0IsRUFDdEIsUUFLQztJQUVELGlFQUFpRTtJQUNqRSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzNDLHVCQUF1QjtRQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUVILDJEQUEyRDtJQUMzRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7UUFDbEMsT0FBTyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsd0JBQXdCO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUFzQixFQUN0QixRQUtDO0lBRUQsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVELE9BQU8sY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ25FLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFtQjtJQUNqRCxzREFBc0Q7SUFDdEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUNqRCxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUMvQixDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO0lBRWxDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDakQsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksS0FBSyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztJQUUvQyxPQUFPLFNBQVMsT0FBTyxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFtQjtJQUM1QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMifQ==
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Validators
|
|
3
|
+
*
|
|
4
|
+
* This file provides utility functions for validating route configurations.
|
|
5
|
+
* These validators help ensure that route configurations are valid and correctly structured.
|
|
6
|
+
*/
|
|
7
|
+
import type { IRouteConfig, IRouteMatch, IRouteAction, TPortRange } from '../models/route-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Validates a port range or port number
|
|
10
|
+
* @param port Port number or port range
|
|
11
|
+
* @returns True if valid, false otherwise
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidPort(port: TPortRange): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Validates a domain string
|
|
16
|
+
* @param domain Domain string to validate
|
|
17
|
+
* @returns True if valid, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
export declare function isValidDomain(domain: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Validates a route match configuration
|
|
22
|
+
* @param match Route match configuration to validate
|
|
23
|
+
* @returns { valid: boolean, errors: string[] } Validation result
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateRouteMatch(match: IRouteMatch): {
|
|
26
|
+
valid: boolean;
|
|
27
|
+
errors: string[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Validates a route action configuration
|
|
31
|
+
* @param action Route action configuration to validate
|
|
32
|
+
* @returns { valid: boolean, errors: string[] } Validation result
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateRouteAction(action: IRouteAction): {
|
|
35
|
+
valid: boolean;
|
|
36
|
+
errors: string[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Validates a complete route configuration
|
|
40
|
+
* @param route Route configuration to validate
|
|
41
|
+
* @returns { valid: boolean, errors: string[] } Validation result
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateRouteConfig(route: IRouteConfig): {
|
|
44
|
+
valid: boolean;
|
|
45
|
+
errors: string[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Validate an array of route configurations
|
|
49
|
+
* @param routes Array of route configurations to validate
|
|
50
|
+
* @returns { valid: boolean, errors: { index: number, errors: string[] }[] } Validation result
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateRoutes(routes: IRouteConfig[]): {
|
|
53
|
+
valid: boolean;
|
|
54
|
+
errors: {
|
|
55
|
+
index: number;
|
|
56
|
+
errors: string[];
|
|
57
|
+
}[];
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Check if a route configuration has the required properties for a specific action type
|
|
61
|
+
* @param route Route configuration to check
|
|
62
|
+
* @param actionType Expected action type
|
|
63
|
+
* @returns True if the route has the necessary properties, false otherwise
|
|
64
|
+
*/
|
|
65
|
+
export declare function hasRequiredPropertiesForAction(route: IRouteConfig, actionType: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Throws an error if the route config is invalid, returns the config if valid
|
|
68
|
+
* Useful for immediate validation when creating routes
|
|
69
|
+
* @param route Route configuration to validate
|
|
70
|
+
* @returns The validated route configuration
|
|
71
|
+
* @throws Error if the route configuration is invalid
|
|
72
|
+
*/
|
|
73
|
+
export declare function assertValidRoute(route: IRouteConfig): IRouteConfig;
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Validators
|
|
3
|
+
*
|
|
4
|
+
* This file provides utility functions for validating route configurations.
|
|
5
|
+
* These validators help ensure that route configurations are valid and correctly structured.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validates a port range or port number
|
|
9
|
+
* @param port Port number or port range
|
|
10
|
+
* @returns True if valid, false otherwise
|
|
11
|
+
*/
|
|
12
|
+
export function isValidPort(port) {
|
|
13
|
+
if (typeof port === 'number') {
|
|
14
|
+
return port > 0 && port < 65536; // Valid port range is 1-65535
|
|
15
|
+
}
|
|
16
|
+
else if (Array.isArray(port)) {
|
|
17
|
+
return port.every(p => typeof p === 'number' && p > 0 && p < 65536);
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validates a domain string
|
|
23
|
+
* @param domain Domain string to validate
|
|
24
|
+
* @returns True if valid, false otherwise
|
|
25
|
+
*/
|
|
26
|
+
export function isValidDomain(domain) {
|
|
27
|
+
// Basic domain validation regex - allows wildcards (*.example.com)
|
|
28
|
+
const domainRegex = /^(\*\.)?([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
|
|
29
|
+
return domainRegex.test(domain);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validates a route match configuration
|
|
33
|
+
* @param match Route match configuration to validate
|
|
34
|
+
* @returns { valid: boolean, errors: string[] } Validation result
|
|
35
|
+
*/
|
|
36
|
+
export function validateRouteMatch(match) {
|
|
37
|
+
const errors = [];
|
|
38
|
+
// Validate ports
|
|
39
|
+
if (match.ports !== undefined) {
|
|
40
|
+
if (!isValidPort(match.ports)) {
|
|
41
|
+
errors.push('Invalid port number or port range in match.ports');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Validate domains
|
|
45
|
+
if (match.domains !== undefined) {
|
|
46
|
+
if (typeof match.domains === 'string') {
|
|
47
|
+
if (!isValidDomain(match.domains)) {
|
|
48
|
+
errors.push(`Invalid domain format: ${match.domains}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (Array.isArray(match.domains)) {
|
|
52
|
+
for (const domain of match.domains) {
|
|
53
|
+
if (!isValidDomain(domain)) {
|
|
54
|
+
errors.push(`Invalid domain format: ${domain}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
errors.push('Domains must be a string or an array of strings');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Validate path
|
|
63
|
+
if (match.path !== undefined) {
|
|
64
|
+
if (typeof match.path !== 'string' || !match.path.startsWith('/')) {
|
|
65
|
+
errors.push('Path must be a string starting with /');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
valid: errors.length === 0,
|
|
70
|
+
errors
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validates a route action configuration
|
|
75
|
+
* @param action Route action configuration to validate
|
|
76
|
+
* @returns { valid: boolean, errors: string[] } Validation result
|
|
77
|
+
*/
|
|
78
|
+
export function validateRouteAction(action) {
|
|
79
|
+
const errors = [];
|
|
80
|
+
// Validate action type
|
|
81
|
+
if (!action.type) {
|
|
82
|
+
errors.push('Action type is required');
|
|
83
|
+
}
|
|
84
|
+
else if (!['forward', 'redirect', 'static', 'block'].includes(action.type)) {
|
|
85
|
+
errors.push(`Invalid action type: ${action.type}`);
|
|
86
|
+
}
|
|
87
|
+
// Validate target for 'forward' action
|
|
88
|
+
if (action.type === 'forward') {
|
|
89
|
+
if (!action.target) {
|
|
90
|
+
errors.push('Target is required for forward action');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Validate target host
|
|
94
|
+
if (!action.target.host) {
|
|
95
|
+
errors.push('Target host is required');
|
|
96
|
+
}
|
|
97
|
+
// Validate target port
|
|
98
|
+
if (!action.target.port || !isValidPort(action.target.port)) {
|
|
99
|
+
errors.push('Valid target port is required');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Validate TLS options for forward actions
|
|
103
|
+
if (action.tls) {
|
|
104
|
+
if (!['passthrough', 'terminate', 'terminate-and-reencrypt'].includes(action.tls.mode)) {
|
|
105
|
+
errors.push(`Invalid TLS mode: ${action.tls.mode}`);
|
|
106
|
+
}
|
|
107
|
+
// For termination modes, validate certificate
|
|
108
|
+
if (['terminate', 'terminate-and-reencrypt'].includes(action.tls.mode)) {
|
|
109
|
+
if (action.tls.certificate !== 'auto' &&
|
|
110
|
+
(!action.tls.certificate || !action.tls.certificate.key || !action.tls.certificate.cert)) {
|
|
111
|
+
errors.push('Certificate must be "auto" or an object with key and cert properties');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Validate redirect for 'redirect' action
|
|
117
|
+
if (action.type === 'redirect') {
|
|
118
|
+
if (!action.redirect) {
|
|
119
|
+
errors.push('Redirect configuration is required for redirect action');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (!action.redirect.to) {
|
|
123
|
+
errors.push('Redirect target (to) is required');
|
|
124
|
+
}
|
|
125
|
+
if (action.redirect.status &&
|
|
126
|
+
![301, 302, 303, 307, 308].includes(action.redirect.status)) {
|
|
127
|
+
errors.push('Invalid redirect status code');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Validate static file config for 'static' action
|
|
132
|
+
if (action.type === 'static') {
|
|
133
|
+
if (!action.static) {
|
|
134
|
+
errors.push('Static file configuration is required for static action');
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (!action.static.root) {
|
|
138
|
+
errors.push('Static file root directory is required');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
valid: errors.length === 0,
|
|
144
|
+
errors
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validates a complete route configuration
|
|
149
|
+
* @param route Route configuration to validate
|
|
150
|
+
* @returns { valid: boolean, errors: string[] } Validation result
|
|
151
|
+
*/
|
|
152
|
+
export function validateRouteConfig(route) {
|
|
153
|
+
const errors = [];
|
|
154
|
+
// Check for required properties
|
|
155
|
+
if (!route.match) {
|
|
156
|
+
errors.push('Route match configuration is required');
|
|
157
|
+
}
|
|
158
|
+
if (!route.action) {
|
|
159
|
+
errors.push('Route action configuration is required');
|
|
160
|
+
}
|
|
161
|
+
// Validate match configuration
|
|
162
|
+
if (route.match) {
|
|
163
|
+
const matchValidation = validateRouteMatch(route.match);
|
|
164
|
+
if (!matchValidation.valid) {
|
|
165
|
+
errors.push(...matchValidation.errors.map(err => `Match: ${err}`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Validate action configuration
|
|
169
|
+
if (route.action) {
|
|
170
|
+
const actionValidation = validateRouteAction(route.action);
|
|
171
|
+
if (!actionValidation.valid) {
|
|
172
|
+
errors.push(...actionValidation.errors.map(err => `Action: ${err}`));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Ensure the route has a unique identifier
|
|
176
|
+
if (!route.id && !route.name) {
|
|
177
|
+
errors.push('Route should have either an id or a name for identification');
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
valid: errors.length === 0,
|
|
181
|
+
errors
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Validate an array of route configurations
|
|
186
|
+
* @param routes Array of route configurations to validate
|
|
187
|
+
* @returns { valid: boolean, errors: { index: number, errors: string[] }[] } Validation result
|
|
188
|
+
*/
|
|
189
|
+
export function validateRoutes(routes) {
|
|
190
|
+
const results = [];
|
|
191
|
+
routes.forEach((route, index) => {
|
|
192
|
+
const validation = validateRouteConfig(route);
|
|
193
|
+
if (!validation.valid) {
|
|
194
|
+
results.push({
|
|
195
|
+
index,
|
|
196
|
+
errors: validation.errors
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
return {
|
|
201
|
+
valid: results.length === 0,
|
|
202
|
+
errors: results
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if a route configuration has the required properties for a specific action type
|
|
207
|
+
* @param route Route configuration to check
|
|
208
|
+
* @param actionType Expected action type
|
|
209
|
+
* @returns True if the route has the necessary properties, false otherwise
|
|
210
|
+
*/
|
|
211
|
+
export function hasRequiredPropertiesForAction(route, actionType) {
|
|
212
|
+
if (!route.action || route.action.type !== actionType) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
switch (actionType) {
|
|
216
|
+
case 'forward':
|
|
217
|
+
return !!route.action.target && !!route.action.target.host && !!route.action.target.port;
|
|
218
|
+
case 'redirect':
|
|
219
|
+
return !!route.action.redirect && !!route.action.redirect.to;
|
|
220
|
+
case 'static':
|
|
221
|
+
return !!route.action.static && !!route.action.static.root;
|
|
222
|
+
case 'block':
|
|
223
|
+
return true; // Block action doesn't require additional properties
|
|
224
|
+
default:
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Throws an error if the route config is invalid, returns the config if valid
|
|
230
|
+
* Useful for immediate validation when creating routes
|
|
231
|
+
* @param route Route configuration to validate
|
|
232
|
+
* @returns The validated route configuration
|
|
233
|
+
* @throws Error if the route configuration is invalid
|
|
234
|
+
*/
|
|
235
|
+
export function assertValidRoute(route) {
|
|
236
|
+
const validation = validateRouteConfig(route);
|
|
237
|
+
if (!validation.valid) {
|
|
238
|
+
throw new Error(`Invalid route configuration: ${validation.errors.join(', ')}`);
|
|
239
|
+
}
|
|
240
|
+
return route;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvdXRpbHMvcm91dGUtdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUlIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQWdCO0lBQzFDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyw4QkFBOEI7SUFDakUsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBYztJQUMxQyxtRUFBbUU7SUFDbkUsTUFBTSxXQUFXLEdBQUcsd0VBQXdFLENBQUM7SUFDN0YsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWtCO0lBQ25ELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUU1QixpQkFBaUI7SUFDakIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUks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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartproxy",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "16.0.2",
|
|
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",
|