Construyendo SandpackVM: Cómo construir una máquina virtual ligera
TLDR Estoy construyendo SandpackVM, una maquina virtual ligera en JavaScript que permite que Workers aislados invoquen funciones del host de forma segura. En este articulo explico como resolvi la comunicacion entre proceso padre y Worker usando funciones proxy, TypeScript y mensajeria asincrona, transformando una limitacion en un patron de diseño util.
El problema que inicio todo: cuando ejecutas codigo no confiable en un playground, un sistema de plugins o un REPL, te topas con el mismo obstaculo: no puedes ejecutar el codigo del usuario directamente y permitir que llame funciones definidas fuera de su contexto. JavaScript ofrece Workers y Node trae worker_threads, pero la limitacion es la misma la sandbox no puede invocar funciones externas porque solo recibe datos serializados. Comunicacion significa paso de mensajes, serializacion y mucha frustracion. SandpackVM nace como un experimento para que esos dos mundos, host y sandbox, vuelvan a hablar de forma fluida.
La pregunta del primer dia fue clara: como ejecutar codigo dentro de un Worker permitiendo que llame funciones del proceso padre. Mi solucion inicial consistio en no intentar enviar funciones reales, sino crear funciones proxy dentro del Worker que se comuniquen con el padre via postMessage. Asi, una llamada await log hola viaja asi entre mundos: el Worker usa un proxy async que crea un id unico, almacena resolve y reject en pendingCalls, hace postMessage al padre con tipo apiCall, el padre recibe el mensaje, busca la funcion real en su lista de APIs, la ejecuta, y devuelve un postMessage tipo apiResult con resultado o error. El Worker recibe la respuesta y resuelve o rechaza la Promise correspondiente.
En la practica esto se implementa generando dinamicamente codigo para el Worker que define por cada API una funcion proxy async. Esa funcion crea un id aleatorio, guarda la promesa pendiente en un mapa, y envia un mensaje al padre con el nombre de la funcion y los argumentos. Del lado del padre, un listener actua como router RPC: recibe apiCall, ejecuta la funcion definida en la coleccion de APIs, y manda de vuelta apiResult con resultado o error. En el Worker tambien hay un listener que resuelve o rechaza la llamada pendiente segun el payload recibido. Asi construimos un puente request response simple y robusto entre procesos.
Por que TypeScript En un proyecto que es basicamente una maquina virtual es fundamental controlar tipos, contratos y limites de la API. TypeScript aporta seguridad en tiempo de compilacion, mejor experiencia en el IDE y codigo JavaScript limpio que funciona en cualquier entorno. Definir interfaces claras evita sorpresas cuando se inyectan APIs o se expanden capacidades del sandbox.
Principios que emergieron de la implementacion: primero, la asincronia es no negociable. El aislamiento exige fronteras asincronas, por eso todas las APIs proxy devuelven Promises y el codigo de usuario debe usar await. Segundo, el patron proxy es una herramienta poderosa porque ofrece control, observabilidad, seguridad y trazabilidad cada llamada lleva un id unico que facilita logs y depuracion. Tercero, la comunicacion basada en Promises funciona como un RPC ligero: generar id unico, enviar mensaje, esperar respuesta y resolver o rechazar.
Gracias a este modelo se facilitan capacidades adicionales que interesan a proyectos reales: registro y telemetria de llamadas, validacion y sanitizacion de argumentos, cuotas de uso y limitacion de recursos, y reglas de seguridad que bloqueen accesos no permitidos como importScripts o acceso a sistema de archivos cuando no este autorizado.
Estado actual y proximos pasos: en SandpackVM ya funciona la creacion y ejecucion de Workers, la inyeccion de APIs via proxies y la comunicacion asincrona por postMessage con manejo basico de errores. Los siguientes retos incluyen soporte para APIs anidadas, implementacion de cuotas de CPU y memoria, capa de observabilidad con linea de tiempo y metricas, y manejo de casos marginales como loops infinitos o fallos a medio camino.
Donde importa esto en el mundo real: ejecutar codigo arbitrario de forma segura y flexible es necesario en documentacion interactiva, sistemas de plugins, agentes de IA que ejecutan funciones generadas por usuario, entornos educativos que ofrecen REPLs aislados y sandboxes para editores cloud. En particular los agentes IA y las soluciones de ia para empresas se benefician de ejecutar codigo de forma controlada sin comprometer la infraestructura.
Sobre Q2BSTUDIO En Q2BSTUDIO somos una empresa de desarrollo de software y aplicaciones a medida con experiencia en inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios de inteligencia de negocio y soluciones con Power BI. Diseñamos software a medida y aplicaciones a medida pensadas para integrar agentes IA, pipelines de datos y controles de seguridad. Si buscas crear una aplicacion personalizada que ejecute codigo de forma segura o integrar capacidades de IA en tus procesos, podemos ayudarte con arquitectura, implementacion y despliegue.
Si necesitas soluciones de software a medida visita nuestra pagina de desarrollo de aplicaciones a medida y para servicios de inteligencia artificial y proyectos de ia para empresas conoce nuestras ofertas en inteligencia artificial para empresas. Tambien ofrecemos servicios avanzados de ciberseguridad y pentesting, migration y gestion en servicios cloud aws y azure, y proyectos de inteligencia de negocio y power bi para mejorar la toma de decisiones.
Reflexion final Ejecutar codigo no confiable no es solo una cuestion tecnica de aislar procesos, es diseñar puentes controlados que permitan flexibilidad sin perder seguridad. SandpackVM ilustra como convertir limitaciones de serializacion en un patron util: proxies asincronos, mensajes estructurados y un router RPC en el host. Esa combinacion abre terreno para observabilidad, cuotas y politicas de seguridad que aceleran adopcion en productos reales.
Si te interesa seguir la conversacion sobre sandboxes seguros, agentes IA o como integrar estas ideas en productos de negocio contactanos en Q2BSTUDIO y trabajemos juntos en una solucion a medida que combine software a medida, ciberseguridad, servicios cloud aws y azure, agentes IA y business intelligence con Power BI.
Comentarios