league-wrapper
Version:
REST API Wrapper for the League of Legends API
115 lines (96 loc) • 3.53 kB
JavaScript
;
const convert = require('./util/convert.js');
const RateLimit = require('./rate-limit.js');
const Client = require('node-rest-client').Client;
const client = new Client();
/* eslint-disable no-unused-vars */
const HEADER_RETRY_AFTER = 'retry-after';
const HEADER_RATE_LIMIT_COUNT = 'x-rate-limit-count';
const HEADER_RATE_LIMIT_REGEXP = /([0-9])+:([0-9]+),?/g;
const HEADER_RATE_LIMIT_TYPE = 'x-rate-limit-type';
/* eslint-enable no-unused-vars */
/**
* @class
* @alias module:LeagueWrapper~Request
* @property {module:LeagueWrapper~LeagueWrapper} api
* @property {module:LeagueWrapper/options~RequestOptions} options
*/
class Request {
/**
* @param {LeagueWrapper} api
* @param {module:LeagueWrapper/options~RequestOptions} options
*/
constructor(api, options) {
this.api = api;
this.options = options;
}
/**
* @param {function} [callback]
* @returns {Promise.<*>}
*/
execute(callback) {
const self = this;
// @todo: Request Cache
/** @type {module:LeagueWrapper/constant~Region} */
const region = self.options.region || self.api.options.region;
const rateLimits = this.options.respectRateLimit ? this.api.getRateLimits(region) : [];
return RateLimit.all(rateLimits).then(function(release) {
const promise = new Promise(function(resolve, reject) {
const host = self.options.host || region.getHostUrl();
const url = host + self.options.path;
const query = Object.assign(
{
// eslint-disable-next-line camelcase
api_key: self.api.apiKey // api_key is defined in snake_case by the REST API
},
self.options.query
);
const params = Object.assign(
{
region: region.region,
platformId: region.platformId
},
self.options.params
);
const request = client.get(
url,
{
path: params,
parameters: query
},
function (data, response) {
// @todo: Handle Headers
if (response.statusCode === 200) {
if (data.status) {
// @todo: Proper error naming
/*
* data: {status: {message: string, status_code: number}}
*/
const error = new Error(data.status.message + ' (Error ' + data.status.status_code + ')');
return reject(error) || callback && callback(error);
}
const convertedData = convert(data, self.options.returnType);
return release() || resolve(convertedData, response) || callback && callback(null, convertedData, response);
} else {
// @todo: Retry on failure?
const error = new Error('HTTPError ' + response.statusCode + ': ' + response.statusMessage);
return reject(error) || callback && callback(error);
}
}
);
request.on('requestTimeout', function (req) {
// @todo: Retry?
req.abort();
// @todo: Proper error naming
const error = new Error('Request timed out');
return reject(error) || callback && callback(error);
});
});
if (callback) {
promise.catch(callback);
}
return promise;
});
}
}
exports = module.exports = Request;