Vm2: рд╕рдордп рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ(1){}

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЬрдире░ 2019  ┬╖  19рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: patriksimek/vm2

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯрд╛рдЗрдо рдЖрдЙрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

const {VM} = require('vm2');
new VM({timeout:1}).run(`
        function main(){
        while(1){}
    }
    new Proxy({}, {
        getPrototypeOf(t){
            global.main();
        }
    })`);
bug confirmed help wanted

рд╕рднреА 19 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред NodeJS рдПрдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЬрдмрдХрд┐(1){} рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдЪреЗрдХрд░ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рди рд╣реЛ рдЬрд╛рдП(1){}ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕реНрдкрд╛рдЗрдбрд░рдиреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВ тАж

рдпрд╣ Decontextify.value рдХреЗ рд╕рд╛рде рдЕрддрд┐рдерд┐ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ instanceOf ред Node.js vm рдореЙрдбреНрдпреВрд▓ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рд╣реИред рдПрдХ рдЧрд░реАрдм рдЖрджрдореА рдХрд╛ рдкреИрдЪ рдкрд┐рдЫрд▓реЗ рджрд░рд╡рд╛рдЬреЗ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Proxy рддрд╛рдХрд┐ рд╣рдо рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрднреА рднреА рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдлрдВрдХреНрд╢рди рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВред рдЕрддрд┐рдерд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд░ рдФрд░ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рд▓реЛрдЧреЛрдВ рдХреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрдЪреНрдЪреЗ рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд░рд▓реЗрд╕ рдЪрд╛рдЗрд▓реНрдб-рдкреНрд░реЛрд╕реЗрд╕ рдФрд░ рдореИрд╕реЗрдЬ-рдкрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реЗрдЯрдЕрдк рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк while(1){} рд╣рдорд▓реЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдпрд╣рд╛рдБ рд╣реИ ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ
рдУрдПрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рдЕрдиреНрдпрдерд╛ рдХрдИ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рд╣реИрдВ
рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рддред

рдЕрдиреНрдпрдерд╛ рдРрд╕реЗ рдХрдИ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред

рдЬреЛ рд▓реЛрдЧ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ NodeJS рдореЗрдВ VM2 рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ

рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рдиреЗ рдЕрдВрдХ #80 рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛:

https://github.com/laverdet/isolated-vm

рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЦреБрдж рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред

рдореИрдВ рдХреЗрд╡рд▓ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдЗрд╕реЗ рдореБрдЦреНрдп V8 рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд┐рдВрдЧрд▓ рдереНрд░реЗрдбреЗрдб рд╣реИред

V8 рдЗрдВрдЬрди рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓ рдХреА рдХрдореА рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ HTTP рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ vm2 + child_process рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдпреЛрдЬрди рд▓рдЧрддрд╛ рд╣реИред

рдЕрд░реЗ,

рдореИрдВрдиреЗ рдФрд░ @рд╣рд░реЗрд▓рдореЛ рдиреЗ while(1) {} рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рддрд┐рдпрд╛рди-рдорд╛ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдиреЛрдб.рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://www.npmjs.com/package/isolated-runtime рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ :)

рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рднреАрддрд░ рд╕рд┐рд░реНрдл Proxy рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд╣реИ рдирд╛?

const vm = new VM({
    sandbox: {
        Proxy: undefined
    },
    timeout: 100
});

Promise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХрднреА рд╕рдорд╛рдкреНрдд рди рд╣реЛ:

"use strict";
const {VM} = require('vm2');
const untrusted = '(' + function(){
    Promise.resolve().then(a=>{
        while(1){}
    });
}+')()';
try{
    console.log(new VM({timeout:10}).run(untrusted));
}catch(x){
    console.log(x);
}

рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ .рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдЯрд╛рд╕реНрдХ рдХрддрд╛рд░ рдореЗрдВ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░реЗрдЧрд╛ред
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ Promise.then рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ Promise рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const {VM} = require('vm2');

const script = '(' + function() {
    (async function x(){
        await {then: y=>y()};
        while(1){}
    })();
}+')()';

new VM({timeout:10}).run(script);

рддреЛ рд╕рд┐рд░реНрдл рдкреНрд░реЙрдорд┐рд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред
рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдЬрдмрдХрд┐ рдпрд╣ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП README рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рднреЗрджреНрдпрддрд╛ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рджреЗрддреА рд╣реИред

рд░реАрдбрдореА https://github.com/patriksimek/vm2/commit/77f5265ab53b87864a312156ee62b1082787e9b0#diff -04c6e90faac2675aa89e2176d2eec7d8 рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдХреЗрд╡рд▓ рдЙрд╕ рдЗрдЪреНрдЫрд┐рдд рд╕рдордп рд╕реАрдорд╛ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рдиреА рдЪрд╛рд╣рд┐рдПред

рд╢рд╛рдпрдж рдпрд╣ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ рдореБрджреНрджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди NodeVM "рдЯрд╛рдЗрдордЖрдЙрдЯ" рдХрд╛ рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

@crowder NodeVM рдореЗрдВ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ, рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдФрд░ рд╕реЗрдЯрдЗрдореАрдбрд┐рдПрдЯ рдореМрдЬреВрдж рд╣реИ, рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдХрд╛рд░рдг рднреА рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдореИрдВ NodeVM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛, рдХреЗрд╡рд▓ VMред

@XmiliaH рдХрдо рд╕реЗ рдХрдо рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЕрдирдВрдд рд▓реВрдк рд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?
рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЬрдмрдХрд┐ (рд╕рддреНрдп) + рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдВрдпреЛрдЬрди рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЧрд▓рддреА рд╕реЗ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╕рд╛рдзрд╛рд░рдг рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЕрдирдВрдд рд▓реВрдк рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ NodeVM рдХреЛ рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣реЛрд╕реНрдЯ рдореЙрдбреНрдпреВрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╕рдордп рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ NodeVM рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛, рди рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд░ред
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

function doWithTimeout(fn, timeout) {
    let ctx = CACHE.timeoutContext;
    let script = CACHE.timeoutScript;
    if (!ctx) {
        CACHE.timeoutContext = ctx = vm.createContext();
        CACHE.timeoutScript = script = new vm.Script('fn()', {
            filename: 'timeout_bridge.js',
            displayErrors: false
        });
    }
    ctx.fn = fn;
    try {
        return script.runInContext(ctx, {
            displayErrors: false,
            timeout
        });
    } finally {
        ctx.fn = null;
    }
}

рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ @XmiliaH рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг vm рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рди рдХрд┐ vm2 рдХрд╛
vm2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@szydan рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ozsay picture ozsay  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

somebody1234 picture somebody1234  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wintertime-inc picture wintertime-inc  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wojpawlik picture wojpawlik  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: рдкреНрд░реЙрдХреНрд╕реА рдкрд░ 'рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ': рд╕рдВрдкрддреНрддрд┐ 'рд╕реНрдерд┐рд░рд╛рдВрдХ' рдкреНрд░реЙрдХреНрд╕реА рд▓рдХреНрд╖реНрдп рдкрд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдбреЗрдЯрд╛ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░реЙрдХреНрд╕реА рдиреЗ рдЕрдкрдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛
karthikv picture karthikv  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