-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
110 lines (98 loc) · 2.88 KB
/
server.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
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
const vm = require('vm');
const fs = require('fs');
const redis = require("redis");
global.atob = require("atob");
global.Canvas = require("canvas");
global.Image = Canvas.Image;
global.tracking = createLibrarySandbox([
'node_modules/tracking/build/tracking.js',
'node_modules/tracking/build/data/eye.js',
'node_modules/tracking/build/data/face.js',
'node_modules/tracking/build/data/mouth.js'
], {
window: {},
navigator: {},
tracking: {}
}).tracking;
global.Tesseract = require('tesseract.js');
global.redisClient = redis.createClient(6379, "redis");
global.id = 0;
global.callback = function(result) {
var cache = [];
var serialized = JSON.stringify(result, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
return;
}
cache.push(value);
}
return value;
});
cache = null;
console.timeEnd("Run");
console.log("Computed: " + serialized.substring(0, 100) + '...');
redisClient.lpush(id, serialized);
main();
};
global.main = function() {
redisClient.brpop("requests", 5, function(err, reply) {
if (!reply) {
console.log("No messages to handle.")
main();
return;
}
try {
const obj = JSON.parse(decodeURIComponent(reply[1]));
global.id = obj.id;
console.log('Received: ' + JSON.stringify(obj.code).substring(0, 200) + '...');
// fs.writeFile("./data/args" + global.id, obj.args, function(err) {});
console.time("Compile");
const script = new vm.Script('f = ' + obj.code + '; f(' + args(obj.args) + ');', {
displayErrors: true,
timeout: 500000
});
console.timeEnd("Compile");
console.time("Run");
const result = JSON.stringify(script.runInThisContext({
displayErrors: true,
timeout: 500000
}));
// const result = JSON.stringify(eval('f = ' + obj.code + '; f(' + args(obj.args) + ');'));
if (!obj.withCallback) {
console.timeEnd("Run");
console.log('Computed: ' + result.substring(0, 100) + '...');
redisClient.lpush(id, result);
main();
}
} catch (e) {
console.error("Error while handling a message: ", e);
redisClient.lpush(id, "error");
main();
}
});
}
exports.main = main;
if (require.main === module) {
main();
}
function createLibrarySandbox(files, sandbox) {
var source, script, result;
if (!(files instanceof Array)) {
files = [files];
}
source = files.map(function(file) {
return fs.readFileSync(file, 'utf8');
}).join('');
script = new vm.Script(source);
result = script.runInNewContext(sandbox);
return sandbox;
};
function args(a) {
var arguments = '';
for (var i = 0; i < a.length; i++) {
if (typeof a[i] === 'string') arguments += '\"' + a[i] + '\"'
else arguments += JSON.stringify(a[i]);
if (i < a.length - 1) arguments += ', ';
}
return arguments;
}