# SmartProxy Fully Unified Configuration Plan (Updated) ## Project Goal Redesign SmartProxy's configuration for a more elegant, unified, and comprehensible approach by: 1. Creating a single, unified configuration model that covers both "where to listen" and "how to forward" 2. Eliminating the confusion between domain configs and port forwarding 3. Providing a clear, declarative API that makes the intent obvious 4. Enhancing maintainability and extensibility for future features 5. Completely removing legacy code to eliminate technical debt ## Current Issues The current approach has several issues: 1. **Dual Configuration Systems**: - Port configuration (`fromPort`, `toPort`, `globalPortRanges`) for "where to listen" - Domain configuration (`domainConfigs`) for "how to forward" - Unclear relationship between these two systems 2. **Mixed Concerns**: - Port management is mixed with forwarding logic - Domain routing is separated from port listening - Security settings defined in multiple places 3. **Complex Logic**: - PortRangeManager must coordinate with domain configuration - Implicit rules for handling connections based on port and domain 4. **Difficult to Understand and Configure**: - Two separate configuration hierarchies that must work together - Unclear which settings take precedence ## Proposed Solution: Fully Unified Routing Configuration Replace both port and domain configuration with a single, unified configuration: ```typescript // The core unified configuration interface interface IRouteConfig { // What to match match: { // Listen on these ports (required) ports: number | number[] | Array<{ from: number, to: number }>; // Optional domain patterns to match (default: all domains) domains?: string | string[]; // Advanced matching criteria path?: string; // Match specific paths clientIp?: string[]; // Match specific client IPs tlsVersion?: string[]; // Match specific TLS versions }; // What to do with matched traffic action: { // Basic routing type: 'forward' | 'redirect' | 'block'; // Target for forwarding target?: { host: string | string[]; // Support single host or round-robin port: number; preservePort?: boolean; // Use incoming port as target port }; // TLS handling tls?: { mode: 'passthrough' | 'terminate' | 'terminate-and-reencrypt'; certificate?: 'auto' | { // Auto = use ACME key: string; cert: string; }; }; // For redirects redirect?: { to: string; // URL or template with {domain}, {port}, etc. status: 301 | 302 | 307 | 308; }; // Security options security?: { allowedIps?: string[]; blockedIps?: string[]; maxConnections?: number; authentication?: { type: 'basic' | 'digest' | 'oauth'; // Auth-specific options }; }; // Advanced options advanced?: { timeout?: number; headers?: Record; keepAlive?: boolean; // etc. }; }; // Optional metadata name?: string; // Human-readable name for this route description?: string; // Description of the route's purpose priority?: number; // Controls matching order (higher = matched first) tags?: string[]; // Arbitrary tags for categorization } // Main SmartProxy options interface ISmartProxyOptions { // The unified configuration array (required) routes: IRouteConfig[]; // Global/default settings defaults?: { target?: { host: string; port: number; }; security?: { // Global security defaults }; tls?: { // Global TLS defaults }; // ...other defaults }; // Other global settings remain (acme, etc.) acme?: IAcmeOptions; // Advanced settings remain as well // ... } ``` ## Revised Implementation Plan ### Phase 1: Core Design & Interface Definition 1. **Define New Core Interfaces**: - Create `IRouteConfig` interface with `match` and `action` branches - Define all sub-interfaces for matching and actions - Create new `ISmartProxyOptions` to use `routes` array exclusively - Define template variable system for dynamic values 2. **Create Helper Functions**: - `createRoute()` - Basic route creation with reasonable defaults - `createHttpRoute()`, `createHttpsRoute()`, `createRedirect()` - Common scenarios - `createLoadBalancer()` - For multi-target setups - `mergeSecurity()`, `mergeDefaults()` - For combining configs 3. **Design Router**: - Decision tree for route matching algorithm - Priority system for route ordering - Optimized lookup strategy for fast routing ### Phase 2: Core Implementation 1. **Create RouteManager**: - Build a new RouteManager to replace both PortRangeManager and DomainConfigManager - Implement port and domain matching in one unified system - Create efficient route lookup algorithms 2. **Implement New ConnectionHandler**: - Create a new ConnectionHandler built from scratch for routes - Implement the routing logic with the new match/action pattern - Support template processing for headers and other dynamic values 3. **Implement New SmartProxy Core**: - Create new SmartProxy implementation using routes exclusively - Build network servers based on port specifications - Manage TLS contexts and certificates ### Phase 3: Legacy Code Removal 1. **Identify Legacy Components**: - Create an inventory of all files and components to be removed - Document dependencies between legacy components - Create a removal plan that minimizes disruption 2. **Remove Legacy Components**: - Remove PortRangeManager and related code - Remove DomainConfigManager and related code - Remove old ConnectionHandler implementation - Remove other legacy components 3. **Clean Interface Adaptations**: - Remove all legacy interfaces and types - Update type exports to only expose route-based interfaces - Remove any adapter or backward compatibility code ### Phase 4: Updated Documentation & Examples 1. **Update Core Documentation**: - Rewrite README.md with a focus on route-based configuration exclusively - Create interface reference documentation - Document all template variables 2. **Create Example Library**: - Common configuration patterns using the new API - Complex use cases for advanced features - Infrastructure-as-code examples 3. **Add Validation Tools**: - Configuration validator to check for issues - Schema definitions for IDE autocomplete - Runtime validation helpers ### Phase 5: Testing 1. **Unit Tests**: - Test route matching logic - Validate priority handling - Test template processing 2. **Integration Tests**: - Verify full proxy flows with the new system - Test complex routing scenarios - Ensure all features work as expected 3. **Performance Testing**: - Benchmark routing performance - Evaluate memory usage - Test with large numbers of routes ## Implementation Strategy ### Code Organization 1. **New Files**: - `route-config.ts` - Core route interfaces - `route-manager.ts` - Route matching and management - `route-connection-handler.ts` - Connection handling with routes - `route-smart-proxy.ts` - Main SmartProxy implementation - `template-engine.ts` - For variable substitution 2. **File Removal**: - Remove `port-range-manager.ts` - Remove `domain-config-manager.ts` - Remove legacy interfaces and adapter code - Remove backward compatibility shims ### Transition Strategy 1. **Breaking Change Approach**: - This will be a major version update with breaking changes - No backward compatibility will be maintained - Clear migration documentation will guide users to the new API 2. **Package Structure**: - `@push.rocks/smartproxy` package will be updated to v14.0.0 - Legacy code fully removed, only route-based API exposed - Support documentation provided for migration 3. **Migration Documentation**: - Provide a migration guide with examples - Show equivalent route configurations for common legacy patterns - Offer code transformation helpers for complex setups ## Benefits of the Clean Approach 1. **Reduced Complexity**: - No overlapping or conflicting configuration systems - No dual maintenance of backward compatibility code - Simplified internal architecture 2. **Cleaner Code Base**: - Removal of technical debt - Better separation of concerns - More maintainable codebase 3. **Better User Experience**: - Consistent, predictable API - No confusing overlapping options - Clear documentation of one approach, not two 4. **Future-Proof Design**: - Easier to extend with new features - Better performance without legacy overhead - Cleaner foundation for future enhancements ## Migration Support While we're removing backward compatibility from the codebase, we'll provide extensive migration support: 1. **Migration Guide**: - Detailed documentation on moving from legacy to route-based config - Pattern-matching examples for all common use cases - Troubleshooting guide for common migration issues 2. **Conversion Tool**: - Provide a standalone one-time conversion tool - Takes legacy configuration and outputs route-based equivalents - Will not be included in the main package to avoid bloat 3. **Version Policy**: - Maintain the legacy version (13.x) for security updates - Make the route-based version a clear major version change (14.0.0) - Clearly communicate the breaking changes ## Timeline and Versioning 1. **Development**: - Develop route-based implementation in a separate branch - Complete full test coverage of new implementation - Ensure documentation is complete 2. **Release**: - Release as version 14.0.0 - Clearly mark as breaking change - Provide migration guide at release time 3. **Support**: - Offer extended support for migration questions - Consider maintaining security updates for v13.x for 6 months - Focus active development on route-based version only