Example #1
0
File: api.js Project: iandoug/argo
function throttledRequest() {
    var requestArgs = arguments;

    limiter.removeTokens(1, function () {
        request.apply(null, requestArgs);
    });
}
Example #2
0
File: api.js Project: Chegeek/argo
function throttledRequest() {
    const requestArgs = arguments;

    limiter.removeTokens(1, () => {
        request.apply(null, requestArgs);
    });
}
Example #3
0
var getLatLon = function (searchString, callback) {
	nominatimLimiter.removeTokens(1, function() {
		request.get({
				'url': 'http://nominatim.openstreetmap.org/search', 
				'headers': { 'User-Agent': process.env.USER_AGENT },
				'qs': { 'format': 'json', 'q': searchString },
				'json': false
			},
			function (error, response, body) {
				if (error) {
					callback(error);
					return;
				}
				try {
					body = JSON.parse(body);
				} catch(err) {
					throw new Error("Nominatim did not return valid JSON content. Perhaps you broke the usage policy? Aborting.");
				}
				if (body.length === 0) {
					// the call to the API could not find anything
					callback(new Error("Nominatim did not return any results."));
					return;
				}
				callback(error, { 'lat': body[0].lat, 'lon': body[0].lon });
			});
	});
};
function saveToParse(data, className, idKey, cb) {
  var CN = Parse.Object.extend(className);
  var query = new Parse.Query(CN);
  query.equalTo(idKey, data[idKey]);
  parseLimiter.removeTokens(1, function() {
    query.find({
      success: function(results) {
        var obj;
        if (results.length) {
          obj = results[0];
        } else {
          obj = new CN();
        }
        obj.set(data);
        parseLimiter.removeTokens(1, function() {
          obj.save(null, {
            success: function(o) {
              cb(o);
            },
            error: function(o, e) {
              console.error(e);
            }
          });
        });
      }
    });
  });
}
Example #5
0
	function getRdio(){
		if (track.releases && track.releases.rdio && track.releases.rdio.length > 0){
			lmtRdio.removeTokens(1, function(er, remainingRequests) {
				rdio.makeRequest('get', {'keys':track.releases.rdio.join(',')}, function(er, r){
					if (er || r.status != 'ok'){
						cb(er);
					}else{
						var i = 0;
						for (rid in r.result){
							try{
								track.images.push(r.result[rid].icon);
								if(r.result[rid].releaseDate){
									track.releaseDate = r.result[rid].releaseDate;
								}
							}catch(e){}
							if (i == track.releases.rdio.length-1){
								getMb();
							}

							i++;
						}
					}
				});
			});
		}else{
			getMb();
		}
	}
Example #6
0
	exec('echoprint-codegen "' + fname + '"', function(er, sout, serr){
		if (er) return cb('local fingerprint: ' + er);
		if (serr) return cb('local fingerprint: ' + serr);
		var data = JSON.parse(sout)[0];
		if (data.error){
			return cb('local fingerprint: ' + data.error);
		}
		lmtEco.removeTokens(1, function(er, remainingRequests) {
			var record = { "code": data.code };
			if (data.metadata){
				record.metadata = data.metadata;
			}
			var r = request.post('http://developer.echonest.com/api/v4/song/identify?api_key=' + module.exports.secrets['echo'].key + '&format=json', function (er, r, body) {
				if (er) return cb('remote echo: ' + er);
				var bod = JSON.parse(body);
				if (bod.response.status.code !=0){
					return cb('remote echo: ' + bod.response.status.message);
				}
				cb(null, bod.response.songs[0]);
			});
			var form = r.form();
			form.append('query', JSON.stringify(record));
			buckets.forEach(function(bucket){
				form.append('bucket', bucket);
			});
		});
	});
                handler: async (params) => {
                    if (params[0].toLowerCase() === 'languages')
                        return 'You can find a list of languages here - https://msdn.microsoft.com/en-us/library/hh456380.aspx'

                    if (!params[1])
                        return

                    if (this.transLimiter.tryRemoveTokens(1)) {
                        let toL   = params.shift()
                          , fromL = 'en'

                        if (toL.indexOf(':') > -1) {
                            let spl = toL.split(':')
                            toL = spl[1]
                            fromL = spl[0]
                        }

                        let resp = await this.transApi.translateAsync({
                            text: params.join(' '),
                            from: fromL,
                            to: toL
                        })

                        return `${resp} (\`${fromL}:${toL}\`)`
                    }
                    // silently drop
                }
