-
Notifications
You must be signed in to change notification settings - Fork 159
Expand file tree
/
Copy pathsandbox.js
More file actions
88 lines (73 loc) · 2.07 KB
/
sandbox.js
File metadata and controls
88 lines (73 loc) · 2.07 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
'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,
fetch,
document,
navigator,
setTimeout,
clearTimeout,
URL,
// Convince jQuery not to assume it's in a browser
module: { exports: {} },
MutationObserver,
ResizeObserver,
AbortController,
ReadableStream:
typeof ReadableStream !== 'undefined'
? ReadableStream
: require('node:stream/web').ReadableStream,
WritableStream:
typeof WritableStream !== 'undefined'
? WritableStream
: require('node:stream/web').WritableStream,
TransformStream:
typeof TransformStream !== 'undefined'
? TransformStream
: require('node:stream/web').TransformStream,
Headers: typeof Headers !== 'undefined' ? Headers : undefined,
},
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);
}
};