@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,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Migration Utilities
|
|
3
|
+
*
|
|
4
|
+
* This file provides utility functions for migrating from legacy domain-based
|
|
5
|
+
* configuration to the new route-based configuration system. These functions
|
|
6
|
+
* are temporary and will be removed after the migration is complete.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Convert a legacy domain config to a route-based config
|
|
10
|
+
* @param domainConfig Legacy domain configuration
|
|
11
|
+
* @param additionalOptions Additional options to add to the route
|
|
12
|
+
* @returns Route configuration
|
|
13
|
+
* @deprecated This function will be removed in a future version
|
|
14
|
+
*/
|
|
15
|
+
export function domainConfigToRouteConfig(domainConfig, additionalOptions = {}) {
|
|
16
|
+
// Default port based on forwarding type
|
|
17
|
+
let defaultPort = 80;
|
|
18
|
+
let tlsMode;
|
|
19
|
+
switch (domainConfig.forwarding.type) {
|
|
20
|
+
case 'http-only':
|
|
21
|
+
defaultPort = 80;
|
|
22
|
+
break;
|
|
23
|
+
case 'https-passthrough':
|
|
24
|
+
defaultPort = 443;
|
|
25
|
+
tlsMode = 'passthrough';
|
|
26
|
+
break;
|
|
27
|
+
case 'https-terminate-to-http':
|
|
28
|
+
defaultPort = 443;
|
|
29
|
+
tlsMode = 'terminate';
|
|
30
|
+
break;
|
|
31
|
+
case 'https-terminate-to-https':
|
|
32
|
+
defaultPort = 443;
|
|
33
|
+
tlsMode = 'terminate-and-reencrypt';
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
// Create route match criteria
|
|
37
|
+
const match = {
|
|
38
|
+
ports: additionalOptions.match?.ports || defaultPort,
|
|
39
|
+
domains: domainConfig.domains
|
|
40
|
+
};
|
|
41
|
+
// Create route target
|
|
42
|
+
const target = {
|
|
43
|
+
host: domainConfig.forwarding.target.host,
|
|
44
|
+
port: domainConfig.forwarding.target.port
|
|
45
|
+
};
|
|
46
|
+
// Create route action
|
|
47
|
+
const action = {
|
|
48
|
+
type: 'forward',
|
|
49
|
+
target
|
|
50
|
+
};
|
|
51
|
+
// Add TLS configuration if needed
|
|
52
|
+
if (tlsMode) {
|
|
53
|
+
action.tls = {
|
|
54
|
+
mode: tlsMode,
|
|
55
|
+
certificate: 'auto'
|
|
56
|
+
};
|
|
57
|
+
// If the legacy config has custom certificates, use them
|
|
58
|
+
if (domainConfig.forwarding.https?.customCert) {
|
|
59
|
+
action.tls.certificate = {
|
|
60
|
+
key: domainConfig.forwarding.https.customCert.key,
|
|
61
|
+
cert: domainConfig.forwarding.https.customCert.cert
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Add security options if present
|
|
66
|
+
if (domainConfig.forwarding.security) {
|
|
67
|
+
action.security = domainConfig.forwarding.security;
|
|
68
|
+
}
|
|
69
|
+
// Create the route config
|
|
70
|
+
const routeConfig = {
|
|
71
|
+
match,
|
|
72
|
+
action,
|
|
73
|
+
// Include a name based on domains if not provided
|
|
74
|
+
name: additionalOptions.name || `Legacy route for ${domainConfig.domains.join(', ')}`,
|
|
75
|
+
// Include a note that this was converted from a legacy config
|
|
76
|
+
description: additionalOptions.description || 'Converted from legacy domain configuration'
|
|
77
|
+
};
|
|
78
|
+
// Add optional properties if provided
|
|
79
|
+
if (additionalOptions.priority !== undefined) {
|
|
80
|
+
routeConfig.priority = additionalOptions.priority;
|
|
81
|
+
}
|
|
82
|
+
if (additionalOptions.tags) {
|
|
83
|
+
routeConfig.tags = additionalOptions.tags;
|
|
84
|
+
}
|
|
85
|
+
return routeConfig;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Convert an array of legacy domain configs to route configurations
|
|
89
|
+
* @param domainConfigs Array of legacy domain configurations
|
|
90
|
+
* @returns Array of route configurations
|
|
91
|
+
* @deprecated This function will be removed in a future version
|
|
92
|
+
*/
|
|
93
|
+
export function domainConfigsToRouteConfigs(domainConfigs) {
|
|
94
|
+
return domainConfigs.map(config => domainConfigToRouteConfig(config));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract domains from a route configuration
|
|
98
|
+
* @param route Route configuration
|
|
99
|
+
* @returns Array of domains
|
|
100
|
+
*/
|
|
101
|
+
export function extractDomainsFromRoute(route) {
|
|
102
|
+
if (!route.match.domains) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
return Array.isArray(route.match.domains)
|
|
106
|
+
? route.match.domains
|
|
107
|
+
: [route.match.domains];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extract domains from an array of route configurations
|
|
111
|
+
* @param routes Array of route configurations
|
|
112
|
+
* @returns Array of unique domains
|
|
113
|
+
*/
|
|
114
|
+
export function extractDomainsFromRoutes(routes) {
|
|
115
|
+
const domains = new Set();
|
|
116
|
+
for (const route of routes) {
|
|
117
|
+
const routeDomains = extractDomainsFromRoute(route);
|
|
118
|
+
for (const domain of routeDomains) {
|
|
119
|
+
domains.add(domain);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return Array.from(domains);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWlncmF0aW9uLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvcHJveGllcy9zbWFydC1wcm94eS91dGlscy9yb3V0ZS1taWdyYXRpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBcUJIOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsWUFBaUMsRUFDakMsb0JBQTJDLEVBQUU7SUFFN0Msd0NBQXdDO0lBQ3hDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLE9BQTRFLENBQUM7SUFFakYsUUFBUSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLEtBQUssV0FBVztZQUNkLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTTtRQUNSLEtBQUssbUJBQW1CO1lBQ3RCLFdBQVcsR0FBRyxHQUFHLENBQUM7WUFDbEIsT0FBTyxHQUFHLGFBQWEsQ0FBQztZQUN4QixNQUFNO1FBQ1IsS0FBSyx5QkFBeUI7WUFDNUIsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUNsQixPQUFPLEdBQUcsV0FBVyxDQUFDO1lBQ3RCLE1BQU07UUFDUixLQUFLLDBCQUEwQjtZQUM3QixXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQztZQUNwQyxNQUFNO0lBQ1YsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixNQUFNLEtBQUssR0FBZ0I7UUFDekIsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksV0FBVztRQUNwRCxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87S0FDOUIsQ0FBQztJQUVGLHNCQUFzQjtJQUN0QixNQUFNLE1BQU0sR0FBaUI7UUFDM0IsSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDekMsSUFBSSxFQUFFLFlBQVks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
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Patterns
|
|
3
|
+
*
|
|
4
|
+
* This file provides pre-defined route patterns for common use cases.
|
|
5
|
+
* These patterns can be used as templates for creating route configurations.
|
|
6
|
+
*/
|
|
7
|
+
import type { IRouteConfig } from '../models/route-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create an API Gateway route pattern
|
|
10
|
+
* @param domains Domain(s) to match
|
|
11
|
+
* @param apiBasePath Base path for API endpoints (e.g., '/api')
|
|
12
|
+
* @param target Target host and port
|
|
13
|
+
* @param options Additional route options
|
|
14
|
+
* @returns API route configuration
|
|
15
|
+
*/
|
|
16
|
+
export declare function createApiGatewayRoute(domains: string | string[], apiBasePath: string, target: {
|
|
17
|
+
host: string | string[];
|
|
18
|
+
port: number;
|
|
19
|
+
}, options?: {
|
|
20
|
+
useTls?: boolean;
|
|
21
|
+
certificate?: 'auto' | {
|
|
22
|
+
key: string;
|
|
23
|
+
cert: string;
|
|
24
|
+
};
|
|
25
|
+
addCorsHeaders?: boolean;
|
|
26
|
+
[key: string]: any;
|
|
27
|
+
}): IRouteConfig;
|
|
28
|
+
/**
|
|
29
|
+
* Create a static file server route pattern
|
|
30
|
+
* @param domains Domain(s) to match
|
|
31
|
+
* @param rootDirectory Root directory for static files
|
|
32
|
+
* @param options Additional route options
|
|
33
|
+
* @returns Static file server route configuration
|
|
34
|
+
*/
|
|
35
|
+
export declare function createStaticFileServerRoute(domains: string | string[], rootDirectory: string, options?: {
|
|
36
|
+
useTls?: boolean;
|
|
37
|
+
certificate?: 'auto' | {
|
|
38
|
+
key: string;
|
|
39
|
+
cert: string;
|
|
40
|
+
};
|
|
41
|
+
indexFiles?: string[];
|
|
42
|
+
cacheControl?: string;
|
|
43
|
+
path?: string;
|
|
44
|
+
[key: string]: any;
|
|
45
|
+
}): IRouteConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Create a WebSocket route pattern
|
|
48
|
+
* @param domains Domain(s) to match
|
|
49
|
+
* @param target WebSocket server host and port
|
|
50
|
+
* @param options Additional route options
|
|
51
|
+
* @returns WebSocket route configuration
|
|
52
|
+
*/
|
|
53
|
+
export declare function createWebSocketRoute(domains: string | string[], target: {
|
|
54
|
+
host: string | string[];
|
|
55
|
+
port: number;
|
|
56
|
+
}, options?: {
|
|
57
|
+
useTls?: boolean;
|
|
58
|
+
certificate?: 'auto' | {
|
|
59
|
+
key: string;
|
|
60
|
+
cert: string;
|
|
61
|
+
};
|
|
62
|
+
path?: string;
|
|
63
|
+
[key: string]: any;
|
|
64
|
+
}): IRouteConfig;
|
|
65
|
+
/**
|
|
66
|
+
* Create a load balancer route pattern
|
|
67
|
+
* @param domains Domain(s) to match
|
|
68
|
+
* @param backends Array of backend servers
|
|
69
|
+
* @param options Additional route options
|
|
70
|
+
* @returns Load balancer route configuration
|
|
71
|
+
*/
|
|
72
|
+
export declare function createLoadBalancerRoute(domains: string | string[], backends: Array<{
|
|
73
|
+
host: string;
|
|
74
|
+
port: number;
|
|
75
|
+
}>, options?: {
|
|
76
|
+
useTls?: boolean;
|
|
77
|
+
certificate?: 'auto' | {
|
|
78
|
+
key: string;
|
|
79
|
+
cert: string;
|
|
80
|
+
};
|
|
81
|
+
algorithm?: 'round-robin' | 'least-connections' | 'ip-hash';
|
|
82
|
+
healthCheck?: {
|
|
83
|
+
path: string;
|
|
84
|
+
interval: number;
|
|
85
|
+
timeout: number;
|
|
86
|
+
unhealthyThreshold: number;
|
|
87
|
+
healthyThreshold: number;
|
|
88
|
+
};
|
|
89
|
+
[key: string]: any;
|
|
90
|
+
}): IRouteConfig;
|
|
91
|
+
/**
|
|
92
|
+
* Create a rate limiting route pattern
|
|
93
|
+
* @param baseRoute Base route to add rate limiting to
|
|
94
|
+
* @param rateLimit Rate limiting configuration
|
|
95
|
+
* @returns Route with rate limiting
|
|
96
|
+
*/
|
|
97
|
+
export declare function addRateLimiting(baseRoute: IRouteConfig, rateLimit: {
|
|
98
|
+
maxRequests: number;
|
|
99
|
+
window: number;
|
|
100
|
+
keyBy?: 'ip' | 'path' | 'header';
|
|
101
|
+
headerName?: string;
|
|
102
|
+
errorMessage?: string;
|
|
103
|
+
}): IRouteConfig;
|
|
104
|
+
/**
|
|
105
|
+
* Create a basic authentication route pattern
|
|
106
|
+
* @param baseRoute Base route to add authentication to
|
|
107
|
+
* @param auth Authentication configuration
|
|
108
|
+
* @returns Route with basic authentication
|
|
109
|
+
*/
|
|
110
|
+
export declare function addBasicAuth(baseRoute: IRouteConfig, auth: {
|
|
111
|
+
users: Array<{
|
|
112
|
+
username: string;
|
|
113
|
+
password: string;
|
|
114
|
+
}>;
|
|
115
|
+
realm?: string;
|
|
116
|
+
excludePaths?: string[];
|
|
117
|
+
}): IRouteConfig;
|
|
118
|
+
/**
|
|
119
|
+
* Create a JWT authentication route pattern
|
|
120
|
+
* @param baseRoute Base route to add JWT authentication to
|
|
121
|
+
* @param jwt JWT authentication configuration
|
|
122
|
+
* @returns Route with JWT authentication
|
|
123
|
+
*/
|
|
124
|
+
export declare function addJwtAuth(baseRoute: IRouteConfig, jwt: {
|
|
125
|
+
secret: string;
|
|
126
|
+
algorithm?: string;
|
|
127
|
+
issuer?: string;
|
|
128
|
+
audience?: string;
|
|
129
|
+
expiresIn?: number;
|
|
130
|
+
excludePaths?: string[];
|
|
131
|
+
}): IRouteConfig;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Patterns
|
|
3
|
+
*
|
|
4
|
+
* This file provides pre-defined route patterns for common use cases.
|
|
5
|
+
* These patterns can be used as templates for creating route configurations.
|
|
6
|
+
*/
|
|
7
|
+
import { createHttpRoute, createHttpsTerminateRoute, createHttpsPassthroughRoute, createCompleteHttpsServer } from './route-helpers.js';
|
|
8
|
+
import { mergeRouteConfigs } from './route-utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create an API Gateway route pattern
|
|
11
|
+
* @param domains Domain(s) to match
|
|
12
|
+
* @param apiBasePath Base path for API endpoints (e.g., '/api')
|
|
13
|
+
* @param target Target host and port
|
|
14
|
+
* @param options Additional route options
|
|
15
|
+
* @returns API route configuration
|
|
16
|
+
*/
|
|
17
|
+
export function createApiGatewayRoute(domains, apiBasePath, target, options = {}) {
|
|
18
|
+
// Normalize apiBasePath to ensure it starts with / and doesn't end with /
|
|
19
|
+
const normalizedPath = apiBasePath.startsWith('/')
|
|
20
|
+
? apiBasePath
|
|
21
|
+
: `/${apiBasePath}`;
|
|
22
|
+
// Add wildcard to path to match all API endpoints
|
|
23
|
+
const apiPath = normalizedPath.endsWith('/')
|
|
24
|
+
? `${normalizedPath}*`
|
|
25
|
+
: `${normalizedPath}/*`;
|
|
26
|
+
// Create base route
|
|
27
|
+
const baseRoute = options.useTls
|
|
28
|
+
? createHttpsTerminateRoute(domains, target, {
|
|
29
|
+
certificate: options.certificate || 'auto'
|
|
30
|
+
})
|
|
31
|
+
: createHttpRoute(domains, target);
|
|
32
|
+
// Add API-specific configurations
|
|
33
|
+
const apiRoute = {
|
|
34
|
+
match: {
|
|
35
|
+
...baseRoute.match,
|
|
36
|
+
path: apiPath
|
|
37
|
+
},
|
|
38
|
+
name: options.name || `API Gateway: ${apiPath} -> ${Array.isArray(target.host) ? target.host.join(', ') : target.host}:${target.port}`,
|
|
39
|
+
priority: options.priority || 100 // Higher priority for specific path matching
|
|
40
|
+
};
|
|
41
|
+
// Add CORS headers if requested
|
|
42
|
+
if (options.addCorsHeaders) {
|
|
43
|
+
apiRoute.headers = {
|
|
44
|
+
response: {
|
|
45
|
+
'Access-Control-Allow-Origin': '*',
|
|
46
|
+
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
47
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
|
48
|
+
'Access-Control-Max-Age': '86400'
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return mergeRouteConfigs(baseRoute, apiRoute);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a static file server route pattern
|
|
56
|
+
* @param domains Domain(s) to match
|
|
57
|
+
* @param rootDirectory Root directory for static files
|
|
58
|
+
* @param options Additional route options
|
|
59
|
+
* @returns Static file server route configuration
|
|
60
|
+
*/
|
|
61
|
+
export function createStaticFileServerRoute(domains, rootDirectory, options = {}) {
|
|
62
|
+
// Create base route with static action
|
|
63
|
+
const baseRoute = {
|
|
64
|
+
match: {
|
|
65
|
+
domains,
|
|
66
|
+
ports: options.useTls ? 443 : 80,
|
|
67
|
+
path: options.path || '/'
|
|
68
|
+
},
|
|
69
|
+
action: {
|
|
70
|
+
type: 'static',
|
|
71
|
+
static: {
|
|
72
|
+
root: rootDirectory,
|
|
73
|
+
index: options.indexFiles || ['index.html', 'index.htm'],
|
|
74
|
+
headers: {
|
|
75
|
+
'Cache-Control': options.cacheControl || 'public, max-age=3600'
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
name: options.name || `Static Server: ${Array.isArray(domains) ? domains.join(', ') : domains}`,
|
|
80
|
+
priority: options.priority || 50
|
|
81
|
+
};
|
|
82
|
+
// Add TLS configuration if requested
|
|
83
|
+
if (options.useTls) {
|
|
84
|
+
baseRoute.action.tls = {
|
|
85
|
+
mode: 'terminate',
|
|
86
|
+
certificate: options.certificate || 'auto'
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return baseRoute;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a WebSocket route pattern
|
|
93
|
+
* @param domains Domain(s) to match
|
|
94
|
+
* @param target WebSocket server host and port
|
|
95
|
+
* @param options Additional route options
|
|
96
|
+
* @returns WebSocket route configuration
|
|
97
|
+
*/
|
|
98
|
+
export function createWebSocketRoute(domains, target, options = {}) {
|
|
99
|
+
// Create base route
|
|
100
|
+
const baseRoute = options.useTls
|
|
101
|
+
? createHttpsTerminateRoute(domains, target, {
|
|
102
|
+
certificate: options.certificate || 'auto'
|
|
103
|
+
})
|
|
104
|
+
: createHttpRoute(domains, target);
|
|
105
|
+
// Add WebSocket-specific configurations
|
|
106
|
+
const wsRoute = {
|
|
107
|
+
match: {
|
|
108
|
+
...baseRoute.match,
|
|
109
|
+
path: options.path || '/ws',
|
|
110
|
+
headers: {
|
|
111
|
+
'Upgrade': 'websocket'
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
action: {
|
|
115
|
+
...baseRoute.action,
|
|
116
|
+
websocket: {
|
|
117
|
+
enabled: true,
|
|
118
|
+
pingInterval: options.pingInterval || 30000, // 30 seconds
|
|
119
|
+
pingTimeout: options.pingTimeout || 5000 // 5 seconds
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
name: options.name || `WebSocket: ${Array.isArray(domains) ? domains.join(', ') : domains} -> ${Array.isArray(target.host) ? target.host.join(', ') : target.host}:${target.port}`,
|
|
123
|
+
priority: options.priority || 100 // Higher priority for WebSocket routes
|
|
124
|
+
};
|
|
125
|
+
return mergeRouteConfigs(baseRoute, wsRoute);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a load balancer route pattern
|
|
129
|
+
* @param domains Domain(s) to match
|
|
130
|
+
* @param backends Array of backend servers
|
|
131
|
+
* @param options Additional route options
|
|
132
|
+
* @returns Load balancer route configuration
|
|
133
|
+
*/
|
|
134
|
+
export function createLoadBalancerRoute(domains, backends, options = {}) {
|
|
135
|
+
// Extract hosts and ensure all backends use the same port
|
|
136
|
+
const port = backends[0].port;
|
|
137
|
+
const hosts = backends.map(backend => backend.host);
|
|
138
|
+
// Create route with multiple hosts for load balancing
|
|
139
|
+
const baseRoute = options.useTls
|
|
140
|
+
? createHttpsTerminateRoute(domains, { host: hosts, port }, {
|
|
141
|
+
certificate: options.certificate || 'auto'
|
|
142
|
+
})
|
|
143
|
+
: createHttpRoute(domains, { host: hosts, port });
|
|
144
|
+
// Add load balancing specific configurations
|
|
145
|
+
const lbRoute = {
|
|
146
|
+
action: {
|
|
147
|
+
...baseRoute.action,
|
|
148
|
+
loadBalancing: {
|
|
149
|
+
algorithm: options.algorithm || 'round-robin',
|
|
150
|
+
healthCheck: options.healthCheck
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
name: options.name || `Load Balancer: ${Array.isArray(domains) ? domains.join(', ') : domains}`,
|
|
154
|
+
priority: options.priority || 50
|
|
155
|
+
};
|
|
156
|
+
return mergeRouteConfigs(baseRoute, lbRoute);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Create a rate limiting route pattern
|
|
160
|
+
* @param baseRoute Base route to add rate limiting to
|
|
161
|
+
* @param rateLimit Rate limiting configuration
|
|
162
|
+
* @returns Route with rate limiting
|
|
163
|
+
*/
|
|
164
|
+
export function addRateLimiting(baseRoute, rateLimit) {
|
|
165
|
+
return mergeRouteConfigs(baseRoute, {
|
|
166
|
+
security: {
|
|
167
|
+
rateLimit: {
|
|
168
|
+
enabled: true,
|
|
169
|
+
maxRequests: rateLimit.maxRequests,
|
|
170
|
+
window: rateLimit.window,
|
|
171
|
+
keyBy: rateLimit.keyBy || 'ip',
|
|
172
|
+
headerName: rateLimit.headerName,
|
|
173
|
+
errorMessage: rateLimit.errorMessage || 'Rate limit exceeded. Please try again later.'
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Create a basic authentication route pattern
|
|
180
|
+
* @param baseRoute Base route to add authentication to
|
|
181
|
+
* @param auth Authentication configuration
|
|
182
|
+
* @returns Route with basic authentication
|
|
183
|
+
*/
|
|
184
|
+
export function addBasicAuth(baseRoute, auth) {
|
|
185
|
+
return mergeRouteConfigs(baseRoute, {
|
|
186
|
+
security: {
|
|
187
|
+
basicAuth: {
|
|
188
|
+
enabled: true,
|
|
189
|
+
users: auth.users,
|
|
190
|
+
realm: auth.realm || 'Restricted Area',
|
|
191
|
+
excludePaths: auth.excludePaths || []
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create a JWT authentication route pattern
|
|
198
|
+
* @param baseRoute Base route to add JWT authentication to
|
|
199
|
+
* @param jwt JWT authentication configuration
|
|
200
|
+
* @returns Route with JWT authentication
|
|
201
|
+
*/
|
|
202
|
+
export function addJwtAuth(baseRoute, jwt) {
|
|
203
|
+
return mergeRouteConfigs(baseRoute, {
|
|
204
|
+
security: {
|
|
205
|
+
jwtAuth: {
|
|
206
|
+
enabled: true,
|
|
207
|
+
secret: jwt.secret,
|
|
208
|
+
algorithm: jwt.algorithm || 'HS256',
|
|
209
|
+
issuer: jwt.issuer,
|
|
210
|
+
audience: jwt.audience,
|
|
211
|
+
expiresIn: jwt.expiresIn,
|
|
212
|
+
excludePaths: jwt.excludePaths || []
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtcGF0dGVybnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXBhdHRlcm5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQTBCLEVBQzFCLFdBQW1CLEVBQ25CLE1BQWlELEVBQ2pELFVBS0ksRUFBRTtJQUVOLDBFQUEwRTtJQUMxRSxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNoRCxDQUFDLENBQUMsV0FBVztRQUNiLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRXRCLGtEQUFrRDtJQUNsRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxDQUFDLENBQUMsR0FBRyxjQUFjLEdBQUc7UUFDdEIsQ0FBQyxDQUFDLEdBQUcsY0FBYyxJQUFJLENBQUM7SUFFMUIsb0JBQW9CO0lBQ3BCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNO1FBQzlCLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO1lBQ3pDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU07U0FDM0MsQ0FBQztRQUNKLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXJDLGtDQUFrQztJQUNsQyxNQUFNLFFBQVEsR0FBMEI7UUFDdEMsS0FBSyxFQUFFO1lBQ0wsR0FBRyxTQUFTLENBQUMs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
|
|
@@ -0,0 +1,79 @@
|
|
|
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 type { IRouteConfig } from '../models/route-types.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 declare function mergeRouteConfigs(baseRoute: IRouteConfig, overrideRoute: Partial<IRouteConfig>): IRouteConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a route matches a domain
|
|
18
|
+
* @param route The route to check
|
|
19
|
+
* @param domain The domain to match against
|
|
20
|
+
* @returns True if the route matches the domain, false otherwise
|
|
21
|
+
*/
|
|
22
|
+
export declare function routeMatchesDomain(route: IRouteConfig, domain: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a route matches a port
|
|
25
|
+
* @param route The route to check
|
|
26
|
+
* @param port The port to match against
|
|
27
|
+
* @returns True if the route matches the port, false otherwise
|
|
28
|
+
*/
|
|
29
|
+
export declare function routeMatchesPort(route: IRouteConfig, port: number): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a route matches a path
|
|
32
|
+
* @param route The route to check
|
|
33
|
+
* @param path The path to match against
|
|
34
|
+
* @returns True if the route matches the path, false otherwise
|
|
35
|
+
*/
|
|
36
|
+
export declare function routeMatchesPath(route: IRouteConfig, path: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a route matches headers
|
|
39
|
+
* @param route The route to check
|
|
40
|
+
* @param headers The headers to match against
|
|
41
|
+
* @returns True if the route matches the headers, false otherwise
|
|
42
|
+
*/
|
|
43
|
+
export declare function routeMatchesHeaders(route: IRouteConfig, headers: Record<string, string>): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Find all routes that match the given criteria
|
|
46
|
+
* @param routes Array of routes to search
|
|
47
|
+
* @param criteria Matching criteria
|
|
48
|
+
* @returns Array of matching routes sorted by priority
|
|
49
|
+
*/
|
|
50
|
+
export declare function findMatchingRoutes(routes: IRouteConfig[], criteria: {
|
|
51
|
+
domain?: string;
|
|
52
|
+
port?: number;
|
|
53
|
+
path?: string;
|
|
54
|
+
headers?: Record<string, string>;
|
|
55
|
+
}): IRouteConfig[];
|
|
56
|
+
/**
|
|
57
|
+
* Find the best matching route for the given criteria
|
|
58
|
+
* @param routes Array of routes to search
|
|
59
|
+
* @param criteria Matching criteria
|
|
60
|
+
* @returns The best matching route or undefined if no match
|
|
61
|
+
*/
|
|
62
|
+
export declare function findBestMatchingRoute(routes: IRouteConfig[], criteria: {
|
|
63
|
+
domain?: string;
|
|
64
|
+
port?: number;
|
|
65
|
+
path?: string;
|
|
66
|
+
headers?: Record<string, string>;
|
|
67
|
+
}): IRouteConfig | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Create a route ID based on route properties
|
|
70
|
+
* @param route Route configuration
|
|
71
|
+
* @returns Generated route ID
|
|
72
|
+
*/
|
|
73
|
+
export declare function generateRouteId(route: IRouteConfig): string;
|
|
74
|
+
/**
|
|
75
|
+
* Clone a route configuration
|
|
76
|
+
* @param route Route to clone
|
|
77
|
+
* @returns Deep copy of the route
|
|
78
|
+
*/
|
|
79
|
+
export declare function cloneRoute(route: IRouteConfig): IRouteConfig;
|