Example #8
0
function fetchComments(subreddit, callback) {
  limiter.removeTokens(1, function () {
    client.get(subreddit + ':last.comment.id', function (result, commentId) {
      var url = 'http://reddit.com/r/' + subreddit + '/comments.json';

      request({
        url: url,
        json: true
      }, function (error, response, body) {
        var comments = [];
        if (!error && response.statusCode === 200) {
          for (var comment of body.data.children) {
            if (comment.data.name == commentId)
              break;

            comments.push(comment);
          }
        }
        else {
          console.log(response);
        }

        callback(comments);
      });
    });
  });
}
Example #9
0
    var get = function (callback, params, path) {
        var url = host + path;
        if (debug) console.log('get: ' + url);

        // Throttle requests
        limiter.removeTokens(1, function (err, callbacks) {
            // err will only be set if we request more than the maximum number of
            // requests we set in the constructor

            // remainingRequests tells us how many additional requests could be sent
            // right this moment
            console.log('running limited request' + limiter.getTokensRemaining());
            request(url, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    if (debug) console.log('response body: ' + body);
                    callback(error, body);
                }
                else if (error) {
                    console.log('error: ' + err);
                }

            });
        });


    };
    this.get = function (state, city, callback) {
        var url = urljoin(host, apiKey, 'conditions', 'q', state, city + format);
        if (debug) {
            console.log('Send HTTP request: ' + url);
        }

        limiter.removeTokens(1, function(err, remainingRequests) {
          if (debug) {
            console.log('remainingRequests=', remainingRequests);
          }
          if (remainingRequests < 0) {
            console.log('Your wunderground API key exceeded its allotted usage today (' +
                '10 calls per minute limit).');
            //callback(false, body);
          } else {
            // Send http request if the token is available
            request(url, function (error, response, body) {
              if (!error && response.statusCode == 200) {
                if (debug) {
                  //console.log('response body: ' + body);
                }
                callback(error, body);
              } else {
                console.log('Request failed!');
              }
            });
          }
        });

    };
Example #11
0
 return new Promise(function(resolve, reject) {
   requestLimit.removeTokens(1, () => {
     request(options, function(error, response, body) {
       if (error) reject(error);
       else resolve({response: response, body: body});
     });
   });
 });
Example #12
0
function get(url, callback) {
  limiter.removeTokens(1, function(err, remainingRequests) {
    request(url, function(e, response, content) {
      if (e) {
        console.log("error when fetching " + url + " : " + e);
      } else {
        callback(response, content);
      }
    });
  });
}
Example #13
0
                handler: async () => {
                    if (this.meowLimiter.tryRemoveTokens(1)) {
                        let cat = (await axios.get('http://random.cat/meow')).data

                        if (!cat.file)
                            throw new Error('no cat file/api broke')
                        
                        return `meow! ${encodeURI(cat.file)}`
                    }
                    // otherwise silently drop command
                }
Example #14
0
function rateLimiter (req, res, next) {

   limiter.removeTokens(1, function(err, remainingRequests) {
      if (remainingRequests < 0) {
         res.writeHead(429, {'Content-Type': 'text/plain;charset=UTF-8'});
         res.end('Too Many Requests - your IP is being rate limited'+'\n'+'Need more responses? info@bitcharts.io');
      }else{
         return next();
      }
   });
}
Example #15
0
function throttledPriceLookup (asin, callback) {
	var workOffline = process.env.OFFLINE;
	if (workOffline) {
		return callback(null, {});
	}
	limiter.removeTokens(1, function(err) {
		if (err) {
			return callback(err);
		}
		priceAsin.fetch(asin, callback);
	});
}
Example #16
0
File: api.js Project: jacobk/inb4
 _.times(pageCount, function(idx) {
   var pageNumber = idx + 1;
   if (isCachedPage(pageNumber)) {
     page = RSVP.resolve(loadCachedPage(pageNumber));
     progress(page);
   } else {
     limiter.removeTokens(1, function(err, remaning) {
       page = getPage(idx + 1);
       progress(page);
     });
   }
 });
