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
3 changes: 0 additions & 3 deletions .gitignore

This file was deleted.

28 changes: 16 additions & 12 deletions interfaceWrapper/ru/application.js
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
// Вывод из глобального контекста модуля
console.log('From application global context');

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

// Устанавливаем функцию на таймер
setTimeout(timerEvent, 1000);

// Пример использования fs API
var fileName = './README.md'
console.log('Application going to read ' + fileName);
fs.readFile(fileName, function(err, src){
console.log('File ' + fileName + ' size ' + src.length);
});

// Читаем файл
setInterval(function(){
console.log('Application going to read ' + fileName);
fs.readFile(fileName, function(err, src){
console.log('File ' + fileName + ' size ' + src.length);
});
}, 10000);

// Дописываем в файл
setInterval(function(){
console.log('Application going to write test.txt');
fs.appendFile('test.txt', '7 bytes', function(err, src){
console.log('File test.txt append 7 bytes');
});
}, 10000);
100 changes: 83 additions & 17 deletions interfaceWrapper/ru/framework.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,30 +3,96 @@
var fs = require('fs'),
vm = require('vm');

// Статистика
var bytesRead = 0,
bytesWritten = 0,
callbacksCalled = 0,
totalCallbackExecutionTime = 0;

// Функция оборачивания callback'а
function wrapCallback(parentFnName, fn){
return function wrapper(){
var args = [];
Array.prototype.push.apply(args, arguments);

// Подсчёт количества прочитанных байт
if (parentFnName.indexOf('read') > -1){
bytesRead += args[1].length;
}

console.log('Callback :');
for (var i = 0; i < args.length; i++){
if (args[i] == null
|| args[i].length === 'undefined'
|| args[i].length < 100)
console.dir(args[i]);
else{
console.dir(typeof args[i]);
}
}
callbacksCalled++;
var start = Date.now();
fn.apply(undefined, args);
totalCallbackExecutionTime += Date.now() - start;
}
}

// Функция для оборачивания функции
function wrapFunction(fnName, fn){
return function wrapper(){
var args = [];
Array.prototype.push.apply(args, arguments);

// Подсчёт количества записанных байт
if (fnName.indexOf('write') > -1
|| fnName.indexOf('append') > -1){
bytesWritten += args[1].length;
}

console.log('Call: ' + fnName);
console.dir(args);

// Когда есть callback
if (typeof args[args.length - 1] == 'function'){
args[args.length - 1] = wrapCallback(
fnName,
args[args.length - 1]
);
}
fn.apply(undefined, args);
}
}

// Функция клонирования интерфейса
function cloneInterface(anInterface){
var clone ={};
for (var key in anInterface){
clone[key] = wrapFunction(key, anInterface[key]);
}
return clone;
}

// Клонируем fs
var fake_fs = cloneInterface(fs);

// Объявляем хеш из которого сделаем контекст-песочницу
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: fake_fs,
setInterval : setInterval
};

// Вывод статистики
setInterval(function(){
console.log('Callbacks called : ' + callbacksCalled
+ (callbacksCalled ? '\nAverage callback execution time : ' + (1.0 * totalCallbackExecutionTime / callbacksCalled) + 'ms' : '')
+ '\n Bytes read : ' + bytesRead
+ '\n Bytes written : ' + bytesWritten
);
}, 30000);

// Преобразовываем хеш в контекст
context.global = context;
var sandbox = vm.createContext(context);
Expand Down