@push.rocks/smartproxy 19.5.18 → 19.5.20
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 +2 -2
- package/dist_ts/core/models/index.d.ts +2 -0
- package/dist_ts/core/models/index.js +3 -1
- package/dist_ts/core/models/socket-types.d.ts +14 -0
- package/dist_ts/core/models/socket-types.js +15 -0
- package/dist_ts/core/models/wrapped-socket.d.ts +34 -0
- package/dist_ts/core/models/wrapped-socket.js +82 -0
- package/dist_ts/core/routing/index.d.ts +11 -0
- package/dist_ts/core/routing/index.js +17 -0
- package/dist_ts/core/routing/matchers/domain.d.ts +34 -0
- package/dist_ts/core/routing/matchers/domain.js +91 -0
- package/dist_ts/core/routing/matchers/header.d.ts +32 -0
- package/dist_ts/core/routing/matchers/header.js +94 -0
- package/dist_ts/core/routing/matchers/index.d.ts +18 -0
- package/dist_ts/core/routing/matchers/index.js +20 -0
- package/dist_ts/core/routing/matchers/ip.d.ts +53 -0
- package/dist_ts/core/routing/matchers/ip.js +169 -0
- package/dist_ts/core/routing/matchers/path.d.ts +44 -0
- package/dist_ts/core/routing/matchers/path.js +148 -0
- package/dist_ts/core/routing/route-manager.d.ts +88 -0
- package/dist_ts/core/routing/route-manager.js +342 -0
- package/dist_ts/core/routing/route-utils.d.ts +28 -0
- package/dist_ts/core/routing/route-utils.js +67 -0
- package/dist_ts/core/routing/specificity.d.ts +30 -0
- package/dist_ts/core/routing/specificity.js +115 -0
- package/dist_ts/core/routing/types.d.ts +41 -0
- package/dist_ts/core/routing/types.js +5 -0
- package/dist_ts/core/utils/index.d.ts +0 -2
- package/dist_ts/core/utils/index.js +1 -3
- package/dist_ts/core/utils/route-manager.d.ts +0 -30
- package/dist_ts/core/utils/route-manager.js +6 -47
- package/dist_ts/core/utils/route-utils.d.ts +2 -68
- package/dist_ts/core/utils/route-utils.js +21 -218
- package/dist_ts/core/utils/security-utils.js +4 -4
- package/dist_ts/core/utils/socket-utils.d.ts +0 -15
- package/dist_ts/core/utils/socket-utils.js +1 -35
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +47 -32
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +51 -32
- package/dist_ts/index.d.ts +2 -5
- package/dist_ts/index.js +5 -11
- package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -1
- package/dist_ts/proxies/http-proxy/http-proxy.js +15 -60
- package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -90
- package/dist_ts/proxies/http-proxy/models/types.js +1 -242
- package/dist_ts/proxies/http-proxy/request-handler.d.ts +3 -5
- package/dist_ts/proxies/http-proxy/request-handler.js +20 -171
- package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +2 -5
- package/dist_ts/proxies/http-proxy/websocket-handler.js +15 -23
- package/dist_ts/proxies/index.d.ts +2 -2
- package/dist_ts/proxies/index.js +4 -3
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +3 -1
- package/dist_ts/proxies/smart-proxy/connection-manager.js +15 -7
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +2 -1
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +5 -2
- package/dist_ts/proxies/smart-proxy/index.d.ts +1 -1
- package/dist_ts/proxies/smart-proxy/index.js +2 -2
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +6 -2
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +1 -1
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +48 -25
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +1 -1
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +15 -4
- package/dist_ts/proxies/smart-proxy/utils/route-utils.js +10 -43
- package/dist_ts/routing/router/http-router.d.ts +89 -0
- package/dist_ts/routing/router/http-router.js +205 -0
- package/dist_ts/routing/router/index.d.ts +2 -5
- package/dist_ts/routing/router/index.js +3 -4
- package/package.json +1 -1
- package/readme.delete.md +187 -0
- package/readme.hints.md +210 -1
- package/readme.plan.md +621 -0
- package/readme.routing.md +341 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/models/index.ts +2 -0
- package/ts/core/models/socket-types.ts +21 -0
- package/ts/core/models/wrapped-socket.ts +99 -0
- package/ts/core/routing/index.ts +21 -0
- package/ts/core/routing/matchers/domain.ts +119 -0
- package/ts/core/routing/matchers/header.ts +120 -0
- package/ts/core/routing/matchers/index.ts +22 -0
- package/ts/core/routing/matchers/ip.ts +207 -0
- package/ts/core/routing/matchers/path.ts +184 -0
- package/ts/core/{utils → routing}/route-manager.ts +7 -57
- package/ts/core/routing/route-utils.ts +88 -0
- package/ts/core/routing/specificity.ts +141 -0
- package/ts/core/routing/types.ts +49 -0
- package/ts/core/utils/index.ts +0 -2
- package/ts/core/utils/security-utils.ts +3 -7
- package/ts/core/utils/socket-utils.ts +0 -44
- package/ts/forwarding/handlers/https-terminate-to-http-handler.ts +47 -33
- package/ts/forwarding/handlers/https-terminate-to-https-handler.ts +55 -35
- package/ts/index.ts +4 -14
- package/ts/proxies/http-proxy/http-proxy.ts +13 -68
- package/ts/proxies/http-proxy/models/types.ts +0 -324
- package/ts/proxies/http-proxy/request-handler.ts +15 -186
- package/ts/proxies/http-proxy/websocket-handler.ts +15 -26
- package/ts/proxies/index.ts +3 -2
- package/ts/proxies/smart-proxy/connection-manager.ts +15 -7
- package/ts/proxies/smart-proxy/http-proxy-bridge.ts +6 -2
- package/ts/proxies/smart-proxy/index.ts +1 -1
- package/ts/proxies/smart-proxy/models/interfaces.ts +8 -2
- package/ts/proxies/smart-proxy/route-connection-handler.ts +58 -30
- package/ts/proxies/smart-proxy/smart-proxy.ts +15 -3
- package/ts/proxies/smart-proxy/utils/route-utils.ts +11 -49
- package/ts/routing/router/http-router.ts +266 -0
- package/ts/routing/router/index.ts +3 -8
- package/readme.problems.md +0 -170
- package/ts/core/utils/route-utils.ts +0 -312
- package/ts/proxies/smart-proxy/route-manager.ts +0 -554
- package/ts/routing/router/proxy-router.ts +0 -437
- package/ts/routing/router/route-router.ts +0 -482
|
@@ -80,6 +80,7 @@ export function mergeRouteConfigs(baseRoute, overrideRoute) {
|
|
|
80
80
|
}
|
|
81
81
|
return mergedRoute;
|
|
82
82
|
}
|
|
83
|
+
import { DomainMatcher, PathMatcher, HeaderMatcher } from '../../../core/routing/matchers/index.js';
|
|
83
84
|
/**
|
|
84
85
|
* Check if a route matches a domain
|
|
85
86
|
* @param route The route to check
|
|
@@ -93,14 +94,7 @@ export function routeMatchesDomain(route, domain) {
|
|
|
93
94
|
const domains = Array.isArray(route.match.domains)
|
|
94
95
|
? route.match.domains
|
|
95
96
|
: [route.match.domains];
|
|
96
|
-
return domains.some(d =>
|
|
97
|
-
// Handle wildcard domains
|
|
98
|
-
if (d.startsWith('*.')) {
|
|
99
|
-
const suffix = d.substring(2);
|
|
100
|
-
return domain.endsWith(suffix) && domain.split('.').length > suffix.split('.').length;
|
|
101
|
-
}
|
|
102
|
-
return d.toLowerCase() === domain.toLowerCase();
|
|
103
|
-
});
|
|
97
|
+
return domains.some(d => DomainMatcher.match(d, domain));
|
|
104
98
|
}
|
|
105
99
|
/**
|
|
106
100
|
* Check if a route matches a port
|
|
@@ -137,24 +131,7 @@ export function routeMatchesPath(route, path) {
|
|
|
137
131
|
if (!route.match?.path) {
|
|
138
132
|
return true; // No path specified means it matches any path
|
|
139
133
|
}
|
|
140
|
-
|
|
141
|
-
if (route.match.path === path) {
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
// Handle path prefix with trailing slash (e.g., /api/)
|
|
145
|
-
if (route.match.path.endsWith('/') && path.startsWith(route.match.path)) {
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
// Handle exact path match without trailing slash
|
|
149
|
-
if (!route.match.path.endsWith('/') && path === route.match.path) {
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
// Handle wildcard paths (e.g., /api/*)
|
|
153
|
-
if (route.match.path.endsWith('*')) {
|
|
154
|
-
const prefix = route.match.path.slice(0, -1);
|
|
155
|
-
return path.startsWith(prefix);
|
|
156
|
-
}
|
|
157
|
-
return false;
|
|
134
|
+
return PathMatcher.match(route.match.path, path).matches;
|
|
158
135
|
}
|
|
159
136
|
/**
|
|
160
137
|
* Check if a route matches headers
|
|
@@ -166,22 +143,12 @@ export function routeMatchesHeaders(route, headers) {
|
|
|
166
143
|
if (!route.match?.headers || Object.keys(route.match.headers).length === 0) {
|
|
167
144
|
return true; // No headers specified means it matches any headers
|
|
168
145
|
}
|
|
169
|
-
//
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
// Handle exact match
|
|
176
|
-
if (typeof value === 'string') {
|
|
177
|
-
return headers[key] === value;
|
|
178
|
-
}
|
|
179
|
-
// Handle regex match
|
|
180
|
-
if (value instanceof RegExp) {
|
|
181
|
-
return value.test(headers[key]);
|
|
182
|
-
}
|
|
183
|
-
return false;
|
|
184
|
-
});
|
|
146
|
+
// Convert RegExp patterns to strings for HeaderMatcher
|
|
147
|
+
const stringHeaders = {};
|
|
148
|
+
for (const [key, value] of Object.entries(route.match.headers)) {
|
|
149
|
+
stringHeaders[key] = value instanceof RegExp ? value.source : value;
|
|
150
|
+
}
|
|
151
|
+
return HeaderMatcher.matchAll(stringHeaders, headers);
|
|
185
152
|
}
|
|
186
153
|
/**
|
|
187
154
|
* Find all routes that match the given criteria
|
|
@@ -262,4 +229,4 @@ export function generateRouteId(route) {
|
|
|
262
229
|
export function cloneRoute(route) {
|
|
263
230
|
return JSON.parse(JSON.stringify(route));
|
|
264
231
|
}
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUF1QixFQUN2QixhQUFvQztJQUVwQyx5REFBeUQ7SUFDekQsTUFBTSxXQUFXLEdBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhFLG1DQUFtQztJQUNuQyxJQUFJLGFBQWEsQ0FBQyxFQUFFO1FBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLElBQUk7UUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckYsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFFeEYsNEJBQTRCO0lBQzVCLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMs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
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUF1QixFQUN2QixhQUFvQztJQUVwQyx5REFBeUQ7SUFDekQsTUFBTSxXQUFXLEdBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhFLG1DQUFtQztJQUNuQyxJQUFJLGFBQWEsQ0FBQyxFQUFFO1FBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLElBQUk7UUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckYsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFFeEYsNEJBQTRCO0lBQzVCLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMs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QUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxLQUFLLENBQUM7SUFDeEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDO0lBRS9DLE9BQU8sU0FBUyxPQUFPLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDekYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQW1CO0lBQzVDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQyJ9
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { IRouteConfig } from '../../proxies/smart-proxy/models/route-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Interface for router result with additional metadata
|
|
5
|
+
*/
|
|
6
|
+
export interface RouterResult {
|
|
7
|
+
route: IRouteConfig;
|
|
8
|
+
pathMatch?: string;
|
|
9
|
+
pathParams?: Record<string, string>;
|
|
10
|
+
pathRemainder?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Logger interface for HttpRouter
|
|
14
|
+
*/
|
|
15
|
+
export interface ILogger {
|
|
16
|
+
debug?: (message: string, data?: any) => void;
|
|
17
|
+
info: (message: string, data?: any) => void;
|
|
18
|
+
warn: (message: string, data?: any) => void;
|
|
19
|
+
error: (message: string, data?: any) => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Unified HTTP Router for reverse proxy requests
|
|
23
|
+
*
|
|
24
|
+
* Domain matching patterns:
|
|
25
|
+
* - Exact matches: "example.com"
|
|
26
|
+
* - Wildcard subdomains: "*.example.com" (matches any subdomain of example.com)
|
|
27
|
+
* - TLD wildcards: "example.*" (matches example.com, example.org, etc.)
|
|
28
|
+
* - Complex wildcards: "*.lossless*" (matches any subdomain of any lossless domain)
|
|
29
|
+
* - Default fallback: "*" (matches any unmatched domain)
|
|
30
|
+
*
|
|
31
|
+
* Path pattern matching:
|
|
32
|
+
* - Exact path: "/api/users"
|
|
33
|
+
* - Wildcard paths: "/api/*"
|
|
34
|
+
* - Path parameters: "/users/:id/profile"
|
|
35
|
+
*/
|
|
36
|
+
export declare class HttpRouter {
|
|
37
|
+
private routes;
|
|
38
|
+
private defaultRoute?;
|
|
39
|
+
private logger;
|
|
40
|
+
constructor(routes?: IRouteConfig[], logger?: ILogger);
|
|
41
|
+
/**
|
|
42
|
+
* Sets a new set of routes
|
|
43
|
+
* @param routes Array of route configurations
|
|
44
|
+
*/
|
|
45
|
+
setRoutes(routes: IRouteConfig[]): void;
|
|
46
|
+
/**
|
|
47
|
+
* Routes a request based on hostname and path
|
|
48
|
+
* @param req The incoming HTTP request
|
|
49
|
+
* @returns The matching route or undefined if no match found
|
|
50
|
+
*/
|
|
51
|
+
routeReq(req: plugins.http.IncomingMessage): IRouteConfig | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Routes a request with detailed matching information
|
|
54
|
+
* @param req The incoming HTTP request
|
|
55
|
+
* @returns Detailed routing result including matched route and path information
|
|
56
|
+
*/
|
|
57
|
+
routeReqWithDetails(req: plugins.http.IncomingMessage): RouterResult | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Find the best matching route for a given hostname and path
|
|
60
|
+
*/
|
|
61
|
+
private findMatchingRoute;
|
|
62
|
+
/**
|
|
63
|
+
* Gets all currently active route configurations
|
|
64
|
+
* @returns Array of all active routes
|
|
65
|
+
*/
|
|
66
|
+
getRoutes(): IRouteConfig[];
|
|
67
|
+
/**
|
|
68
|
+
* Gets all hostnames that this router is configured to handle
|
|
69
|
+
* @returns Array of unique hostnames
|
|
70
|
+
*/
|
|
71
|
+
getHostnames(): string[];
|
|
72
|
+
/**
|
|
73
|
+
* Adds a single new route configuration
|
|
74
|
+
* @param route The route configuration to add
|
|
75
|
+
*/
|
|
76
|
+
addRoute(route: IRouteConfig): void;
|
|
77
|
+
/**
|
|
78
|
+
* Removes routes by domain pattern
|
|
79
|
+
* @param domain The domain pattern to remove routes for
|
|
80
|
+
* @returns Boolean indicating whether any routes were removed
|
|
81
|
+
*/
|
|
82
|
+
removeRoutesByDomain(domain: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Remove a specific route by reference
|
|
85
|
+
* @param route The route to remove
|
|
86
|
+
* @returns Boolean indicating if the route was found and removed
|
|
87
|
+
*/
|
|
88
|
+
removeRoute(route: IRouteConfig): boolean;
|
|
89
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { DomainMatcher, PathMatcher } from '../../core/routing/matchers/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Unified HTTP Router for reverse proxy requests
|
|
5
|
+
*
|
|
6
|
+
* Domain matching patterns:
|
|
7
|
+
* - Exact matches: "example.com"
|
|
8
|
+
* - Wildcard subdomains: "*.example.com" (matches any subdomain of example.com)
|
|
9
|
+
* - TLD wildcards: "example.*" (matches example.com, example.org, etc.)
|
|
10
|
+
* - Complex wildcards: "*.lossless*" (matches any subdomain of any lossless domain)
|
|
11
|
+
* - Default fallback: "*" (matches any unmatched domain)
|
|
12
|
+
*
|
|
13
|
+
* Path pattern matching:
|
|
14
|
+
* - Exact path: "/api/users"
|
|
15
|
+
* - Wildcard paths: "/api/*"
|
|
16
|
+
* - Path parameters: "/users/:id/profile"
|
|
17
|
+
*/
|
|
18
|
+
export class HttpRouter {
|
|
19
|
+
constructor(routes, logger) {
|
|
20
|
+
// Store routes sorted by priority
|
|
21
|
+
this.routes = [];
|
|
22
|
+
this.logger = logger || {
|
|
23
|
+
error: console.error.bind(console),
|
|
24
|
+
warn: console.warn.bind(console),
|
|
25
|
+
info: console.info.bind(console),
|
|
26
|
+
debug: console.debug?.bind(console)
|
|
27
|
+
};
|
|
28
|
+
if (routes) {
|
|
29
|
+
this.setRoutes(routes);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sets a new set of routes
|
|
34
|
+
* @param routes Array of route configurations
|
|
35
|
+
*/
|
|
36
|
+
setRoutes(routes) {
|
|
37
|
+
this.routes = [...routes];
|
|
38
|
+
// Sort routes by priority (higher priority first)
|
|
39
|
+
this.routes.sort((a, b) => {
|
|
40
|
+
const priorityA = a.priority ?? 0;
|
|
41
|
+
const priorityB = b.priority ?? 0;
|
|
42
|
+
return priorityB - priorityA;
|
|
43
|
+
});
|
|
44
|
+
// Find default route if any (route with "*" as domain)
|
|
45
|
+
this.defaultRoute = this.routes.find(route => {
|
|
46
|
+
const domains = Array.isArray(route.match.domains)
|
|
47
|
+
? route.match.domains
|
|
48
|
+
: route.match.domains ? [route.match.domains] : [];
|
|
49
|
+
return domains.includes('*');
|
|
50
|
+
});
|
|
51
|
+
const uniqueDomains = this.getHostnames();
|
|
52
|
+
this.logger.info(`HttpRouter initialized with ${this.routes.length} routes (${uniqueDomains.length} unique hosts)`);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Routes a request based on hostname and path
|
|
56
|
+
* @param req The incoming HTTP request
|
|
57
|
+
* @returns The matching route or undefined if no match found
|
|
58
|
+
*/
|
|
59
|
+
routeReq(req) {
|
|
60
|
+
const result = this.routeReqWithDetails(req);
|
|
61
|
+
return result ? result.route : undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Routes a request with detailed matching information
|
|
65
|
+
* @param req The incoming HTTP request
|
|
66
|
+
* @returns Detailed routing result including matched route and path information
|
|
67
|
+
*/
|
|
68
|
+
routeReqWithDetails(req) {
|
|
69
|
+
// Extract and validate host header
|
|
70
|
+
const originalHost = req.headers.host;
|
|
71
|
+
if (!originalHost) {
|
|
72
|
+
this.logger.error('No host header found in request');
|
|
73
|
+
return this.defaultRoute ? { route: this.defaultRoute } : undefined;
|
|
74
|
+
}
|
|
75
|
+
// Parse URL for path matching
|
|
76
|
+
const parsedUrl = plugins.url.parse(req.url || '/');
|
|
77
|
+
const urlPath = parsedUrl.pathname || '/';
|
|
78
|
+
// Extract hostname without port
|
|
79
|
+
const hostWithoutPort = originalHost.split(':')[0].toLowerCase();
|
|
80
|
+
// Find matching route
|
|
81
|
+
const matchingRoute = this.findMatchingRoute(hostWithoutPort, urlPath);
|
|
82
|
+
if (matchingRoute) {
|
|
83
|
+
return matchingRoute;
|
|
84
|
+
}
|
|
85
|
+
// Fall back to default route if available
|
|
86
|
+
if (this.defaultRoute) {
|
|
87
|
+
this.logger.warn(`No specific route found for host: ${hostWithoutPort}, using default`);
|
|
88
|
+
return { route: this.defaultRoute };
|
|
89
|
+
}
|
|
90
|
+
this.logger.error(`No route found for host: ${hostWithoutPort}`);
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find the best matching route for a given hostname and path
|
|
95
|
+
*/
|
|
96
|
+
findMatchingRoute(hostname, path) {
|
|
97
|
+
// Try each route in priority order
|
|
98
|
+
for (const route of this.routes) {
|
|
99
|
+
// Skip disabled routes
|
|
100
|
+
if (route.enabled === false) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Check domain match
|
|
104
|
+
if (route.match.domains) {
|
|
105
|
+
const domains = Array.isArray(route.match.domains)
|
|
106
|
+
? route.match.domains
|
|
107
|
+
: [route.match.domains];
|
|
108
|
+
// Check if any domain pattern matches
|
|
109
|
+
const domainMatches = domains.some(domain => DomainMatcher.match(domain, hostname));
|
|
110
|
+
if (!domainMatches) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Check path match if specified
|
|
115
|
+
if (route.match.path) {
|
|
116
|
+
const pathResult = PathMatcher.match(route.match.path, path);
|
|
117
|
+
if (pathResult.matches) {
|
|
118
|
+
return {
|
|
119
|
+
route,
|
|
120
|
+
pathMatch: path,
|
|
121
|
+
pathParams: pathResult.params,
|
|
122
|
+
pathRemainder: pathResult.pathRemainder
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// No path specified, so domain match is sufficient
|
|
128
|
+
return { route };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Gets all currently active route configurations
|
|
135
|
+
* @returns Array of all active routes
|
|
136
|
+
*/
|
|
137
|
+
getRoutes() {
|
|
138
|
+
return [...this.routes];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Gets all hostnames that this router is configured to handle
|
|
142
|
+
* @returns Array of unique hostnames
|
|
143
|
+
*/
|
|
144
|
+
getHostnames() {
|
|
145
|
+
const hostnames = new Set();
|
|
146
|
+
for (const route of this.routes) {
|
|
147
|
+
if (!route.match.domains)
|
|
148
|
+
continue;
|
|
149
|
+
const domains = Array.isArray(route.match.domains)
|
|
150
|
+
? route.match.domains
|
|
151
|
+
: [route.match.domains];
|
|
152
|
+
for (const domain of domains) {
|
|
153
|
+
if (domain !== '*') {
|
|
154
|
+
hostnames.add(domain.toLowerCase());
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return Array.from(hostnames);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Adds a single new route configuration
|
|
162
|
+
* @param route The route configuration to add
|
|
163
|
+
*/
|
|
164
|
+
addRoute(route) {
|
|
165
|
+
this.routes.push(route);
|
|
166
|
+
// Re-sort routes by priority
|
|
167
|
+
this.routes.sort((a, b) => {
|
|
168
|
+
const priorityA = a.priority ?? 0;
|
|
169
|
+
const priorityB = b.priority ?? 0;
|
|
170
|
+
return priorityB - priorityA;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Removes routes by domain pattern
|
|
175
|
+
* @param domain The domain pattern to remove routes for
|
|
176
|
+
* @returns Boolean indicating whether any routes were removed
|
|
177
|
+
*/
|
|
178
|
+
removeRoutesByDomain(domain) {
|
|
179
|
+
const initialCount = this.routes.length;
|
|
180
|
+
// Filter out routes that match the domain
|
|
181
|
+
this.routes = this.routes.filter(route => {
|
|
182
|
+
if (!route.match.domains)
|
|
183
|
+
return true;
|
|
184
|
+
const domains = Array.isArray(route.match.domains)
|
|
185
|
+
? route.match.domains
|
|
186
|
+
: [route.match.domains];
|
|
187
|
+
return !domains.includes(domain);
|
|
188
|
+
});
|
|
189
|
+
return this.routes.length !== initialCount;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Remove a specific route by reference
|
|
193
|
+
* @param route The route to remove
|
|
194
|
+
* @returns Boolean indicating if the route was found and removed
|
|
195
|
+
*/
|
|
196
|
+
removeRoute(route) {
|
|
197
|
+
const index = this.routes.indexOf(route);
|
|
198
|
+
if (index !== -1) {
|
|
199
|
+
this.routes.splice(index, 1);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yb3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yb3V0aW5nL3JvdXRlci9odHRwLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUF1QmxGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFRckIsWUFDRSxNQUF1QixFQUN2QixNQUFnQjtRQVRsQixrQ0FBa0M7UUFDMUIsV0FBTSxHQUFtQixFQUFFLENBQUM7UUFVbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUk7WUFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2hDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDaEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNwQyxDQUFDO1FBRUYsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsTUFBc0I7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFFMUIsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FB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
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTTP routing
|
|
3
3
|
*/
|
|
4
|
-
export {
|
|
5
|
-
export type {
|
|
6
|
-
export type { PathPatternConfig as ProxyPathPatternConfig, RouterResult as ProxyRouterResult } from './proxy-router.js';
|
|
7
|
-
export { RouteRouter } from './route-router.js';
|
|
8
|
-
export type { PathPatternConfig as RoutePathPatternConfig, RouterResult as RouteRouterResult } from './route-router.js';
|
|
4
|
+
export { HttpRouter } from './http-router.js';
|
|
5
|
+
export type { RouterResult, ILogger } from './http-router.js';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTTP routing
|
|
3
3
|
*/
|
|
4
|
-
// Export
|
|
5
|
-
export {
|
|
6
|
-
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yb3V0aW5nL3JvdXRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILHFFQUFxRTtBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFLaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDIn0=
|
|
4
|
+
// Export the unified HttpRouter
|
|
5
|
+
export { HttpRouter } from './http-router.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yb3V0aW5nL3JvdXRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartproxy",
|
|
3
|
-
"version": "19.5.
|
|
3
|
+
"version": "19.5.20",
|
|
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.delete.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# SmartProxy Code Deletion Plan
|
|
2
|
+
|
|
3
|
+
This document tracks all code paths that can be deleted as part of the routing unification effort.
|
|
4
|
+
|
|
5
|
+
## Phase 1: Matching Logic Duplicates (READY TO DELETE)
|
|
6
|
+
|
|
7
|
+
### 1. Inline Matching Functions in RouteManager
|
|
8
|
+
**File**: `ts/proxies/smart-proxy/route-manager.ts`
|
|
9
|
+
**Lines**: Approximately lines 200-400
|
|
10
|
+
**Duplicates**:
|
|
11
|
+
- `matchDomain()` method - duplicate of DomainMatcher
|
|
12
|
+
- `matchPath()` method - duplicate of PathMatcher
|
|
13
|
+
- `matchIpPattern()` method - duplicate of IpMatcher
|
|
14
|
+
- `matchHeaders()` method - duplicate of HeaderMatcher
|
|
15
|
+
**Action**: Update to use unified matchers from `ts/core/routing/matchers/`
|
|
16
|
+
|
|
17
|
+
### 2. Duplicate Matching in Core route-utils
|
|
18
|
+
**File**: `ts/core/utils/route-utils.ts`
|
|
19
|
+
**Functions to update**:
|
|
20
|
+
- `matchDomain()` → Use DomainMatcher.match()
|
|
21
|
+
- `matchPath()` → Use PathMatcher.match()
|
|
22
|
+
- `matchIpPattern()` → Use IpMatcher.match()
|
|
23
|
+
- `matchHeader()` → Use HeaderMatcher.match()
|
|
24
|
+
**Action**: Update to use unified matchers, keep only unique utilities
|
|
25
|
+
|
|
26
|
+
## Phase 2: Route Manager Duplicates (READY AFTER MIGRATION)
|
|
27
|
+
|
|
28
|
+
### 1. SmartProxy RouteManager
|
|
29
|
+
**File**: `ts/proxies/smart-proxy/route-manager.ts`
|
|
30
|
+
**Entire file**: ~500 lines
|
|
31
|
+
**Reason**: 95% duplicate of SharedRouteManager
|
|
32
|
+
**Migration Required**:
|
|
33
|
+
- Update SmartProxy to use SharedRouteManager
|
|
34
|
+
- Update all imports
|
|
35
|
+
- Test thoroughly
|
|
36
|
+
**Action**: DELETE entire file after migration
|
|
37
|
+
|
|
38
|
+
### 2. Deprecated Methods in SharedRouteManager
|
|
39
|
+
**File**: `ts/core/utils/route-manager.ts`
|
|
40
|
+
**Methods**:
|
|
41
|
+
- Any deprecated security check methods
|
|
42
|
+
- Legacy compatibility methods
|
|
43
|
+
**Action**: Remove after confirming no usage
|
|
44
|
+
|
|
45
|
+
## Phase 3: Router Consolidation (REQUIRES REFACTORING)
|
|
46
|
+
|
|
47
|
+
### 1. ProxyRouter vs RouteRouter Duplication
|
|
48
|
+
**Files**:
|
|
49
|
+
- `ts/routing/router/proxy-router.ts` (~250 lines)
|
|
50
|
+
- `ts/routing/router/route-router.ts` (~250 lines)
|
|
51
|
+
**Reason**: Nearly identical implementations
|
|
52
|
+
**Plan**: Merge into single HttpRouter with legacy adapter
|
|
53
|
+
**Action**: DELETE one file after consolidation
|
|
54
|
+
|
|
55
|
+
### 2. Inline Route Matching in HttpProxy
|
|
56
|
+
**Location**: Various files in `ts/proxies/http-proxy/`
|
|
57
|
+
**Pattern**: Direct route matching without using RouteManager
|
|
58
|
+
**Action**: Update to use SharedRouteManager
|
|
59
|
+
|
|
60
|
+
## Phase 4: Scattered Utilities (CLEANUP)
|
|
61
|
+
|
|
62
|
+
### 1. Duplicate Route Utilities
|
|
63
|
+
**Files with duplicate logic**:
|
|
64
|
+
- `ts/proxies/smart-proxy/utils/route-utils.ts` - Keep (different purpose)
|
|
65
|
+
- `ts/proxies/smart-proxy/utils/route-validators.ts` - Review for duplicates
|
|
66
|
+
- `ts/proxies/smart-proxy/utils/route-patterns.ts` - Review for consolidation
|
|
67
|
+
|
|
68
|
+
### 2. Legacy Type Definitions
|
|
69
|
+
**Review for removal**:
|
|
70
|
+
- Old route type definitions
|
|
71
|
+
- Deprecated configuration interfaces
|
|
72
|
+
- Unused type exports
|
|
73
|
+
|
|
74
|
+
## Deletion Progress Tracker
|
|
75
|
+
|
|
76
|
+
### Completed Deletions
|
|
77
|
+
- [x] Phase 1: Matching logic consolidation (Partial)
|
|
78
|
+
- Updated core/utils/route-utils.ts to use unified matchers
|
|
79
|
+
- Removed duplicate matching implementations (~200 lines)
|
|
80
|
+
- Marked functions as deprecated with migration path
|
|
81
|
+
- [x] Phase 2: RouteManager unification (COMPLETED)
|
|
82
|
+
- ✓ Migrated SmartProxy to use SharedRouteManager
|
|
83
|
+
- ✓ Updated imports in smart-proxy.ts, route-connection-handler.ts, and index.ts
|
|
84
|
+
- ✓ Created logger adapter to match ILogger interface expectations
|
|
85
|
+
- ✓ Fixed method calls (getAllRoutes → getRoutes)
|
|
86
|
+
- ✓ Fixed type errors in header matcher
|
|
87
|
+
- ✓ Removed unused ipToNumber imports and methods
|
|
88
|
+
- ✓ DELETED: `/ts/proxies/smart-proxy/route-manager.ts` (553 lines removed)
|
|
89
|
+
- [x] Phase 3: Router consolidation (COMPLETED)
|
|
90
|
+
- ✓ Created unified HttpRouter with legacy compatibility
|
|
91
|
+
- ✓ Migrated ProxyRouter and RouteRouter to use HttpRouter aliases
|
|
92
|
+
- ✓ Updated imports in http-proxy.ts, request-handler.ts, websocket-handler.ts
|
|
93
|
+
- ✓ Added routeReqLegacy() method for backward compatibility
|
|
94
|
+
- ✓ DELETED: `/ts/routing/router/proxy-router.ts` (437 lines)
|
|
95
|
+
- ✓ DELETED: `/ts/routing/router/route-router.ts` (482 lines)
|
|
96
|
+
- [x] Phase 4: Architecture cleanup (COMPLETED)
|
|
97
|
+
- ✓ Updated route-utils.ts to use unified matchers directly
|
|
98
|
+
- ✓ Removed deprecated methods from SharedRouteManager
|
|
99
|
+
- ✓ Fixed HeaderMatcher.matchMultiple → matchAll method name
|
|
100
|
+
- ✓ Fixed findMatchingRoute return type handling (IRouteMatchResult)
|
|
101
|
+
- ✓ Fixed header type conversion for RegExp patterns
|
|
102
|
+
- ✓ DELETED: Duplicate RouteManager class from http-proxy/models/types.ts (~200 lines)
|
|
103
|
+
- ✓ Updated all imports to use SharedRouteManager from core/utils
|
|
104
|
+
- ✓ Fixed PathMatcher exact match behavior (added $ anchor for non-wildcard patterns)
|
|
105
|
+
- ✓ Updated test expectations to match unified matcher behavior
|
|
106
|
+
- ✓ All TypeScript errors resolved and build successful
|
|
107
|
+
- [x] Phase 5: Remove all backward compatibility code (COMPLETED)
|
|
108
|
+
- ✓ Removed routeReqLegacy() method from HttpRouter
|
|
109
|
+
- ✓ Removed all legacy compatibility methods from HttpRouter (~130 lines)
|
|
110
|
+
- ✓ Removed LegacyRouterResult interface
|
|
111
|
+
- ✓ Removed ProxyRouter and RouteRouter aliases
|
|
112
|
+
- ✓ Updated RequestHandler to remove legacyRouter parameter and legacy routing fallback (~80 lines)
|
|
113
|
+
- ✓ Updated WebSocketHandler to remove legacyRouter parameter and legacy routing fallback
|
|
114
|
+
- ✓ Updated HttpProxy to use only unified HttpRouter
|
|
115
|
+
- ✓ Removed IReverseProxyConfig interface (deprecated legacy interface)
|
|
116
|
+
- ✓ Removed useExternalPort80Handler deprecated option
|
|
117
|
+
- ✓ Removed backward compatibility exports from index.ts
|
|
118
|
+
- ✓ Removed all deprecated functions from route-utils.ts (~50 lines)
|
|
119
|
+
- ✓ Clean build with no legacy code
|
|
120
|
+
|
|
121
|
+
### Files Updated
|
|
122
|
+
1. `ts/core/utils/route-utils.ts` - Replaced all matching logic with unified matchers
|
|
123
|
+
2. `ts/core/utils/security-utils.ts` - Updated to use IpMatcher directly
|
|
124
|
+
3. `ts/proxies/smart-proxy/smart-proxy.ts` - Using SharedRouteManager with logger adapter
|
|
125
|
+
4. `ts/proxies/smart-proxy/route-connection-handler.ts` - Updated to use SharedRouteManager
|
|
126
|
+
5. `ts/proxies/smart-proxy/index.ts` - Exporting SharedRouteManager as RouteManager
|
|
127
|
+
6. `ts/core/routing/matchers/header.ts` - Fixed type handling for array header values
|
|
128
|
+
7. `ts/core/utils/route-manager.ts` - Removed unused ipToNumber import
|
|
129
|
+
8. `ts/proxies/http-proxy/http-proxy.ts` - Updated imports to use unified router
|
|
130
|
+
9. `ts/proxies/http-proxy/request-handler.ts` - Updated to use routeReqLegacy()
|
|
131
|
+
10. `ts/proxies/http-proxy/websocket-handler.ts` - Updated to use routeReqLegacy()
|
|
132
|
+
11. `ts/routing/router/index.ts` - Export unified HttpRouter with aliases
|
|
133
|
+
12. `ts/proxies/smart-proxy/utils/route-utils.ts` - Updated to use unified matchers directly
|
|
134
|
+
13. `ts/proxies/http-proxy/request-handler.ts` - Fixed findMatchingRoute usage
|
|
135
|
+
14. `ts/proxies/http-proxy/models/types.ts` - Removed duplicate RouteManager class
|
|
136
|
+
15. `ts/index.ts` - Updated exports to use SharedRouteManager aliases
|
|
137
|
+
16. `ts/proxies/index.ts` - Updated exports to use SharedRouteManager aliases
|
|
138
|
+
17. `test/test.acme-route-creation.ts` - Fixed getAllRoutes → getRoutes method call
|
|
139
|
+
|
|
140
|
+
### Files Created
|
|
141
|
+
1. `ts/core/routing/matchers/domain.ts` - Unified domain matcher
|
|
142
|
+
2. `ts/core/routing/matchers/path.ts` - Unified path matcher
|
|
143
|
+
3. `ts/core/routing/matchers/ip.ts` - Unified IP matcher
|
|
144
|
+
4. `ts/core/routing/matchers/header.ts` - Unified header matcher
|
|
145
|
+
5. `ts/core/routing/matchers/index.ts` - Matcher exports
|
|
146
|
+
6. `ts/core/routing/types.ts` - Core routing types
|
|
147
|
+
7. `ts/core/routing/specificity.ts` - Route specificity calculator
|
|
148
|
+
8. `ts/core/routing/index.ts` - Main routing exports
|
|
149
|
+
9. `ts/routing/router/http-router.ts` - Unified HTTP router
|
|
150
|
+
|
|
151
|
+
### Lines of Code Removed
|
|
152
|
+
- Target: ~1,500 lines
|
|
153
|
+
- Actual: ~2,332 lines (Target exceeded by 55%!)
|
|
154
|
+
- Phase 1: ~200 lines (matching logic)
|
|
155
|
+
- Phase 2: 553 lines (SmartProxy RouteManager)
|
|
156
|
+
- Phase 3: 919 lines (ProxyRouter + RouteRouter)
|
|
157
|
+
- Phase 4: ~200 lines (Duplicate RouteManager from http-proxy)
|
|
158
|
+
- Phase 5: ~460 lines (Legacy compatibility code)
|
|
159
|
+
|
|
160
|
+
## Unified Routing Architecture Summary
|
|
161
|
+
|
|
162
|
+
The routing unification effort has successfully:
|
|
163
|
+
1. **Created unified matchers** - Consistent matching logic across all route types
|
|
164
|
+
- DomainMatcher: Wildcard domain matching with specificity calculation
|
|
165
|
+
- PathMatcher: Path pattern matching with parameter extraction
|
|
166
|
+
- IpMatcher: IP address and CIDR notation matching
|
|
167
|
+
- HeaderMatcher: HTTP header matching with regex support
|
|
168
|
+
2. **Consolidated route managers** - Single SharedRouteManager for all proxies
|
|
169
|
+
3. **Unified routers** - Single HttpRouter for all HTTP routing needs
|
|
170
|
+
4. **Removed ~2,332 lines of code** - Exceeded target by 55%
|
|
171
|
+
5. **Clean modern architecture** - No legacy code, no backward compatibility layers
|
|
172
|
+
|
|
173
|
+
## Safety Checklist Before Deletion
|
|
174
|
+
|
|
175
|
+
Before deleting any code:
|
|
176
|
+
1. ✓ All tests pass
|
|
177
|
+
2. ✓ No references to deleted code remain
|
|
178
|
+
3. ✓ Migration path tested
|
|
179
|
+
4. ✓ Performance benchmarks show no regression
|
|
180
|
+
5. ✓ Documentation updated
|
|
181
|
+
|
|
182
|
+
## Rollback Plan
|
|
183
|
+
|
|
184
|
+
If issues arise after deletion:
|
|
185
|
+
1. Git history preserves all deleted code
|
|
186
|
+
2. Each phase can be reverted independently
|
|
187
|
+
3. Feature flags can disable new code if needed
|