Hola,
Estoy tratando de averiguar por qué los módulos integrados se transmiten desde el host y no se requieren en la máquina virtual.
esta es mi configuración actualmente:
const vm = new NodeVM({
require: {
external: true,
context: 'sandbox',
builtin: ['*'],
},
});
vm.run(...);
dentro de la VM requiero un módulo externo ( axios
si eso importa) y en la cadena de dependencias requiere otro módulo ( follow-redirects
) que hace esto (más o menos):
var Writable = require('stream').Writable;
function RedirectableRequest(options, responseCallback) {
// .....
}
RedirectableRequest.prototype = Object.create(Writable.prototype);
RedirectableRequest.prototype._performRequest = function () { // <-------- this line breaks
// ..........
}
ejecutar este código dentro de la máquina virtual arroja: TypeError: 'set' en el proxy: la trampa devolvió falso para la propiedad '_performRequest'.
El objeto de flujo se envía por proxy a la máquina virtual.
ejecutar este código cuando realmente se requiere stream
dentro de la máquina virtual (eliminando la declaración if aquí: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133) es trabajando.
ejecutando el nodo 6.10.3 en osx.
Gracias
relacionado con #127
Seguí adelante y cambié la declaración if a:
if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){
Descubrí que en el nodo 8.x me encontré con problemas con async_hooks
También encontré una solución alternativa (una que creo que se ajusta mejor al paradigma).
Básicamente, lo que encontré fue que el código contextualizado intentaba escribir en un prototipo de un objeto que creó en su contexto, pero que extendía un objeto traído de otro contexto.
Según la documentación sobre el controlador de conjunto de proxy, si la propiedad no existe en el objeto que intenta configurar, se llamará al controlador de conjunto prototipo.
Entonces;
Objeto
prototipo
a <-Configurar esto (que en realidad no existe en el prototipo)
__proto__ (apoderado)
set: (){} <- En realidad llama a esto
Y cuando se llama al controlador de conjunto, el argumento del receptor se establecerá en el objeto original que estábamos tratando de configurar. Mi solución fue esta:
--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
const OPNA = 'Operation not allowed on contextified object.';
const ERROR_CST = Error.captureStackTrace;
const FROZEN_TRAPS = {
- set: (target, key) => false,
+ set: (target, key, value, receiver) => {
+ if( target !== receiver ){
+
+ Object.defineProperty(receiver, key, {
+ value: value,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ })
+
+ return true;
+
+ }
+
+ return false;
+
+ },
¿Cuál es el estado? ¿Proyecto muerto?
Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.
Comentario más útil
También encontré una solución alternativa (una que creo que se ajusta mejor al paradigma).
Básicamente, lo que encontré fue que el código contextualizado intentaba escribir en un prototipo de un objeto que creó en su contexto, pero que extendía un objeto traído de otro contexto.
Según la documentación sobre el controlador de conjunto de proxy, si la propiedad no existe en el objeto que intenta configurar, se llamará al controlador de conjunto prototipo.
Entonces;
Objeto
prototipo
a <-Configurar esto (que en realidad no existe en el prototipo)
__proto__ (apoderado)
set: (){} <- En realidad llama a esto
Y cuando se llama al controlador de conjunto, el argumento del receptor se establecerá en el objeto original que estábamos tratando de configurar. Mi solución fue esta: