@push.rocks/smartproxy 13.1.2 → 15.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/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/proxies/smart-proxy/index.d.ts +5 -3
- package/dist_ts/proxies/smart-proxy/index.js +9 -5
- package/dist_ts/proxies/smart-proxy/models/index.d.ts +2 -0
- package/dist_ts/proxies/smart-proxy/models/index.js +2 -1
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +82 -15
- package/dist_ts/proxies/smart-proxy/models/interfaces.js +10 -1
- package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +133 -0
- package/dist_ts/proxies/smart-proxy/models/route-types.js +2 -0
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +55 -0
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +804 -0
- package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +127 -0
- package/dist_ts/proxies/smart-proxy/route-helpers.js +196 -0
- package/dist_ts/proxies/smart-proxy/route-manager.d.ts +103 -0
- package/dist_ts/proxies/smart-proxy/route-manager.js +483 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +19 -8
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +239 -46
- package/package.json +2 -2
- package/readme.md +863 -423
- package/readme.plan.md +311 -250
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/proxies/smart-proxy/index.ts +20 -4
- package/ts/proxies/smart-proxy/models/index.ts +4 -0
- package/ts/proxies/smart-proxy/models/interfaces.ts +91 -13
- package/ts/proxies/smart-proxy/models/route-types.ts +184 -0
- package/ts/proxies/smart-proxy/route-connection-handler.ts +1117 -0
- package/ts/proxies/smart-proxy/route-helpers.ts +344 -0
- package/ts/proxies/smart-proxy/route-manager.ts +587 -0
- package/ts/proxies/smart-proxy/smart-proxy.ts +300 -69
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { IRouteConfig, IRouteMatch, IRouteAction, IRouteTarget, IRouteSecurity } from './models/route-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Basic helper function to create a route configuration
|
|
4
|
+
*/
|
|
5
|
+
export declare function createRoute(match: IRouteMatch, action: IRouteAction, metadata?: {
|
|
6
|
+
name?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
priority?: number;
|
|
9
|
+
tags?: string[];
|
|
10
|
+
}): IRouteConfig;
|
|
11
|
+
/**
|
|
12
|
+
* Create a basic HTTP route configuration
|
|
13
|
+
*/
|
|
14
|
+
export declare function createHttpRoute(options: {
|
|
15
|
+
ports?: number | number[];
|
|
16
|
+
domains?: string | string[];
|
|
17
|
+
path?: string;
|
|
18
|
+
target: IRouteTarget;
|
|
19
|
+
headers?: Record<string, string>;
|
|
20
|
+
security?: IRouteSecurity;
|
|
21
|
+
name?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
priority?: number;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
}): IRouteConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Create an HTTPS route configuration with TLS termination
|
|
28
|
+
*/
|
|
29
|
+
export declare function createHttpsRoute(options: {
|
|
30
|
+
ports?: number | number[];
|
|
31
|
+
domains: string | string[];
|
|
32
|
+
path?: string;
|
|
33
|
+
target: IRouteTarget;
|
|
34
|
+
tlsMode?: 'terminate' | 'terminate-and-reencrypt';
|
|
35
|
+
certificate?: 'auto' | {
|
|
36
|
+
key: string;
|
|
37
|
+
cert: string;
|
|
38
|
+
};
|
|
39
|
+
headers?: Record<string, string>;
|
|
40
|
+
security?: IRouteSecurity;
|
|
41
|
+
name?: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
priority?: number;
|
|
44
|
+
tags?: string[];
|
|
45
|
+
}): IRouteConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Create an HTTPS passthrough route configuration
|
|
48
|
+
*/
|
|
49
|
+
export declare function createPassthroughRoute(options: {
|
|
50
|
+
ports?: number | number[];
|
|
51
|
+
domains?: string | string[];
|
|
52
|
+
target: IRouteTarget;
|
|
53
|
+
security?: IRouteSecurity;
|
|
54
|
+
name?: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
priority?: number;
|
|
57
|
+
tags?: string[];
|
|
58
|
+
}): IRouteConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Create a redirect route configuration
|
|
61
|
+
*/
|
|
62
|
+
export declare function createRedirectRoute(options: {
|
|
63
|
+
ports?: number | number[];
|
|
64
|
+
domains?: string | string[];
|
|
65
|
+
path?: string;
|
|
66
|
+
redirectTo: string;
|
|
67
|
+
statusCode?: 301 | 302 | 307 | 308;
|
|
68
|
+
name?: string;
|
|
69
|
+
description?: string;
|
|
70
|
+
priority?: number;
|
|
71
|
+
tags?: string[];
|
|
72
|
+
}): IRouteConfig;
|
|
73
|
+
/**
|
|
74
|
+
* Create an HTTP to HTTPS redirect route configuration
|
|
75
|
+
*/
|
|
76
|
+
export declare function createHttpToHttpsRedirect(options: {
|
|
77
|
+
domains: string | string[];
|
|
78
|
+
statusCode?: 301 | 302 | 307 | 308;
|
|
79
|
+
name?: string;
|
|
80
|
+
priority?: number;
|
|
81
|
+
}): IRouteConfig;
|
|
82
|
+
/**
|
|
83
|
+
* Create a block route configuration
|
|
84
|
+
*/
|
|
85
|
+
export declare function createBlockRoute(options: {
|
|
86
|
+
ports: number | number[];
|
|
87
|
+
domains?: string | string[];
|
|
88
|
+
clientIp?: string[];
|
|
89
|
+
name?: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
priority?: number;
|
|
92
|
+
tags?: string[];
|
|
93
|
+
}): IRouteConfig;
|
|
94
|
+
/**
|
|
95
|
+
* Create a load balancer route configuration
|
|
96
|
+
*/
|
|
97
|
+
export declare function createLoadBalancerRoute(options: {
|
|
98
|
+
ports?: number | number[];
|
|
99
|
+
domains: string | string[];
|
|
100
|
+
path?: string;
|
|
101
|
+
targets: string[];
|
|
102
|
+
targetPort: number;
|
|
103
|
+
tlsMode?: 'passthrough' | 'terminate' | 'terminate-and-reencrypt';
|
|
104
|
+
certificate?: 'auto' | {
|
|
105
|
+
key: string;
|
|
106
|
+
cert: string;
|
|
107
|
+
};
|
|
108
|
+
headers?: Record<string, string>;
|
|
109
|
+
security?: IRouteSecurity;
|
|
110
|
+
name?: string;
|
|
111
|
+
description?: string;
|
|
112
|
+
tags?: string[];
|
|
113
|
+
}): IRouteConfig;
|
|
114
|
+
/**
|
|
115
|
+
* Create a complete HTTPS server configuration with HTTP redirect
|
|
116
|
+
*/
|
|
117
|
+
export declare function createHttpsServer(options: {
|
|
118
|
+
domains: string | string[];
|
|
119
|
+
target: IRouteTarget;
|
|
120
|
+
certificate?: 'auto' | {
|
|
121
|
+
key: string;
|
|
122
|
+
cert: string;
|
|
123
|
+
};
|
|
124
|
+
security?: IRouteSecurity;
|
|
125
|
+
addHttpRedirect?: boolean;
|
|
126
|
+
name?: string;
|
|
127
|
+
}): IRouteConfig[];
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic helper function to create a route configuration
|
|
3
|
+
*/
|
|
4
|
+
export function createRoute(match, action, metadata) {
|
|
5
|
+
return {
|
|
6
|
+
match,
|
|
7
|
+
action,
|
|
8
|
+
...metadata
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a basic HTTP route configuration
|
|
13
|
+
*/
|
|
14
|
+
export function createHttpRoute(options) {
|
|
15
|
+
return createRoute({
|
|
16
|
+
ports: options.ports || 80,
|
|
17
|
+
...(options.domains ? { domains: options.domains } : {}),
|
|
18
|
+
...(options.path ? { path: options.path } : {})
|
|
19
|
+
}, {
|
|
20
|
+
type: 'forward',
|
|
21
|
+
target: options.target,
|
|
22
|
+
...(options.headers || options.security ? {
|
|
23
|
+
advanced: {
|
|
24
|
+
...(options.headers ? { headers: options.headers } : {})
|
|
25
|
+
},
|
|
26
|
+
...(options.security ? { security: options.security } : {})
|
|
27
|
+
} : {})
|
|
28
|
+
}, {
|
|
29
|
+
name: options.name || 'HTTP Route',
|
|
30
|
+
description: options.description,
|
|
31
|
+
priority: options.priority,
|
|
32
|
+
tags: options.tags
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create an HTTPS route configuration with TLS termination
|
|
37
|
+
*/
|
|
38
|
+
export function createHttpsRoute(options) {
|
|
39
|
+
return createRoute({
|
|
40
|
+
ports: options.ports || 443,
|
|
41
|
+
domains: options.domains,
|
|
42
|
+
...(options.path ? { path: options.path } : {})
|
|
43
|
+
}, {
|
|
44
|
+
type: 'forward',
|
|
45
|
+
target: options.target,
|
|
46
|
+
tls: {
|
|
47
|
+
mode: options.tlsMode || 'terminate',
|
|
48
|
+
certificate: options.certificate || 'auto'
|
|
49
|
+
},
|
|
50
|
+
...(options.headers || options.security ? {
|
|
51
|
+
advanced: {
|
|
52
|
+
...(options.headers ? { headers: options.headers } : {})
|
|
53
|
+
},
|
|
54
|
+
...(options.security ? { security: options.security } : {})
|
|
55
|
+
} : {})
|
|
56
|
+
}, {
|
|
57
|
+
name: options.name || 'HTTPS Route',
|
|
58
|
+
description: options.description,
|
|
59
|
+
priority: options.priority,
|
|
60
|
+
tags: options.tags
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create an HTTPS passthrough route configuration
|
|
65
|
+
*/
|
|
66
|
+
export function createPassthroughRoute(options) {
|
|
67
|
+
return createRoute({
|
|
68
|
+
ports: options.ports || 443,
|
|
69
|
+
...(options.domains ? { domains: options.domains } : {})
|
|
70
|
+
}, {
|
|
71
|
+
type: 'forward',
|
|
72
|
+
target: options.target,
|
|
73
|
+
tls: {
|
|
74
|
+
mode: 'passthrough'
|
|
75
|
+
},
|
|
76
|
+
...(options.security ? { security: options.security } : {})
|
|
77
|
+
}, {
|
|
78
|
+
name: options.name || 'HTTPS Passthrough Route',
|
|
79
|
+
description: options.description,
|
|
80
|
+
priority: options.priority,
|
|
81
|
+
tags: options.tags
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create a redirect route configuration
|
|
86
|
+
*/
|
|
87
|
+
export function createRedirectRoute(options) {
|
|
88
|
+
return createRoute({
|
|
89
|
+
ports: options.ports || 80,
|
|
90
|
+
...(options.domains ? { domains: options.domains } : {}),
|
|
91
|
+
...(options.path ? { path: options.path } : {})
|
|
92
|
+
}, {
|
|
93
|
+
type: 'redirect',
|
|
94
|
+
redirect: {
|
|
95
|
+
to: options.redirectTo,
|
|
96
|
+
status: options.statusCode || 301
|
|
97
|
+
}
|
|
98
|
+
}, {
|
|
99
|
+
name: options.name || 'Redirect Route',
|
|
100
|
+
description: options.description,
|
|
101
|
+
priority: options.priority,
|
|
102
|
+
tags: options.tags
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create an HTTP to HTTPS redirect route configuration
|
|
107
|
+
*/
|
|
108
|
+
export function createHttpToHttpsRedirect(options) {
|
|
109
|
+
const domainArray = Array.isArray(options.domains) ? options.domains : [options.domains];
|
|
110
|
+
return createRedirectRoute({
|
|
111
|
+
ports: 80,
|
|
112
|
+
domains: options.domains,
|
|
113
|
+
redirectTo: 'https://{domain}{path}',
|
|
114
|
+
statusCode: options.statusCode || 301,
|
|
115
|
+
name: options.name || `HTTP to HTTPS Redirect for ${domainArray.join(', ')}`,
|
|
116
|
+
priority: options.priority || 100 // High priority for redirects
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a block route configuration
|
|
121
|
+
*/
|
|
122
|
+
export function createBlockRoute(options) {
|
|
123
|
+
return createRoute({
|
|
124
|
+
ports: options.ports,
|
|
125
|
+
...(options.domains ? { domains: options.domains } : {}),
|
|
126
|
+
...(options.clientIp ? { clientIp: options.clientIp } : {})
|
|
127
|
+
}, {
|
|
128
|
+
type: 'block'
|
|
129
|
+
}, {
|
|
130
|
+
name: options.name || 'Block Route',
|
|
131
|
+
description: options.description,
|
|
132
|
+
priority: options.priority || 1000, // Very high priority for blocks
|
|
133
|
+
tags: options.tags
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create a load balancer route configuration
|
|
138
|
+
*/
|
|
139
|
+
export function createLoadBalancerRoute(options) {
|
|
140
|
+
const useTls = options.tlsMode !== undefined;
|
|
141
|
+
const defaultPort = useTls ? 443 : 80;
|
|
142
|
+
return createRoute({
|
|
143
|
+
ports: options.ports || defaultPort,
|
|
144
|
+
domains: options.domains,
|
|
145
|
+
...(options.path ? { path: options.path } : {})
|
|
146
|
+
}, {
|
|
147
|
+
type: 'forward',
|
|
148
|
+
target: {
|
|
149
|
+
host: options.targets,
|
|
150
|
+
port: options.targetPort
|
|
151
|
+
},
|
|
152
|
+
...(useTls ? {
|
|
153
|
+
tls: {
|
|
154
|
+
mode: options.tlsMode,
|
|
155
|
+
...(options.tlsMode !== 'passthrough' && options.certificate ? {
|
|
156
|
+
certificate: options.certificate
|
|
157
|
+
} : {})
|
|
158
|
+
}
|
|
159
|
+
} : {}),
|
|
160
|
+
...(options.headers || options.security ? {
|
|
161
|
+
advanced: {
|
|
162
|
+
...(options.headers ? { headers: options.headers } : {})
|
|
163
|
+
},
|
|
164
|
+
...(options.security ? { security: options.security } : {})
|
|
165
|
+
} : {})
|
|
166
|
+
}, {
|
|
167
|
+
name: options.name || 'Load Balanced Route',
|
|
168
|
+
description: options.description || `Load balancing across ${options.targets.length} backends`,
|
|
169
|
+
tags: options.tags
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Create a complete HTTPS server configuration with HTTP redirect
|
|
174
|
+
*/
|
|
175
|
+
export function createHttpsServer(options) {
|
|
176
|
+
const routes = [];
|
|
177
|
+
const domainArray = Array.isArray(options.domains) ? options.domains : [options.domains];
|
|
178
|
+
// Add HTTPS route
|
|
179
|
+
routes.push(createHttpsRoute({
|
|
180
|
+
domains: options.domains,
|
|
181
|
+
target: options.target,
|
|
182
|
+
certificate: options.certificate || 'auto',
|
|
183
|
+
security: options.security,
|
|
184
|
+
name: options.name || `HTTPS Server for ${domainArray.join(', ')}`
|
|
185
|
+
}));
|
|
186
|
+
// Add HTTP to HTTPS redirect if requested
|
|
187
|
+
if (options.addHttpRedirect !== false) {
|
|
188
|
+
routes.push(createHttpToHttpsRedirect({
|
|
189
|
+
domains: options.domains,
|
|
190
|
+
name: `HTTP to HTTPS Redirect for ${domainArray.join(', ')}`,
|
|
191
|
+
priority: 100
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
return routes;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvcm91dGUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQTs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLEtBQWtCLEVBQ2xCLE1BQW9CLEVBQ3BCLFFBS0M7SUFFRCxPQUFPO1FBQ0wsS0FBSztRQUNMLE1BQU07UUFDTixHQUFHLFFBQVE7S0FDWixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsT0FXQztJQUVELE9BQU8sV0FBVyxDQUNoQjtRQUNFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDMUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hELEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRCxFQUNEO1FBQ0UsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDeEMsUUFBUSxFQUFFO2dCQUNSLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN6RDtZQUNELEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFB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
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { IRouteConfig } from './models/route-types.js';
|
|
3
|
+
import type { ISmartProxyOptions, IDomainConfig } from './models/interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* Result of route matching
|
|
6
|
+
*/
|
|
7
|
+
export interface IRouteMatchResult {
|
|
8
|
+
route: IRouteConfig;
|
|
9
|
+
params?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The RouteManager handles all routing decisions based on connections and attributes
|
|
13
|
+
*/
|
|
14
|
+
export declare class RouteManager extends plugins.EventEmitter {
|
|
15
|
+
private routes;
|
|
16
|
+
private portMap;
|
|
17
|
+
private options;
|
|
18
|
+
constructor(options: ISmartProxyOptions);
|
|
19
|
+
/**
|
|
20
|
+
* Update routes with new configuration
|
|
21
|
+
*/
|
|
22
|
+
updateRoutes(routes?: IRouteConfig[]): void;
|
|
23
|
+
/**
|
|
24
|
+
* Rebuild the port mapping for fast lookups
|
|
25
|
+
*/
|
|
26
|
+
private rebuildPortMap;
|
|
27
|
+
/**
|
|
28
|
+
* Expand a port range specification into an array of individual ports
|
|
29
|
+
*/
|
|
30
|
+
private expandPortRange;
|
|
31
|
+
/**
|
|
32
|
+
* Get all ports that should be listened on
|
|
33
|
+
*/
|
|
34
|
+
getListeningPorts(): number[];
|
|
35
|
+
/**
|
|
36
|
+
* Get all routes for a given port
|
|
37
|
+
*/
|
|
38
|
+
getRoutesForPort(port: number): IRouteConfig[];
|
|
39
|
+
/**
|
|
40
|
+
* Test if a pattern matches a domain using glob matching
|
|
41
|
+
*/
|
|
42
|
+
private matchDomain;
|
|
43
|
+
/**
|
|
44
|
+
* Match a domain against all patterns in a route
|
|
45
|
+
*/
|
|
46
|
+
private matchRouteDomain;
|
|
47
|
+
/**
|
|
48
|
+
* Check if a client IP is allowed by a route's security settings
|
|
49
|
+
*/
|
|
50
|
+
private isClientIpAllowed;
|
|
51
|
+
/**
|
|
52
|
+
* Match an IP against a pattern
|
|
53
|
+
*/
|
|
54
|
+
private matchIpPattern;
|
|
55
|
+
/**
|
|
56
|
+
* Match an IP against a CIDR pattern
|
|
57
|
+
*/
|
|
58
|
+
private matchIpCidr;
|
|
59
|
+
/**
|
|
60
|
+
* Convert an IP address to a numeric value
|
|
61
|
+
*/
|
|
62
|
+
private ipToNumber;
|
|
63
|
+
/**
|
|
64
|
+
* Find the matching route for a connection
|
|
65
|
+
*/
|
|
66
|
+
findMatchingRoute(options: {
|
|
67
|
+
port: number;
|
|
68
|
+
domain?: string;
|
|
69
|
+
clientIp: string;
|
|
70
|
+
path?: string;
|
|
71
|
+
tlsVersion?: string;
|
|
72
|
+
}): IRouteMatchResult | null;
|
|
73
|
+
/**
|
|
74
|
+
* Match a path against a pattern
|
|
75
|
+
*/
|
|
76
|
+
private matchPath;
|
|
77
|
+
/**
|
|
78
|
+
* Convert a domain config to routes
|
|
79
|
+
* (For backward compatibility with code that still uses domainConfigs)
|
|
80
|
+
*/
|
|
81
|
+
domainConfigToRoutes(domainConfig: IDomainConfig): IRouteConfig[];
|
|
82
|
+
/**
|
|
83
|
+
* Update routes based on domain configs
|
|
84
|
+
* (For backward compatibility with code that still uses domainConfigs)
|
|
85
|
+
*/
|
|
86
|
+
updateFromDomainConfigs(domainConfigs: IDomainConfig[]): void;
|
|
87
|
+
/**
|
|
88
|
+
* Validate the route configuration and return any warnings
|
|
89
|
+
*/
|
|
90
|
+
validateConfiguration(): string[];
|
|
91
|
+
/**
|
|
92
|
+
* Check if two route matches are similar (potential conflict)
|
|
93
|
+
*/
|
|
94
|
+
private areMatchesSimilar;
|
|
95
|
+
/**
|
|
96
|
+
* Check if a route is completely shadowed by a higher priority route
|
|
97
|
+
*/
|
|
98
|
+
private isRouteShadowed;
|
|
99
|
+
/**
|
|
100
|
+
* Check if route1 is more specific than route2
|
|
101
|
+
*/
|
|
102
|
+
private isRouteMoreSpecific;
|
|
103
|
+
}
|