Portless: rutas locales con nombre
Código de Portless: nombres exactos, autoridades y el primer sufijo coincidente
Reproduce prioridades con una revisión fijada y distingue autoridad Tailscale exacta, alternativa sin puerto y coincidencia comodín opcional.
Qué aprenderás
- Lee la prioridad antes de dibujarla
- Primera coincidencia no significa sufijo más largo
- Identifica el código y prueba el manejador real
Antes de empezar
- Conceptos de orígenes HTTP, puertos y terminal
- Distinguir loopback, LAN y exposición pública
Traza una petición, define límites de instalación y separa comportamiento observado de integraciones no probadas.
Conclusiones clave
- Los nombres locales exactos preceden a Tailscale y comodines.
- El comodín elige la primera ruta coincidente, no el sufijo más largo.
- Se ejecutó el manejador original, no una reimplementación didáctica.
Lee la prioridad antes de dibujarla
findRoute en proxy.ts convierte la autoridad a minúsculas y elimina un :443 explícito. Intenta, en orden, igualdad del nombre local, autoridad de la URL Tailscale, nombre Tailscale ignorando el puerto y sufijo comodín cuando strict está desactivado. Cada nivel usa Array.find: el orden de las rutas dentro de un nivel tiene consecuencias.
El nivel de autoridad distingue rutas que comparten un host tailnet con puertos diferentes cuando existe coincidencia exacta. En los datos de prueba, :8443 alcanzó A y :443 explícito alcanzó B. Esos nombres eran únicamente cabeceras Host enviadas a 127.0.0.1; no se usaron cliente Tailscale, cuenta, DNS ni túnel real.
Primera coincidencia no significa sufijo más largo
Con app.localhost antes de nested.app.localhost, una petición comodín a child.nested.app.localhost llega a la primera ruta base. El código no ordena sufijos por especificidad. La petición exacta a nested.app.localhost llega a la ruta anidada porque el nivel local exacto precede al comodín. En modo estricto, el hijo no registrado se rechaza.
La alternativa Tailscale que ignora el puerto también depende del orden: un puerto sin coincidencia puede terminar en la primera ruta con ese nombre de host. Es comportamiento observado, no una recomendación de usar nombres ambiguos. No asumas que un puerto diferente obliga al rechazo; convierte la política deseada de ambigüedad en expectativas de prueba explícitas.
Identifica el código y prueba el manejador real
El experimento verificó hashes Git blob de seis módulos, transpiló TypeScript sin cambios de comportamiento y abrió servidores HTTP efímeros en loopback. Comprobó respuestas de dos servidores identificables, no una función de selección reescrita por el autor. Los 24 casos incluyeron cambios de rutas, cabeceras, contador de saltos y autorización interna.
El informe conserva commit, versiones de runtime y compilador, y señala TLS, HTTP/2, WebSockets y cambios del sistema como no probados o no realizados. Esos límites forman parte del resultado. Una versión futura puede cambiar las reglas: revisa el nuevo commit y repite los casos, en vez de presentar esta instantánea como contrato inmutable.
Pasos de implementación
- 1
Verifica commit y hashes de módulos.
- 2
Crea dos servidores loopback distinguibles.
- 3
Comprueba nombres exactos, strict, autoridades y sufijos ambiguos.
- 4
Guarda entorno y rutas de integración no probadas.
Ejemplo para copiar
{
"ordenDeRutasDePrueba": ["app.localhost -> A", "nested.app.localhost -> B"],
"hijoEstricto": {"host":"child.nested.app.localhost","status":404},
"hijoComodín": {"host":"child.nested.app.localhost","backend":"A"},
"nombreAnidadoExacto": {"host":"nested.app.localhost","backend":"B"},
"casosHttpObservados": 24
}Preguntas frecuentes
¿El comodín elige el sufijo más específico?
No en esta revisión. Tras fallar niveles anteriores, elige la primera ruta del array cuyo sufijo coincide.
¿Se inició Tailscale realmente?
No. Se probaron autoridades mediante cabeceras Host ficticias sobre loopback. La integración de acceso compartido permanece sin verificar.
Fuentes
- packages/portless/src/proxy.tsFuente verificada 2026-09-08
- packages/portless/src/utils.tsFuente verificada 2026-09-08
- packages/portless/src/types.tsFuente verificada 2026-09-08