Prompt y contexto aplicable
Un Service Worker debe interceptar únicamente rutas de imágenes y documentos del mismo origen y extraer los ID de tenant y de recurso. Diseña un comparador URLPattern que cubra límites de componentes, grupos, reglas de mayúsculas y minúsculas, y un fallback para navegadores no compatibles.
URLPattern es un comparador estandarizado de patrones de URL para componentes de protocolo, host, puerto, pathname, search y hash, con grupos de captura con nombre o numerados. Es útil para enrutamiento, almacenamiento en caché de Service Workers y reglas perimetrales (edge rules), pero una coincidencia no es una autorización y no reemplaza la normalización ni las comprobaciones de acceso.
Qué evalúa el entrevistador
Cubre la coincidencia de componentes en lugar de la coincidencia de cadenas completas, la sintaxis de comodines y grupos, baseURL para patrones relativos, el comportamiento de mayúsculas y minúsculas por componente, el límite de confianza de las capturas, los errores de compilación y la compatibilidad entre navegadores.
Preguntas aclaratorias
Confirma los protocolos, hosts y puertos permitidos; si las rutas distinguen entre mayúsculas y minúsculas; si participan los parámetros de búsqueda; y si los ID de tenant y de recurso deben ser completos. También confirma el contexto de página, Service Worker o Worker, el soporte de navegadores y si una coincidencia afecta a decisiones de caché o de seguridad.
Estructura de respuesta de 30 segundos
“Fijaría los componentes de protocolo, host y puerto, usaría grupos con nombre solo en la ruta y establecería una baseURL explícita para patrones relativos. La construcción en tiempo de compilación detecta errores de sintaxis; en tiempo de ejecución coincidiría con la URL completa, exigiría el mismo origen y luego usaría las capturas para enrutamiento o claves de caché. URLPattern proporciona coincidencia, no autorización. Los navegadores no compatibles reciben un fallback limitado de componentes URL cubierto por las mismas pruebas, no una expresión regular amplia que reimplemente la semántica de URL.”
Análisis detallado paso a paso
Paso 1: Construir un patrón consciente de los componentes
URLPattern acepta un objeto con protocol, hostname, port, pathname, search y hash, o una cadena con formato de URL. Las rutas sensibles a la seguridad deben fijar el protocolo y el host en lugar de aceptar cualquier origen que coincida en la ruta.
Paso 2: Usar grupos de captura con nombre
Los grupos de ruta con nombre se pueden leer desde el resultado de exec() y mapearse a los campos de tenant y recurso. Una captura solo demuestra que la cadena tiene la forma esperada; valida su conjunto de caracteres, longitud y existencia de negocio por separado.
const assetPattern = new URLPattern({
protocol: "https",
hostname: "cdn.example.com",
pathname: "/tenant/:tenantId/assets/:assetId.:ext",
});
const match = assetPattern.exec(request.url);
const assetId = match?.pathname.groups.assetId;Paso 3: Definir límites de comodines y separadores
Un comodín coincide con caracteres dentro de su componente; no asumas que cruza separadores de ruta o cubre parámetros de búsqueda automáticamente. Escribe cada nivel de jerarquía explícitamente y prueba valores vacíos, barras adicionales y caracteres codificados.
Paso 4: Comprender baseURL y patrones relativos
Un patrón relativo necesita una baseURL para resolver el protocolo, el host y otros componentes. Por lo tanto, diferentes entornos pueden producir comparadores distintos. Fija la base durante la construcción y prueba los dominios de desarrollo, vista previa y producción.
Paso 5: Manejar reglas de mayúsculas y minúsculas y normalización
Los componentes de URL tienen diferentes reglas de mayúsculas y minúsculas. Los nombres de host generalmente no distinguen entre mayúsculas y minúsculas, mientras que las rutas y otros componentes pueden distinguirlas. No conviertas toda la URL a minúsculas antes de la coincidencia, ya que eso puede cambiar la ruta de un recurso o la entrada de una firma.
Paso 6: Separar la coincidencia de la autorización
URLPattern no demuestra que un tenant pertenezca al usuario o que un recurso sea legible. Después de la coincidencia, aplica verificaciones de origen, autenticación, autorización, aislamiento de caché y tipo de respuesta. Un ID de tenant capturado sigue siendo una entrada no confiable.
Paso 7: Errores de compilación y costo en tiempo de ejecución
Los patrones se analizan durante la construcción, por lo que una sintaxis no válida debería fallar durante el inicio o registro en lugar de en la primera solicitud. Reutiliza instancias compiladas en lugar de construir una por solicitud, y mide el costo de coincidencia frente a distribuciones de URL reales en rutas críticas.
Paso 8: Diseñar un fallback de compatibilidad
Un entorno no compatible puede usar new URL() y verificar solo los componentes que el negocio necesita. No utilices una expresión regular amplia para reproducir el análisis de protocolo, host, codificación y búsqueda. El fallback debe compartir los vectores de prueba del comparador nativo.
Respuesta de muestra de alta calidad
Construiría un URLPattern con https fijo, un host de CDN fijo y componentes de ruta explícitos, utilizando grupos con nombre para los ID de tenant y de recurso. Un Service Worker coincidiría con la URL completa y luego aplicaría el mismo origen, autenticación y particionamiento de caché; las capturas siguen siendo cadenas no confiables y aún necesitan comprobaciones de longitud, conjunto de caracteres y autorización. Construye el patrón una vez y falla rápidamente ante errores de sintaxis. Fija la baseURL al dominio de despliegue y prueba diferencias de mayúsculas y minúsculas, barras codificadas, parámetros de búsqueda adicionales y cada entorno. Los navegadores más antiguos utilizan un fallback limitado de componentes URL, nunca una expresión regular amplia que pretenda reproducir la semántica completa de URL.
Errores comunes
Coincidir solo con pathname y asumir el mismo origen
Cualquier protocolo o host podría pasar la misma ruta. Un comparador sensible a la seguridad debe fijar los componentes de origen y volver a verificar el origen de la solicitud en tiempo de ejecución.
Tratar las capturas como ID validados
Las capturas solo demuestran la forma. Valida el conjunto de caracteres, la longitud, la propiedad del tenant, la existencia del recurso y la autorización.
Convertir a minúsculas o normalizar con regex cada URL
La semántica de mayúsculas/minúsculas y codificación difiere según el componente. Convertir toda la cadena a minúsculas puede romper rutas y firmas, mientras que una expresión regular amplia puede cruzar separadores o pasar por alto reglas de búsqueda.
Preguntas de seguimiento y respuestas
¿Cómo evitas que una baseURL de desarrollo llegue a producción?
Inyecta la baseURL como configuración de despliegue, valida los protocolos y hosts permitidos al iniciar y fija los dominios de producción en las pruebas de compilación y de extremo a extremo. Nunca derives la base de un comparador de seguridad a partir de una URL controlada por el usuario.
¿Cómo soportarías una extensión de archivo opcional?
Utiliza el grupo opcional de la sintaxis de patrones y prueba la extensión, la ausencia de extensión, puntos adicionales y caracteres codificados por separado. Cuando la captura esté ausente, elige un tipo de contenido y una política de caché explícitos.
¿Cómo puede coexistir URLPattern con una biblioteca de enrutamiento?
Permite que URLPattern realice un filtrado rápido en el edge o en el Service Worker, y deja que el enrutador de la aplicación realice la navegación completa y la validación de parámetros. Comparte pruebas de contrato de URL para que ambas capas interpreten una ruta de manera idéntica.