Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
node_modules
crlf.js
*.log
interfaceWrapper/ru/framework.js
24 changes: 18 additions & 6 deletions interfaceWrapper/ru/application.js
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
// Вывод из глобального контекста модуля
console.log('From application global context');

// Объявляем функцию для события таймера
function timerEvent(){
console.log('From application timer event');
}
var fileName = './README.md'
var fileToWrite = './test.txt'

// Устанавливаем функцию на таймер
setTimeout(timerEvent, 1000);
console.log('Application going to read ' + fileName);
fs.readFile(fileName, function(err, src){
console.log('File ' + fileName + ' size ' + src.length);
});

var intervalID01 = setInterval(function (){
console.log('Application going to write ' + fileToWrite);
fs.appendFile(fileToWrite, 'some text\n',
function (err){
if(err) throw err;
});
}, 1000);

setTimeout(function(){
clearInterval(intervalID01);
}, 10000);
64 changes: 46 additions & 18 deletions interfaceWrapper/ru/framework.js
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,24 @@
// Пример оборачивания функции в песочнице

var fs = require('fs'),
vm = require('vm');
vm = require('vm');

var callbacks = 0;
// Объявляем хеш из которого сделаем контекст-песочницу
var context ={
module:{},
console: console,
// Помещаем ссылку на fs API в песочницу
fs: fs,
// Оборачиваем функцию setTimeout в песочнице
setTimeout: function(callback, timeout){
// Добавляем поведение при вызове setTimeout
console.log(
'Call: setTimeout, ' +
'callback function: ' + callback.name + ', ' +
'timeout: ' + timeout
);
setTimeout(function(){
// Добавляем поведение при срабатывании таймера
console.log('Event: setTimeout, before callback');
// Вызываем функцию пользователя на событии таймера
callback();
console.log('Event: setTimeout, after callback');
}, timeout);
}
fs: wrap(fs),
setInterval: setInterval,
setTimeout: setTimeout,
clearInterval: clearInterval
};

setInterval(function(){
console.log("=========== Callbacks: " + callbacks + "==========");
}, 5000);

// Преобразовываем хеш в контекст
context.global = context;
var sandbox = vm.createContext(context);
Expand All@@ -38,3 +30,39 @@ fs.readFile(fileName, function(err, src){
var script = vm.createScript(src, fileName);
script.runInNewContext(sandbox);
});

function cloneInterface(anInterface){
var clone ={};
for (var key in anInterface){
clone[key] = anInterface[key];
//clone[key] = wrapFunction(key, anInterface[key]);
}
return clone;
}

function wrapFunction(fnName, fn){
return function wrapper(){
var args = [];
Array.prototype.push.apply(args, arguments);
console.log('Call: ' + fnName);
//console.log('Args length: ' + args.length);
console.dir(args);

if (typeof args[args.length - 1] == "function"){
callbacks++;
args[args.length - 1] = wrapFunction('callback', args[args.length - 1]);
}

return fn.apply(undefined, args);
}
}

function wrap(module){
var wrappedModule = cloneInterface(module);
for(var i in wrappedModule){
if(typeof wrappedModule[i] === 'function'){
wrappedModule[i] = wrapFunction(i, wrappedModule[i]);
}
}
return wrappedModule;
}
15 changes: 4 additions & 11 deletions sandboxedModule/ru/README.md
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
## Описание

Цель: научиться создавать защищенные (экранированные) друг от друга контексты
для библиотек, разделять код на два слоя абстракци (прикладной и системный) и
запускать прикладной код в искуственной среде, меняя его поведение по принципу
IoC из системного кода.

## Файлы

* `framework.js` - небольшая часть фреймворка, необходимая для демонстрации IoC
* `application.js` - часть приложения для демонстрации IoC
`framework.js` - небольшая часть фреймворка, необходимая для демонстрации IoC
`application.js` - часть приложения для демонстрации IoC

## Запуск

Expand DownExpand Up@@ -41,8 +34,8 @@ IoC из системного кода.
7. Экспортировать из приложения хеш с несколькими функциями и переменными и
распечатать их список из фреймворка с указанием типов

8. Экспортировать из приложения функцию и вывести из вфреймворка исходник
функции и кол-во ее параметров
8. Экспортировать из приложения функцию и распечатать список ее параметров
из фреймворка (можно начать с вывода тела функции)

9. Распечатать из приложения список всего, что находится в его глобальном
контексте (т.е. в песочнице приложения) с указанием типов данных
Expand Down
24 changes: 24 additions & 0 deletions sandboxedModule/ru/application.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,31 @@
// Вывод из глобального контекста модуля
console.log('From application global context');

for (var i in global){
console.log(i +" "+ typeof global[i]);
}

var path = require('path');

setTimeout(function(){
console.log("Some message using setTimeout");
util.log("Some message using util.log");
}, 1000);

var intervalID01 = setInterval(function(){
console.log("Some message using setInterval");
}, 1000);

setTimeout(function(){
clearInterval(intervalID01);
}, 3000);

var exportedStr = 'str'
module.exports = function(){
// Вывод из контекста экспортируемой функции
module.exports.exportedStr = exportedStr;
module.exports.exportedFunc = function(arg){
return arguments.length;
};
console.log('From application exported function');
};
Loading