var withdrawalQueue = async.queue(function (task, callback) {
  limiter.removeTokens(1, function (err, remainingRequests) {
    if (remainingRequests < 0) {
      callback(true);
    }

    UserService.getBalance(task.userId, 1).then(function (result) {
      if (result) {
        callback(null, result);
      }
    });
  });
}, 1);
Example #18
0
    'fn': function (callback) {
      var options = {
        url: 'http://forum15.hkgolden.com/ProfilePage.aspx?userid={}'.format(req.params.id),
        headers: {
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0',
          'Referer': 'http://forum15.hkgolden.com'
        },
        timeout: REQUEST_TIMEOUT
      };

      desktopLimiter.removeTokens(1, function (err, remainingRequests) {
        if (err) {
          console.log(err);
        }
        request(options, function (error, response, body) {
          if (error !== null && 'code' in error && error.code === 'ETIMEDOUT') {
            req.code = 503;
            req.result = 'Timed out connecting to upstream.';
            callback();
            return;
          }
          if (error || response.statusCode !== 200) {
            req.code = 503;
            req.result = 'Server has received an invalid response from upstream.';
            callback();
            return;
          }
          var $ = cheerio.load(body);
          var websiteField = $('#ctl00_ContentPlaceHolder1_lb_website');
          if (!websiteField.length) {
            req.code = 503;
            req.result = 'Server has received an invalid response from upstream.';
            callback();
            return;
          }
          var publicToken = websiteField.text().trim();
          if (publicToken !== db['accounts'][req.params.id]['public_token']) {
            req.code = 417;
            req.result = 'Fetched public token does not match database\'s record.';
            callback();
            return;
          }
          db['accounts'][req.params.id]['verified'] = true;
          db['accounts'][req.params.id]['private_token'] = db['accounts'][req.params.id]['pending_private_token'];
          req.result = 'Successfully verified this account or this new private token.';
          saveDb();
          callback();
        });
      });
    },
Example #19
0
    say (channel, message, action = false) {
        if (!this.chatLimiter.tryRemoveTokens(1)) {
            return Xikbot.error('Could not send response, rate limited')
        }

        if (channel.indexOf('#') === -1) {
            channel = `#${channel}`
        }

        if (!action) {
            message = message.replace(/^[.|/]+/i, '')
        }

        this.client[action ? 'action' : 'say'](channel, message)
    }
 respondToEvent(type, value) {
   this.limiter.removeTokens(1, () => {
     if(type == 1){ 
       this.log(`Got temperatur update: ${value} for ${this.name}`)
       this.service.getCharacteristic(this.Characteristic.CurrentTemperature)
         .setValue(parseFloat(value)
       )
     }else{
       this.log(`Got humidity update: ${value} for ${this.name}`)
       this.service.getCharacteristic(this.Characteristic.CurrentRelativeHumidity)
         .setValue(parseFloat(value)
       )
     }
   })
 }
Example #21
0
    join (channel) {
        if (typeof channel === 'object') {
            return channel.forEach(channel => this.join(channel))
        }

        if (channel.indexOf('#') === -1) {
            channel = `#${channel}`
        }

        this.joinLimiter.removeTokens(1, () => {
            this.client.join(channel)
            ModuleManager.loadConfig(channel.substr(1))
                .catch(e => Log.error(e.stack))
            EventManager.emit('channel:join', channel)
        })
    }
Example #22
0
function fetchRottenTomatoesId(review) {
    var deferred = Q.defer();

    rtLimiter.removeTokens(1, function() {
        Request.get(review.rt_url, function(err, response, body) {
            if (!err && response && response.statusCode === 200 && body) {
                var rtId = findRottenTomatoesId(body);
                deferred.resolve(rtId);
            } else {
                console.log('Rotten Tomatoes error: ' + review.rt_url);
                deferred.reject();
            }
        });
    });

    return deferred.promise;
}
Example #23
0
        facebookRequest(url_orig, limit, function (err) {
            if (err && err.body && err.body.error && err.body.error.code === 613) {
                // We have to purge requests, we hit rate limit
                // We purge half each time (to allow faster recovery)
                var requests = parseInt(facebookLimiter.tokenBucket.content / 2) || 1;
                purgeWarning(requests);
                facebookLimiter.removeTokens(requests, function(err, remainingRequests) {
                    purgedWarning(remainingRequests);
                });
            }

            processQueue();

            var args = _.toArray(arguments);
            if (err) {
                args[0] = err.error
            }
            cb.apply(this, args);
        }, payload);
Example #24
0
function processQueue(purge_requests) {
    var f = facebookQueue.pop();
    if (!f) {
        return;
    }

    if (facebookQueue.length > 1000) {
        // Ups, queue is really long
        queueWarning();
    }

    facebookLimiter.removeTokens(1, function(err, remainingRequests) {
        f();

        if (remainingRequests < 10) {
            limiterWarning(remainingRequests);
        }
    });
}
 success: function(results) {
   var obj;
   if (results.length) {
     obj = results[0];
   } else {
     obj = new CN();
   }
   obj.set(data);
   parseLimiter.removeTokens(1, function() {
     obj.save(null, {
       success: function(o) {
         cb(o);
       },
       error: function(o, e) {
         console.error(e);
       }
     });
   });
 }
