|
1 |
| -// Пример оборачивания функции в песочнице |
| 1 | +'use strict'; |
2 | 2 |
|
3 |
| -var fs = require('fs'), |
4 |
| - vm = require('vm'); |
| 3 | +global.api = {}; |
| 4 | +api.fs = require('fs'); |
| 5 | +api.vm = require('vm'); |
5 | 6 |
|
6 |
| -// Объявляем хеш из которого сделаем контекст-песочницу |
7 |
| -var context = { |
8 |
| - module: {}, |
9 |
| - console: console, |
10 |
| - // Помещаем ссылку на fs API в песочницу |
11 |
| - fs: fs, |
12 |
| - // Оборачиваем функцию setTimeout в песочнице |
13 |
| - setTimeout: function(callback, timeout) { |
14 |
| - // Добавляем поведение при вызове setTimeout |
15 |
| - console.log( |
16 |
| - 'Call: setTimeout, ' + |
17 |
| - 'callback function: ' + callback.name + ', ' + |
18 |
| - 'timeout: ' + timeout |
19 |
| - ); |
20 |
| - setTimeout(function() { |
21 |
| - // Добавляем поведение при срабатывании таймера |
22 |
| - console.log('Event: setTimeout, before callback'); |
23 |
| - // Вызываем функцию пользователя на событии таймера |
24 |
| - callback(); |
25 |
| - console.log('Event: setTimeout, after callback'); |
26 |
| - }, timeout); |
| 7 | +const wrapFunction = (fnName, fn) => (...args) => { |
| 8 | + if (args.length > 0) { |
| 9 | + let callback = args[args.length - 1]; |
| 10 | + if (typeof callback === 'function') { |
| 11 | + args[args.length - 1] = (...pars) => { |
| 12 | + console.log(`Callback: ${fnName}`); |
| 13 | + callback(...pars); |
| 14 | + }; |
| 15 | + } else { |
| 16 | + callback = null; |
| 17 | + } |
27 | 18 | }
|
| 19 | + console.log(`Call: ${fnName}`); |
| 20 | + console.dir(args); |
| 21 | + fn(...args); |
28 | 22 | };
|
29 | 23 |
|
30 |
| -// Преобразовываем хеш в контекст |
| 24 | +const cloneInterface = anInterface => { |
| 25 | + const clone = {}; |
| 26 | + for (const key in anInterface) { |
| 27 | + const fn = anInterface[key]; |
| 28 | + clone[key] = wrapFunction(key, fn); |
| 29 | + } |
| 30 | + return clone; |
| 31 | +}; |
| 32 | + |
| 33 | +const context = { module: {}, console, fs: cloneInterface(api.fs) }; |
| 34 | + |
31 | 35 | context.global = context;
|
32 |
| -var sandbox = vm.createContext(context); |
| 36 | +const sandbox = api.vm.createContext(context); |
33 | 37 |
|
34 |
| -// Читаем исходный код приложения из файла |
35 |
| -var fileName = './application.js'; |
36 |
| -fs.readFile(fileName, function(err, src) { |
37 |
| - // Запускаем код приложения в песочнице |
38 |
| - var script = vm.createScript(src, fileName); |
| 38 | +const fileName = './application.js'; |
| 39 | +api.fs.readFile(fileName, 'utf8', (err, src) => { |
| 40 | + const script = api.vm.createScript(src, fileName); |
39 | 41 | script.runInNewContext(sandbox);
|
40 | 42 | });
|
0 commit comments