125 lines
3.3 KiB
TypeScript
125 lines
3.3 KiB
TypeScript
/**
|
|
* Dynamic Route Helper Functions
|
|
*
|
|
* This module provides utility functions for creating dynamic routes
|
|
* with context-based host and port mapping.
|
|
*/
|
|
|
|
import type { IRouteConfig, IRouteMatch, IRouteAction, TPortRange, IRouteContext } from '../../models/route-types.js';
|
|
|
|
/**
|
|
* Create a helper function that applies a port offset
|
|
* @param offset The offset to apply to the matched port
|
|
* @returns A function that adds the offset to the matched port
|
|
*/
|
|
export function createPortOffset(offset: number): (context: IRouteContext) => number {
|
|
return (context: IRouteContext) => context.port + offset;
|
|
}
|
|
|
|
/**
|
|
* Create a port mapping route with context-based port function
|
|
* @param options Port mapping route options
|
|
* @returns Route configuration object
|
|
*/
|
|
export function createPortMappingRoute(options: {
|
|
sourcePortRange: TPortRange;
|
|
targetHost: string | string[] | ((context: IRouteContext) => string | string[]);
|
|
portMapper: (context: IRouteContext) => number;
|
|
name?: string;
|
|
domains?: string | string[];
|
|
priority?: number;
|
|
[key: string]: any;
|
|
}): IRouteConfig {
|
|
// Create route match
|
|
const match: IRouteMatch = {
|
|
ports: options.sourcePortRange,
|
|
domains: options.domains
|
|
};
|
|
|
|
// Create route action
|
|
const action: IRouteAction = {
|
|
type: 'forward',
|
|
targets: [{
|
|
host: options.targetHost,
|
|
port: options.portMapper
|
|
}]
|
|
};
|
|
|
|
// Create the route config
|
|
return {
|
|
match,
|
|
action,
|
|
name: options.name || `Port Mapping Route for ${options.domains || 'all domains'}`,
|
|
priority: options.priority,
|
|
...options
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Create a simple offset port mapping route
|
|
* @param options Offset port mapping route options
|
|
* @returns Route configuration object
|
|
*/
|
|
export function createOffsetPortMappingRoute(options: {
|
|
ports: TPortRange;
|
|
targetHost: string | string[];
|
|
offset: number;
|
|
name?: string;
|
|
domains?: string | string[];
|
|
priority?: number;
|
|
[key: string]: any;
|
|
}): IRouteConfig {
|
|
return createPortMappingRoute({
|
|
sourcePortRange: options.ports,
|
|
targetHost: options.targetHost,
|
|
portMapper: (context) => context.port + options.offset,
|
|
name: options.name || `Offset Mapping (${options.offset > 0 ? '+' : ''}${options.offset}) for ${options.domains || 'all domains'}`,
|
|
domains: options.domains,
|
|
priority: options.priority,
|
|
...options
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Create a dynamic route with context-based host and port mapping
|
|
* @param options Dynamic route options
|
|
* @returns Route configuration object
|
|
*/
|
|
export function createDynamicRoute(options: {
|
|
ports: TPortRange;
|
|
targetHost: (context: IRouteContext) => string | string[];
|
|
portMapper: (context: IRouteContext) => number;
|
|
name?: string;
|
|
domains?: string | string[];
|
|
path?: string;
|
|
clientIp?: string[];
|
|
priority?: number;
|
|
[key: string]: any;
|
|
}): IRouteConfig {
|
|
// Create route match
|
|
const match: IRouteMatch = {
|
|
ports: options.ports,
|
|
domains: options.domains,
|
|
path: options.path,
|
|
clientIp: options.clientIp
|
|
};
|
|
|
|
// Create route action
|
|
const action: IRouteAction = {
|
|
type: 'forward',
|
|
targets: [{
|
|
host: options.targetHost,
|
|
port: options.portMapper
|
|
}]
|
|
};
|
|
|
|
// Create the route config
|
|
return {
|
|
match,
|
|
action,
|
|
name: options.name || `Dynamic Route for ${options.domains || 'all domains'}`,
|
|
priority: options.priority,
|
|
...options
|
|
};
|
|
}
|