Example #26
0
repos.forEach(repo => {
  if (repo.status === 404) {
    console.log(`${repo.fullName} (${repo.status} status, skipping)`)
    return
  }

  if (Array.isArray(repo.releases)) {
    console.log(`${repo.fullName} (already has ${repo.releases.length} releases, skipping)`)
    return
  }

  limiter.removeTokens(1, function () {
    octo.repos(repo.owner.login, repo.name).releases.fetch({per_page: 100})
      .then(releases => {
        repo.releases = releases
        repo.save(`${repo.releases.length} releases`)
      })
  })
})
Example #27
0
    function callApi() {
        limiter.removeTokens(1, function(err, remainingRequests) {
            if (err || remainingRequests < 1) {
                console.log('remaining requests:', remainingRequests);
                deferred.reject(new Error({
                    status_code: 500,
                    status_text: 'To many calls to the API'
                }));
            } else {
                http.get(endpoint, function(res) {
                    var data = [];

                    res
                        .on('data', function(chunk) {
                            data.push(chunk);
                        })
                        .on('end', function() {
                            data = data.join('').trim();
                            var result;
                            try {
                                result = JSON.parse(data);
                            } catch(e) {
                                result = { status_code: 500, status_text: 'JSON parse failed' };
                                deferred.reject(new Error(result));
                            }

                            cacheWeather(key, {
                                timestamp: Date.now(), 
                                locale: location,
                                lookupType: lookupType, 
                                data: JSON.stringify(result)
                            });
                            
                            deferred.resolve(result);
                        });
                    //end res
                }).on('error', function(err) {
                    deferred.reject(new Error(err));
                });
            } // end if err
        }); //end api lookup 
    } //end function callApi()
Example #28
0
//
// Worker function
//
function openCalaisEnrich (content, cb) {
    //
    // Set up the headers
    //
    var postOptions =
    {
        host      : "api.opencalais.com",
        port      : "80",
        path      : "/tag/rs/enrich",
        method    : "POST",
        headers   : {
            "Content-Type"              : "text/raw",
            "Content-Length"            : content.length,
            "x-calais-licenseID"        : apiKey.Key,
            "outputFormat"              : "Application/JSON",
            "enableMetadataType"        : "GenericRelations,SocialTags",
            "calculateRelevanceScore"   : "true"

        }
    };

    // Set up the request
    limiter.removeTokens(1, function(err, remainingRequests) {
      var postRequest = http.request(postOptions, function(res)
      {
          res.setEncoding("utf8");

          var response = "";
          res.on("end", function() {
          cb(null, JSON.parse(response));
          });
          res.on("data", function (chunk) {
            response += chunk;
          });
      });
      postRequest.write(content);
      postRequest.end();
    });
}
Example #29
0
      curr.participants.forEach(function(current, index){
         
         limiter.removeTokens(1, function(err){
            if(err){console.log(err);}
            
               https.get('https://' + regionTwo + '.api.pvp.net/api/lol/' + region + '/v1.4/summoner/by-name/' + current.summonerName + '?api_key=' + KEY, function(result){
                  var body = '';
                  result
                  .on('data', function(chunk){
                     body += chunk;
                  })
                  .on('end', function(){
                     defCount++;
                     try {
                     var obj = JSON.parse(body);
                     //console.log(obj);
                     
                     if(obj[Object.keys(obj)[0]].id){
                        IDs.push(obj[Object.keys(obj)[0]].id);
                        //console.log("\nID: " + obj[Object.keys(obj)[0]].id);
                     }
                     } catch(e){
                        console.log(e);
                        console.log(body);
                     }

                     if(defCount>48){
                        console.log("Resolved!");
                        namesDeferred.resolve();
                     }
                     
                  })
                  .on('error', function(err){
                     console.log("An error was encountered.");
                     console.log(err);
                  });
               });
         })
      });
    socket.on('warriorSelection', function(selectedId) {

        // limit the incoming events to help prevent hacking
        limiter.removeTokens(1, function(err, remainingRequests) {
            // disconnect malicious users 
            if (remainingRequests < 0) {
                socket.emit('tooManyRequests');
                socket.disconnect('unauthorized');
            }
            // otherwise, process the incoming request
            else {
                console.log('warriorSelection', selectedId);
                var newWarriors = warriors.map(function(warrior) {
                    if (warrior.id === selectedId) warrior.wins++;
                    return warrior;
                });
                io.sockets.emit('allWarriorsData', newWarriors);
                warriors = newWarriors;
            }
        });

    });