Ir al contenido
Ayotl

← Todas las notas

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'" }] }
La única página del sitio que permite evaluar código, y no puede hablar con nadie.

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.

Todas las notas