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
35 changes: 31 additions & 4 deletions sandboxedModule/ru/application.js
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,38 @@
// Файл содержит маленький кусочек основного модуля демонстрационного
// прикладного приложения, загружаемого в песочницу демонстрационным
// кусочком фреймворка. Читайте README.md в нем задания.
// Пример использования require
require('path');

// Вывод из глобального контекста модуля
console.log('From application global context');
console.log('From application global context\n');

module.exports = function(){
// Вывод из контекста экспортируемой функции
console.log('From application exported function');
//Task 1
setTimeout(()=>console.log('Timeout using(after 1s) (task 1)\n'), 1000);

//Task 2
console.log(util.format('We use %s.%s', 'util', 'format\n'));

//Task 7
function func1(){};
function func2(a, b){return a + b};
var num = 1;
var str = 'abc'
var bool = true;
var obj ={};

var one_more_var = 123;

module.exports ={
func1: func1,
func2: func2,
num: num,
str: str,
bool: bool,
obj: obj
};

console.log('global context of application(task 9):\n');
for (var k in global){
console.log(k + " - " + typeof global[k]);
}
130 changes: 122 additions & 8 deletions sandboxedModule/ru/framework.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,22 +5,136 @@

// Фреймворк может явно зависеть от библиотек через dependency lookup
var fs = require('fs'),
vm = require('vm');
vm = require('vm'),
util = require('util');



// Читаем исходный код приложения из файла
var fileName = process.argv[2] || './application.js'
var outputFile = 'output.txt'
var outputFile_require = 'require_output.txt'

function createClone(dest, src){
if (!dest || !src || typeof dest != 'object' || typeof src != 'object'){
return;
}
for (key in src){
dest[key] = src[key];
}
}

var myConsole ={};
createClone(myConsole, console);

// прибавляет к строке <applicationName> <time>
function add_applicationName_time(str){
str = add_time(str);
var applicationName = fileName;
str = applicationName + " " + str;
return str;
}

// прибавляет к строке <time>
function add_time(str){
var date = new Date();
var time = [date.getHours(), date.getMinutes(), date.getSeconds()].join(':');
str = time + " " + str;
return str;
}
// меняет аргумент функции с помощью функции change_input
function decorate_input(func, change_input){
return function(massage){
massage = change_input(massage);
func.call(this, massage);
}
}

// записывает аргумент вызова функции в файл fileName
// меняет вывод с помощью функции change_output
function decorate_logging(func, fileName, change_output){
return function(massage){
var output = massage;
if (change_output){
output = change_output(massage);
}
output += '\n'
fs.appendFile(fileName, output,{flag: 'a'}, (err) =>{
if(err){
throw err;
}
})
func.call(this, massage);
}
}

myConsole.log = decorate_input(myConsole.log, add_applicationName_time);
myConsole.log = decorate_logging(myConsole.log, outputFile, add_applicationName_time);
var myRequire = decorate_logging(require, outputFile_require, add_time);
// Создаем контекст-песочницу, которая станет глобальным контекстом приложения
var context ={module:{}, console: console };
var context ={
module:{},
console: myConsole,
setTimeout: setTimeout,
setInterval: setInterval,
clearTimeout: clearTimeout,
clearInterval: clearInterval,
util: util,
require : myRequire
};
context.global = context;
var sandbox = vm.createContext(context);

// Читаем исходный код приложения из файла
var fileName = './application.js'

fs.readFile(fileName, function(err, src){
// Тут нужно обработать ошибки

if(err) throw err;

var context_before_loading ={};
for (var k in sandbox.global){
context_before_loading[k] = sandbox.global[k];
}


// Запускаем код приложения в песочнице
var script = vm.createScript(src, fileName);
script.runInNewContext(sandbox);

// Забираем ссылку из sandbox.module.exports, можем ее исполнить,
// сохранить в кеш, вывести на экран исходный код приложения и т.д.

var context_after_loading ={};
for (var k in sandbox.global){
context_after_loading[k] = sandbox.global[k];
}

var module_exports = sandbox.module.exports;


// Task 7 распечатать експорт
console.log('\nExported content(task 7):');
for (k in module_exports){
console.log(k + " - " + typeof module_exports[k]);
}

// Task 8 распечатать список аргументов функции
console.log('\nfunction description(task 8):');
var func2_str = module_exports.func2.toString();
console.log(func2_str);
var func2_args_str = func2_str.slice(func2_str.indexOf('(') + 1, func2_str.indexOf(')'));
console.log('arguments : ' + func2_args_str);
console.log('num of args: ' + func2_args_str.split(',').length);

console.log('\nTask 10');
console.log('deleted');
for (var k in context_before_loading){
if (!(k in context_after_loading)){
console.log(k + ":" + typeof context_before_loading[k]);
}
}
console.log('added');
for (var k in context_after_loading){
if (!(k in context_before_loading)){
console.log(k + ":" + typeof context_after_loading[k]);
}
}


});