-
Notifications
You must be signed in to change notification settings - Fork 159
/
sandbox.js
68 lines (54 loc) · 1.38 KB
/
sandbox.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
'use strict';
const chalk = require('chalk');
const vm = require('vm');
const sourceMapSupport = require('source-map-support');
module.exports = class Sandbox {
constructor(globals) {
this.globals = globals;
let sandbox = this.buildSandbox();
this.context = vm.createContext(sandbox);
}
buildSandbox() {
let console = this.buildWrappedConsole();
let URL = require('url');
let globals = this.globals;
let sandbox = Object.assign(
{
sourceMapSupport,
console,
setTimeout,
clearTimeout,
URL,
// Convince jQuery not to assume it's in a browser
module: { exports: {} },
},
globals
);
// Set the global as `window`.
sandbox.window = sandbox;
sandbox.window.self = sandbox;
return sandbox;
}
buildWrappedConsole() {
let wrappedConsole = Object.create(console);
wrappedConsole.error = function(...args) {
console.error.apply(
console,
args.map(function(a) {
return typeof a === 'string' ? chalk.red(a) : a;
})
);
};
return wrappedConsole;
}
runScript(script) {
script.runInContext(this.context);
}
eval(source, filePath) {
var fileScript = new vm.Script(source, { filename: filePath });
fileScript.runInContext(this.context);
}
run(cb) {
return cb.call(this.context, this.context);
}
};