@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.
Files changed (80) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/certificate/index.d.ts +10 -4
  3. package/dist_ts/certificate/index.js +5 -7
  4. package/dist_ts/certificate/models/certificate-types.d.ts +35 -15
  5. package/dist_ts/certificate/providers/cert-provisioner.d.ts +41 -15
  6. package/dist_ts/certificate/providers/cert-provisioner.js +201 -41
  7. package/dist_ts/forwarding/config/forwarding-types.d.ts +40 -76
  8. package/dist_ts/forwarding/config/forwarding-types.js +19 -18
  9. package/dist_ts/forwarding/config/index.d.ts +4 -2
  10. package/dist_ts/forwarding/config/index.js +5 -3
  11. package/dist_ts/forwarding/handlers/base-handler.js +3 -1
  12. package/dist_ts/forwarding/index.d.ts +5 -6
  13. package/dist_ts/forwarding/index.js +3 -3
  14. package/dist_ts/http/models/http-types.js +1 -1
  15. package/dist_ts/http/port80/acme-interfaces.d.ts +30 -0
  16. package/dist_ts/http/port80/acme-interfaces.js +46 -1
  17. package/dist_ts/http/port80/port80-handler.d.ts +17 -2
  18. package/dist_ts/http/port80/port80-handler.js +49 -11
  19. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +2 -61
  20. package/dist_ts/proxies/smart-proxy/models/interfaces.js +5 -4
  21. package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +118 -4
  22. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +70 -4
  23. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +193 -43
  24. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +2 -5
  25. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +25 -146
  26. package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +7 -0
  27. package/dist_ts/proxies/smart-proxy/route-helpers/index.js +9 -0
  28. package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +54 -1
  29. package/dist_ts/proxies/smart-proxy/route-helpers.js +102 -1
  30. package/dist_ts/proxies/smart-proxy/route-manager.d.ts +3 -9
  31. package/dist_ts/proxies/smart-proxy/route-manager.js +3 -115
  32. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +72 -10
  33. package/dist_ts/proxies/smart-proxy/smart-proxy.js +135 -268
  34. package/dist_ts/proxies/smart-proxy/timeout-manager.js +3 -3
  35. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +12 -0
  36. package/dist_ts/proxies/smart-proxy/utils/index.js +19 -0
  37. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +174 -0
  38. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +332 -0
  39. package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.d.ts +51 -0
  40. package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.js +124 -0
  41. package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +131 -0
  42. package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +217 -0
  43. package/dist_ts/proxies/smart-proxy/utils/route-utils.d.ts +79 -0
  44. package/dist_ts/proxies/smart-proxy/utils/route-utils.js +266 -0
  45. package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +73 -0
  46. package/dist_ts/proxies/smart-proxy/utils/route-validators.js +242 -0
  47. package/package.json +1 -1
  48. package/readme.md +139 -111
  49. package/readme.plan.md +164 -312
  50. package/ts/00_commitinfo_data.ts +1 -1
  51. package/ts/certificate/index.ts +17 -9
  52. package/ts/certificate/models/certificate-types.ts +37 -16
  53. package/ts/certificate/providers/cert-provisioner.ts +247 -54
  54. package/ts/forwarding/config/forwarding-types.ts +79 -107
  55. package/ts/forwarding/config/index.ts +4 -2
  56. package/ts/forwarding/handlers/base-handler.ts +4 -2
  57. package/ts/forwarding/index.ts +3 -2
  58. package/ts/http/models/http-types.ts +0 -1
  59. package/ts/http/port80/acme-interfaces.ts +84 -0
  60. package/ts/http/port80/port80-handler.ts +61 -15
  61. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -64
  62. package/ts/proxies/smart-proxy/models/route-types.ts +152 -22
  63. package/ts/proxies/smart-proxy/network-proxy-bridge.ts +226 -55
  64. package/ts/proxies/smart-proxy/route-connection-handler.ts +36 -205
  65. package/ts/proxies/smart-proxy/route-helpers/index.ts +9 -0
  66. package/ts/proxies/smart-proxy/route-helpers.ts +165 -11
  67. package/ts/proxies/smart-proxy/route-manager.ts +3 -130
  68. package/ts/proxies/smart-proxy/smart-proxy.ts +157 -329
  69. package/ts/proxies/smart-proxy/timeout-manager.ts +2 -2
  70. package/ts/proxies/smart-proxy/utils/index.ts +40 -0
  71. package/ts/proxies/smart-proxy/utils/route-helpers.ts +455 -0
  72. package/ts/proxies/smart-proxy/utils/route-migration-utils.ts +165 -0
  73. package/ts/proxies/smart-proxy/utils/route-patterns.ts +309 -0
  74. package/ts/proxies/smart-proxy/utils/route-utils.ts +330 -0
  75. package/ts/proxies/smart-proxy/utils/route-validators.ts +269 -0
  76. package/ts/forwarding/config/domain-config.ts +0 -28
  77. package/ts/forwarding/config/domain-manager.ts +0 -283
  78. package/ts/proxies/smart-proxy/connection-handler.ts +0 -1240
  79. package/ts/proxies/smart-proxy/port-range-manager.ts +0 -211
  80. /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;