-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
124 lines (107 loc) · 2.8 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var yargs = require('yargs');
var fs = require('fs');
var http = require('http');
var debug = require('debug')('word-counter:index');
var client_parse = require('./lib/client_parse.js');
var argv = yargs
.option('c', {
alias: 'client',
type: 'array'
})
.option('s', {
alias: 'search',
type: 'string'
})
.option('f', {
alias: 'file',
type: 'string'
})
.argv;
var
clients = argv.client,
search = argv.search,
filename = argv.file,
fileArray = [],
client_count = 0,
ocurrences = 0,
options = {
host: 'localhost',
port: 5050,
method: 'POST',
path: '/',
headers: {
'Content-Type': 'application/json'
}
},
request = null;
// Lê o arquivo
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err;
// Separa o arquivo em pedaços e guarda no array `fileArray`
fileArray = data.match(/([^\s]+\s\s*){1,200}/g);
mountOptions();
});
// Monta as opções de cada client para enviar
function mountOptions() {
for (var i = 0; i < clients.length; i++) {
var client = clients[i];
var postData = getPostData();
if (postData) {
sendRequest(client, postData);
} else {
debug('End of file reached');
}
}
};
// Pega um pedaço do texto e a palavra a ser buscada e monta um objeto para enviar ao client
function getPostData() {
var content = fileArray.pop();
if(content != null) {
return JSON.stringify({
'content': content,
'search': search
});
} else {
return false;
}
};
// Envia para o cliente um pedaço do texto e a palavra a ser buscada (Start dos requests)
function sendRequest(client, postData) {
var options = client_parse(client);
var request = http.request(options, process_client.bind(null, client));
do_request();
request.on('error', function(e) {
debug('Error processing request: ' + e.message);
});
request.end(postData);
};
// Resposta enviada do client
function process_client(client, res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
var chunk = JSON.parse(chunk);
debug('Client "%s" responded with %o', client, chunk);
var searchReturned = chunk.search;
var ocurrencesReturned = chunk.ocurrences;
ocurrences += ocurrencesReturned;
});
res.on('end', function(){
var postData = getPostData();
// Se ainda há algum pedaço do arquivo então envia outro para o client
if (postData) {
sendRequest(client, postData);
}
process_response();
});
};
// contador de requests
function do_request() {
client_count++;
}
// quando todos os requests retornarem mostra a mensagem final no terminal
function process_response() {
client_count--;
if (client_count === 0) {
console.log('Found %d ocurrences of "%s" on file %s.', ocurrences, search, filename);
}
}