diff --git a/lib/server/commander.js b/lib/server/commander.js index b8d5ec87..64a2eafc 100644 --- a/lib/server/commander.js +++ b/lib/server/commander.js @@ -37,71 +37,48 @@ * @param pFiles */ function readDir(params, error, names) { - var n, stats, filesData, fill, fileParams, + var length = names.length, + funcs = {}, p = params, dirPath = format.addSlashToEnd(p.path); - if (error) - Util.exec(p.callback, error); - else { - /* Получаем информацию о файлах */ - n = names.length, - stats = {}, + if (error) { + p.callback(error); + } else { - filesData = { - names : names, - stats : stats, - callback : p.callback, - path : p.path - }, - - fill = fillJSON.bind(null, filesData); - - if (!n) - fillJSON(filesData); + if (!length) + funcs.exec = Util.exec.ret; else names.forEach(function(name) { - fileParams = { - callback : fill, - count : n, - name : name, - stats : stats, - }; + var path = dirPath + name; - fs.lstat(dirPath + name, onStat.bind(null, fileParams)); + funcs[name] = Util.exec.with(getStat, name, path); }); + + Util.exec.parallel(funcs, function(error, files) { + fillJSON(dirPath, files || {}, p.callback); + }); + } } - /** - * async getting file states - * and putting it to stats object - */ - function onStat(params, error, stat) { - var n, keys, p = params; - - if (!error) - p.stats[p.name] = stat; - else - p.stats[p.name] = { + function getStat(name, path, callback) { + fs.lstat(path, function(error, data) { + callback(null, data || { 'mode' : 0, 'size' : 0, 'isDirectory' : Util.retFalse - }; - - keys = Object.keys(p.stats); - n = keys.length; - - if (p.count === n) - Util.exec(p.callback); + }); + }); } - function parseStats(names, stats) { + + function parseStats(stats) { var files; - Util.checkArgs(arguments, ['names', 'stats']); + Util.checkArgs(arguments, ['stats']); - files = names.map(function(name) { + files = Object.keys(stats).map(function(name) { var file, isDir, size, mode, modeStr, stat = stats[name], owner = stat.uid; @@ -132,9 +109,8 @@ * * @param params - { files, stats, path } */ - function fillJSON(params) { - var p = params, - files, + function fillJSON(path, stats, callback) { + var files, json = { path : '', @@ -143,12 +119,12 @@ Util.checkArgs(arguments, ['params']); - files = parseStats(p.names, p.stats); + files = parseStats(stats); json.files = changeOrder(files); - json.path = format.addSlashToEnd(p.path); + json.path = format.addSlashToEnd(path); changeUIDToName(json, function(error) { - p.callback(error, json); + callback(error, json); }); }