forked from Taritsyn/JavaScriptEngineSwitcher
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathengine-helpers.js
More file actions
113 lines (88 loc) · 2.64 KB
/
engine-helpers.js
File metadata and controls
113 lines (88 loc) · 2.64 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const GENERATED_FUNCTION_CALL_FILE_NAME = "JavaScriptEngineSwitcher.Node.Resources.generated-function-call.js";
let vm = require('vm');
let contexts = new Map();
module.exports = {
addContext: (callback, engineId, useBuiltinLibrary) => {
let sandboxPrototype = useBuiltinLibrary ? global : null;
let sandbox = Object.create(sandboxPrototype);
let context = vm.createContext(sandbox);
contexts.set(engineId, context);
callback(null);
},
removeСontext: (callback, engineId) => {
contexts.delete(engineId);
callback(null);
},
evaluate: (callback, engineId, expression, documentName, timeout) => {
let context = contexts.get(engineId);
let options = { filename: documentName };
if (timeout > 0) {
options.timeout = timeout;
}
let result = vm.runInContext(expression, context, options);
callback(null, result);
},
execute: (callback, engineId, code, documentName, timeout) => {
let context = contexts.get(engineId);
let options = { filename: documentName };
if (timeout > 0) {
options.timeout = timeout;
}
vm.runInContext(code, context, options);
callback(null);
},
callFunction: (callback, engineId, functionName, args, timeout) => {
let context = contexts.get(engineId);
let result;
if (timeout <= 0) {
let functionValue = context[functionName];
result = functionValue.apply(null, args);
}
else {
let options = {
filename: GENERATED_FUNCTION_CALL_FILE_NAME,
timeout: timeout
};
let argCount = args.length;
let expression;
if (argCount > 0) {
expression = functionName;
expression += '(';
for (let argIndex = 0; argIndex < argCount; argIndex++) {
if (argIndex > 0) {
expression += ', ';
}
expression += JSON.stringify(args[argIndex]);
}
expression += ');'
}
else {
expression = `${functionName}();`;
}
result = vm.runInContext(expression, context, options);
}
callback(null, result);
},
hasVariable: (callback, engineId, variableName) => {
let context = contexts.get(engineId);
let result = typeof context[variableName] !== 'undefined';
callback(null, result);
},
getVariableValue: (callback, engineId, variableName) => {
let context = contexts.get(engineId);
let result = context[variableName];
callback(null, result);
},
setVariableValue: (callback, engineId, variableName, value) => {
let context = contexts.get(engineId);
context[variableName] = value;
callback(null);
},
removeVariable: (callback, engineId, variableName) => {
let context = contexts.get(engineId);
if (typeof context[variableName] !== 'undefined') {
delete context[variableName];
}
callback(null, undefined);
}
};