-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbtcaverage.js
82 lines (78 loc) · 2.13 KB
/
btcaverage.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
var Q = require('q');
var request = require('request');
var async = require('async');
var smartaverage = require('smartaverage');
var providers = require('./providers');
var TIMEOUT = 20000;
var ACCEPTABLE_VARIANCE = 3;
var MINIMUM_VALUES_VARIANCE = 3;
/**
* FIND VALUE BY PATH
*
* @param {Object} jsonData
* @param {String} path
*/
function findValueByPath(jsonData, path){
var errorParts = false;
path.split('.').forEach(function(part){
if(!errorParts){
jsonData = jsonData[part];
if(!jsonData) errorParts = true;
}
});
return errorParts ? 0 : parseFloat(jsonData);
}
/**
* GET PRICE FROM API SERVICE
*
* @param {String} urlAPI
* @param {Function} callback
*/
function requestPrice(urlAPI, callback){
request({
method: 'GET',
url: urlAPI,
timeout: TIMEOUT,
maxRedirects: 2
}, function(error, res, body){
if(!error){
try{
var current = JSON.parse(body);
callback(current);
}catch(e){}
}
if(!current) {
callback({});
}
});
}
/**
* GET PRICE
*/
module.exports = function getPrice(){
var df = Q.defer();
async.parallel(providers.map(function(provider){
return function(callback){
requestPrice(provider.url, function(jsonResponse){
callback(null, findValueByPath(jsonResponse, provider.path));
});
}
}),
function(err, prices){
var infoAverage = smartaverage(ACCEPTABLE_VARIANCE, MINIMUM_VALUES_VARIANCE, prices);
if(infoAverage){
var pricesProviders = {};
prices.forEach(function(price, i){
pricesProviders[providers[i].name] = price;
});
df.resolve({
average: infoAverage.average,
pricesAverage: infoAverage.dataset,
prices: pricesProviders
});
}else{
df.reject(new Error('Was imposible get price average'));
}
});
return df.promise;
};