Я хочу запустить ненадежный код в Node, который может выглядеть так:
for (var i = 0; i < 5; i++){
green_led(1);
sleep(500);
green_led(0);
sleep(500);
}
Используя Fibers, я получил синхронное поведение, работающее, как и ожидалось:
var Fiber = require('fibers');
function sleep(ms){
var fiber = Fiber.current;
setTimeout(function(){ fiber.run(); }, ms);
Fiber.yield();
}
function green_led(active){
//...
}
Fiber(function(){
for (var i = 0; i < 5; i++){
green_led(1);
sleep(500);
green_led(0);
sleep(500);
}
}).run();
Сложность заключается в том, как песочить код. Необходимость использовать волокна делает его действительно сложным; Я не совсем уверен, как начать. Как я могу получить указанную выше песочницу с помощью vm2? Например, следующее явно не будет работать:
var code = "\
for (var i = 0; i < 5; i++){\
green_led(1);\
sleep(500);\
green_led(0);\
sleep(500);\
}\
";
function sleep(ms){
var fiber = Fiber.current;
setTimeout(function(){ fiber.run(); }, ms);
Fiber.yield();
}
function green_led(active){
//...
}
Fiber(function(){
vm.run(code);
}).run();
(Это не сработает, потому что green_led
и sleep
не видны изолированному коду на виртуальной машине).
Как это сделать? Либо...
- Возможно, все должно запускаться внутри виртуальной машины, включая Fibers и реализацию
green_led
и т. д.? - Или было бы лучше, чтобы код, запускаемый виртуальной машиной, был минимальным, а вместо этого каким-то образом добавлялся в белый список/прокси
green_led
иsleep
? Не совсем легко с серым веществом, достаточно сложно понять, как вообще работают Волокна!