BREAKING CHANGE(smartproxy): Remove legacy migration utilities and deprecated forwarding helpers; consolidate route utilities, streamline interface definitions, and normalize IPv6-mapped IPv4 addresses
This commit is contained in:
@ -5,10 +5,154 @@
|
||||
* These patterns can be used as templates for creating route configurations.
|
||||
*/
|
||||
|
||||
import type { IRouteConfig } from '../models/route-types.js';
|
||||
import { createHttpRoute, createHttpsTerminateRoute, createHttpsPassthroughRoute, createCompleteHttpsServer } from './route-helpers.js';
|
||||
import type { IRouteConfig, IRouteMatch, IRouteAction, IRouteTarget } from '../models/route-types.js';
|
||||
import { mergeRouteConfigs } from './route-utils.js';
|
||||
|
||||
/**
|
||||
* Create a basic HTTP route configuration
|
||||
*/
|
||||
export function createHttpRoute(
|
||||
domains: string | string[],
|
||||
target: { host: string | string[]; port: number | 'preserve' | ((ctx: any) => number) },
|
||||
options: Partial<IRouteConfig> = {}
|
||||
): IRouteConfig {
|
||||
const route: IRouteConfig = {
|
||||
match: {
|
||||
domains,
|
||||
ports: 80
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: {
|
||||
host: target.host,
|
||||
port: target.port
|
||||
}
|
||||
},
|
||||
name: options.name || `HTTP: ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
||||
};
|
||||
|
||||
return mergeRouteConfigs(route, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTTPS route with TLS termination
|
||||
*/
|
||||
export function createHttpsTerminateRoute(
|
||||
domains: string | string[],
|
||||
target: { host: string | string[]; port: number | 'preserve' | ((ctx: any) => number) },
|
||||
options: Partial<IRouteConfig> & {
|
||||
certificate?: 'auto' | { key: string; cert: string };
|
||||
reencrypt?: boolean;
|
||||
} = {}
|
||||
): IRouteConfig {
|
||||
const route: IRouteConfig = {
|
||||
match: {
|
||||
domains,
|
||||
ports: 443
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: {
|
||||
host: target.host,
|
||||
port: target.port
|
||||
},
|
||||
tls: {
|
||||
mode: options.reencrypt ? 'terminate-and-reencrypt' : 'terminate',
|
||||
certificate: options.certificate || 'auto'
|
||||
}
|
||||
},
|
||||
name: options.name || `HTTPS (terminate): ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
||||
};
|
||||
|
||||
return mergeRouteConfigs(route, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTTPS route with TLS passthrough
|
||||
*/
|
||||
export function createHttpsPassthroughRoute(
|
||||
domains: string | string[],
|
||||
target: { host: string | string[]; port: number | 'preserve' | ((ctx: any) => number) },
|
||||
options: Partial<IRouteConfig> = {}
|
||||
): IRouteConfig {
|
||||
const route: IRouteConfig = {
|
||||
match: {
|
||||
domains,
|
||||
ports: 443
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: {
|
||||
host: target.host,
|
||||
port: target.port
|
||||
},
|
||||
tls: {
|
||||
mode: 'passthrough'
|
||||
}
|
||||
},
|
||||
name: options.name || `HTTPS (passthrough): ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
||||
};
|
||||
|
||||
return mergeRouteConfigs(route, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTTP to HTTPS redirect route
|
||||
*/
|
||||
export function createHttpToHttpsRedirect(
|
||||
domains: string | string[],
|
||||
options: Partial<IRouteConfig> & {
|
||||
redirectCode?: 301 | 302 | 307 | 308;
|
||||
preservePath?: boolean;
|
||||
} = {}
|
||||
): IRouteConfig {
|
||||
const route: IRouteConfig = {
|
||||
match: {
|
||||
domains,
|
||||
ports: 80
|
||||
},
|
||||
action: {
|
||||
type: 'redirect',
|
||||
redirect: {
|
||||
to: options.preservePath ? 'https://{domain}{path}' : 'https://{domain}',
|
||||
status: options.redirectCode || 301
|
||||
}
|
||||
},
|
||||
name: options.name || `HTTP to HTTPS redirect: ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
||||
};
|
||||
|
||||
return mergeRouteConfigs(route, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a complete HTTPS server with redirect from HTTP
|
||||
*/
|
||||
export function createCompleteHttpsServer(
|
||||
domains: string | string[],
|
||||
target: { host: string | string[]; port: number | 'preserve' | ((ctx: any) => number) },
|
||||
options: Partial<IRouteConfig> & {
|
||||
certificate?: 'auto' | { key: string; cert: string };
|
||||
tlsMode?: 'terminate' | 'passthrough' | 'terminate-and-reencrypt';
|
||||
redirectCode?: 301 | 302 | 307 | 308;
|
||||
} = {}
|
||||
): IRouteConfig[] {
|
||||
// Create the TLS route based on the selected mode
|
||||
const tlsRoute = options.tlsMode === 'passthrough'
|
||||
? createHttpsPassthroughRoute(domains, target, options)
|
||||
: createHttpsTerminateRoute(domains, target, {
|
||||
...options,
|
||||
reencrypt: options.tlsMode === 'terminate-and-reencrypt'
|
||||
});
|
||||
|
||||
// Create the HTTP to HTTPS redirect route
|
||||
const redirectRoute = createHttpToHttpsRedirect(domains, {
|
||||
redirectCode: options.redirectCode,
|
||||
preservePath: true
|
||||
});
|
||||
|
||||
return [tlsRoute, redirectRoute];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an API Gateway route pattern
|
||||
* @param domains Domain(s) to match
|
||||
|
Reference in New Issue
Block a user