23 de octubre de 2026 · En Ayotl
Un curso que corre tu código sin dejarlo salir
La sección Aprende tiene lecciones con código que se puede editar y correr. El problema no es correrlo: es que un bucle infinito o un fetch escrito por el alumno no tumben la página. La respuesta fue un Worker nuevo por ejecución, con su propia política de seguridad y tres segundos de vida.
Cada lección de estructuras de datos trae un programa en JavaScript: explicación arriba, el código en un editor y a la derecha lo que imprime. El alumno lo cambia y le da a CORRER. Hacer eso con eval en la página es lo primero que se ocurre y lo peor: un while (true) congela la pestaña entera, y el código tiene a mano el DOM, las cookies y la red.
Así que el código corre en un Worker que se crea para esa ejecución y se destruye después. Si en tres segundos no contestó, se le llama a terminate() y la página dice que tardó demasiado: el bucle infinito muere con su hilo, no con la pestaña. Lo que imprime console.log vuelve por postMessage, ya formateado como lo haría Node.
// next.config.ts: el script del Worker lleva su propia política.
// Puede evaluar código (para eso está) y nada más: ni red, ni scripts de fuera.
{ source: "/aprende/ejecutor.js",
headers: [{ key: "Content-Security-Policy",
value: "default-src 'none'; script-src 'self' 'unsafe-eval'" }] }Hubo un tropiezo tonto: el proxy que traduce las rutas al inglés (/en/learn ↔ /aprende) también interceptaba el archivo del Worker y le devolvía otra cosa. Se arregló sacando los .js del matcher del proxy. Y otro menos tonto: las lecciones que miden tiempos (meter al principio de un arreglo frente a meter al final) usaban demasiados elementos y en un teléfono lento chocaban con los tres segundos. Bajaron a veinte mil.
Lo que hace que el curso se pueda mantener es una prueba: npm run aprende corre cada programa y cada solución de las 48 lecciones con el mismo ejecutor que usa la página, y falla si alguno no imprime lo que la lección dice que imprime. Un curso de programación con un ejemplo que no compila es peor que no tener curso.