New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

anx-api

Package Overview
Dependencies
Maintainers
2
Versions
59
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

anx-api - npm Package Compare versions

Comparing version 6.1.0 to 7.0.0-1

.vscode/launch.json

4

CHANGELOG.md

@@ -5,2 +5,6 @@ # Change Log

## v7.0.0
* [major] Converted project to typescript
## v6.1.0

@@ -7,0 +11,0 @@

2

examples/basic.js

@@ -1,3 +0,1 @@

/* eslint func-names: 0, no-console: 0 */
var AnxApi = require('anx-api');

@@ -4,0 +2,0 @@

@@ -1,358 +0,254 @@

'use strict';
var _defaults2 = require('lodash/defaults');
var _defaults3 = _interopRequireDefault(_defaults2);
var _trimStart2 = require('lodash/trimStart');
var _trimStart3 = _interopRequireDefault(_trimStart2);
var _get3 = require('lodash/get');
var _get4 = _interopRequireDefault(_get3);
var _pick2 = require('lodash/pick');
var _pick3 = _interopRequireDefault(_pick2);
var _forEach2 = require('lodash/forEach');
var _forEach3 = _interopRequireDefault(_forEach2);
var _isEmpty2 = require('lodash/isEmpty');
var _isEmpty3 = _interopRequireDefault(_isEmpty2);
var _assign2 = require('lodash/assign');
var _assign3 = _interopRequireDefault(_assign2);
var _isString2 = require('lodash/isString');
var _isString3 = _interopRequireDefault(_isString2);
var _isUndefined2 = require('lodash/isUndefined');
var _isUndefined3 = _interopRequireDefault(_isUndefined2);
var _isNull2 = require('lodash/isNull');
var _isNull3 = _interopRequireDefault(_isNull2);
var _qs = require('qs');
var _qs2 = _interopRequireDefault(_qs);
var _urlJoin = require('url-join');
var _urlJoin2 = _interopRequireDefault(_urlJoin);
var _errors = require('./errors');
var _errors2 = _interopRequireDefault(_errors);
var _package = require('../package.json');
var _package2 = _interopRequireDefault(_package);
var _axiosAdapter = require('./axiosAdapter');
var _axiosAdapter2 = _interopRequireDefault(_axiosAdapter);
var _rateLimitAdapter = require('./rateLimitAdapter');
var _rateLimitAdapter2 = _interopRequireDefault(_rateLimitAdapter);
var _concurrencyAdapter = require('./concurrencyAdapter');
var _concurrencyAdapter2 = _interopRequireDefault(_concurrencyAdapter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DEFAULT_CHUNK_SIZE = 100;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const query = require("qs");
const urlJoin = require("url-join");
const axiosAdapter_1 = require("./axiosAdapter");
const concurrencyAdapter_1 = require("./concurrencyAdapter");
const errors = require("./errors");
const rateLimitAdapter_1 = require("./rateLimitAdapter");
const packageJson = require('../package.json');
const DEFAULT_CHUNK_SIZE = 100;
var Method;
(function (Method) {
Method["GET"] = "GET";
Method["POST"] = "POST";
Method["PUT"] = "PUT";
Method["DELETE"] = "DELETE";
})(Method = exports.Method || (exports.Method = {}));
function _hasValue(value) {
return !((0, _isNull3.default)(value) || (0, _isUndefined3.default)(value));
return !(_.isNull(value) || _.isUndefined(value));
}
function _isInteger(value) {
return parseInt(value, 10) === +value;
return parseInt(value, 10) === +value;
}
function _normalizeOpts(opts, extendOpts) {
var newOpts = (0, _isString3.default)(opts) ? {
uri: opts
} : opts || {};
return (0, _assign3.default)({}, newOpts, extendOpts);
const newOpts = _.isString(opts) ? {
uri: opts,
} : opts || {};
return _.assign({ method: null }, newOpts, extendOpts);
}
function _statusOk(body) {
return !!body && !!body.response && body.response.status === 'OK';
function statusOk(body) {
return !!body && !!body.response && body.response.status === 'OK';
}
exports.statusOk = statusOk;
function __request(opts) {
var _self = this;
return new Promise(function requestPromise(resolve, reject) {
var params;
var startTime = new Date().getTime();
if ((0, _isEmpty3.default)(_self._config.target)) {
return reject(new _errors2.default.TargetError(opts, 'Target not set'));
}
// Validate Opts
(0, _forEach3.default)((0, _pick3.default)(opts, ['startElement', 'numElements']), function validate(value, opt) {
if (_hasValue(value) && !_isInteger(value)) {
return reject(new _errors2.default.ArgumentError(opts, 'Invalid ' + opt));
}
return null;
});
// Configure Options
var reqOpts = (0, _assign3.default)({}, {
rejectUnauthorized: false,
headers: (0, _assign3.default)({}, _self._config.headers)
});
reqOpts.timeout = opts.timeout || _self._config.timeout;
reqOpts.method = (opts.method || 'GET').toUpperCase();
reqOpts.params = (0, _assign3.default)({}, opts.params);
reqOpts.body = opts.body;
reqOpts.encodeParams = (0, _get4.default)(opts, 'encodeParams', false);
if (_self._config.userAgent) {
reqOpts.headers['User-Agent'] = _self._config.userAgent;
}
if (!opts.noAuth && !opts.auth && _self._config.token) {
reqOpts.headers.Authorization = _self._config.token;
}
if (opts.mimeType) {
reqOpts.headers.Accept = opts.mimeType;
if (opts.method === 'POST' || opts.method === 'PUT') {
reqOpts.headers['Content-Type'] = opts.mimeType;
}
} else {
// Default Accept to application/json
reqOpts.headers.Accept = (0, _get4.default)(opts, 'headers.Accept', 'application/json');
// Default Content-Type to application/json for POSTs and PUTs
if (reqOpts.method === 'POST' || reqOpts.method === 'PUT') {
reqOpts.headers['Content-Type'] = (0, _get4.default)(opts, 'headers.Content-Type', 'application/json');
}
}
reqOpts.headers = (0, _assign3.default)({}, reqOpts.headers, opts.headers);
reqOpts.uri = (0, _urlJoin2.default)(_self._config.target, (0, _trimStart3.default)(opts.uri, '/'));
// Configure Parameters
if (_hasValue(opts.startElement)) {
reqOpts.params.start_element = +opts.startElement;
}
if (_hasValue(opts.numElements)) {
reqOpts.params.num_elements = +opts.numElements;
reqOpts.params.start_element = +opts.startElement || reqOpts.params.start_element || 0; // startElement is required if numElements is set
}
params = _qs2.default.stringify(reqOpts.params, { encode: reqOpts.encodeParams });
if (params !== '') {
reqOpts.uri += opts.uri.indexOf('?') === -1 ? '?' : '&';
reqOpts.uri += params;
}
if (_self._config.beforeRequest) {
var beforeRequestOpts = _self._config.beforeRequest(reqOpts);
if (beforeRequestOpts) {
reqOpts = (0, _assign3.default)({}, reqOpts, beforeRequestOpts);
}
}
return _self._config.request(reqOpts).then(function success(res) {
var totalTime = new Date().getTime() - startTime;
var newRes = (0, _assign3.default)({
requestTime: res.requestTime || totalTime,
totalTime: new Date().getTime() - startTime
}, res);
if (_self._config.afterRequest) {
var afterRequestRes = _self._config.afterRequest(newRes);
if (afterRequestRes) {
newRes = (0, _assign3.default)({}, newRes, afterRequestRes);
}
}
if (newRes.statusCode >= 400) {
return reject(_errors2.default.buildError(reqOpts, newRes));
}
// Temporary fix
var errorId;
var errorCode;
if (newRes.body && newRes.body.response && newRes.body.response) {
errorId = newRes.body.response.error_id;
errorCode = newRes.body.response.error_code;
}
if (errorId === 'SYSTEM' && errorCode === 'SERVICE_UNAVAILABLE') {
return reject(_errors2.default.buildError(reqOpts, newRes));
}
if (errorId === 'SYSTEM' && errorCode === 'UNKNOWN') {
return reject(_errors2.default.buildError(reqOpts, newRes));
}
newRes.req = reqOpts;
return resolve(newRes);
}).catch(function failure(err) {
var newErr;
if (_self._config.afterRequest) {
newErr = _self._config.afterRequest(err);
}
return reject(_errors2.default.buildError(reqOpts, newErr || err));
});
});
const _self = this;
return new Promise((resolve, reject) => {
let params;
const startTime = new Date().getTime();
if (_.isEmpty(_self._config.target)) {
return reject(new errors.TargetError(opts, 'Target not set'));
}
// Validate Opts
_.forEach(_.pick(opts, ['startElement', 'numElements']), (value, opt) => {
if (_hasValue(value) && !_isInteger(value)) {
return reject(new errors.ArgumentError(opts, 'Invalid ' + opt));
}
return null;
});
// Configure Options
let reqOpts = _.assign({}, {
rejectUnauthorized: false,
headers: _.assign({}, _self._config.headers),
});
reqOpts.timeout = opts.timeout || _self._config.timeout;
reqOpts.method = (opts.method || Method.GET).toUpperCase();
reqOpts.params = _.assign({}, opts.params);
reqOpts.body = opts.body;
reqOpts.encodeParams = _.get(opts, 'encodeParams', false);
if (_self._config.userAgent) {
reqOpts.headers['User-Agent'] = _self._config.userAgent;
}
if (!opts.noAuth && !opts.auth && _self._config.token) {
reqOpts.headers.Authorization = _self._config.token;
}
if (opts.mimeType) {
reqOpts.headers.Accept = opts.mimeType;
if (opts.method === Method.POST || opts.method === Method.PUT) {
reqOpts.headers['Content-Type'] = opts.mimeType;
}
}
else {
// Default Accept to application/json
reqOpts.headers.Accept = _.get(opts, 'headers.Accept', 'application/json');
// Default Content-Type to application/json for POSTs and PUTs
if (reqOpts.method === Method.POST || reqOpts.method === Method.PUT) {
reqOpts.headers['Content-Type'] = _.get(opts, 'headers.Content-Type', 'application/json');
}
}
reqOpts.headers = _.assign({}, reqOpts.headers, opts.headers);
reqOpts.uri = urlJoin(_self._config.target, _.trimStart(opts.uri, '/'));
// Configure Parameters
if (_hasValue(opts.startElement)) {
reqOpts.params.start_element = +opts.startElement;
}
if (_hasValue(opts.numElements)) {
reqOpts.params.num_elements = +opts.numElements;
reqOpts.params.start_element = +opts.startElement || reqOpts.params.start_element || 0; // startElement is required if numElements is set
}
params = query.stringify(reqOpts.params, { encode: reqOpts.encodeParams });
if (params !== '') {
reqOpts.uri += (opts.uri.indexOf('?') === -1) ? '?' : '&';
reqOpts.uri += params;
}
if (_self._config.beforeRequest) {
const beforeRequestOpts = _self._config.beforeRequest(reqOpts);
if (beforeRequestOpts) {
reqOpts = _.assign({}, reqOpts, beforeRequestOpts);
}
}
return _self._config.request(reqOpts).then((res) => {
const totalTime = new Date().getTime() - startTime;
let newRes = _.assign({
requestTime: res.requestTime || totalTime,
totalTime: new Date().getTime() - startTime,
}, res);
if (_self._config.afterRequest) {
const afterRequestRes = _self._config.afterRequest(newRes);
if (afterRequestRes) {
newRes = _.assign({}, newRes, afterRequestRes);
}
}
if (newRes.statusCode >= 400) {
return reject(errors.buildError(reqOpts, newRes));
}
// Temporary fix
let errorId;
let errorCode;
if (newRes.body && newRes.body.response && newRes.body.response) {
errorId = newRes.body.response.error_id;
errorCode = newRes.body.response.error_code;
}
if (errorId === 'SYSTEM' && errorCode === 'SERVICE_UNAVAILABLE') {
return reject(errors.buildError(reqOpts, newRes));
}
if (errorId === 'SYSTEM' && errorCode === 'UNKNOWN') {
return reject(errors.buildError(reqOpts, newRes));
}
newRes.req = reqOpts;
return resolve(newRes);
}).catch((err) => {
let newErr;
if (_self._config.afterRequest) {
newErr = _self._config.afterRequest(err);
}
return reject(errors.buildError(reqOpts, newErr || err));
});
});
}
function AnxApi(config) {
this._config = (0, _defaults3.default)({}, config, {
request: (0, _axiosAdapter2.default)({
forceHttpAdaptor: config.environment === 'node'
}),
userAgent: 'anx-api/' + _package2.default.version,
timeout: 60 * 1000,
headers: {},
target: null,
token: null,
rateLimiting: true,
chunkSize: DEFAULT_CHUNK_SIZE
});
this.request = __request;
// Install optional rate limiting adapter
this.request = this._config.rateLimiting ? (0, _rateLimitAdapter2.default)((0, _assign3.default)({}, config, {
request: __request.bind(this)
})) : __request.bind(this);
// Install optional concurrency adapter
this._config.request = this._config.concurrencyLimit ? (0, _concurrencyAdapter2.default)({
limit: this._config.concurrencyLimit,
request: this._config.request
}) : this._config.request;
class AnxApi {
constructor(config) {
this._config = _.defaults({}, config, {
request: axiosAdapter_1.axiosAdapter({
forceHttpAdaptor: config.environment === 'node',
}),
userAgent: 'anx-api/' + packageJson.version,
timeout: 60 * 1000,
headers: {},
target: null,
token: null,
rateLimiting: true,
chunkSize: DEFAULT_CHUNK_SIZE,
});
this.request = __request;
// Install optional rate limiting adapter
this.request = this._config.rateLimiting ? rateLimitAdapter_1.rateLimitAdapter(_.assign({}, config, {
request: __request.bind(this),
})) : __request.bind(this);
// Install optional concurrency adapter
this._config.request = this._config.concurrencyLimit ? concurrencyAdapter_1.concurrencyAdapter({
limit: this._config.concurrencyLimit,
request: this._config.request,
}) : this._config.request;
}
_request(method, opts, extendOpts, payload) {
const newOpts = _normalizeOpts(opts, extendOpts);
newOpts.method = method || newOpts.method || Method.GET;
if (payload) {
newOpts.body = payload;
}
return this.request(newOpts);
}
request(opts, extendOpts) {
return this._request(null, opts, extendOpts);
}
get(opts, extendOpts) {
return this._request(Method.GET, opts, extendOpts);
}
getAll(opts, extendOpts) {
return new Promise((resolve, reject) => {
const newOpts = _normalizeOpts(opts, extendOpts);
let numElements = opts.numElements || 100;
let firstOutputTerm;
let elements = [];
let totalTime = 0;
const getAll = (startElement) => {
newOpts.startElement = startElement;
newOpts.numElements = numElements;
return this.get(newOpts).then((res) => {
if (!statusOk(res.body)) {
return reject(res);
}
const response = res.body.response;
const count = response.count || 0;
const outputTerm = response.dbg_info.output_term;
if (!firstOutputTerm) {
firstOutputTerm = outputTerm;
}
numElements = response.num_elements;
totalTime += response.dbg_info.time || 0;
elements = elements.concat(response[outputTerm]);
if (count <= startElement + numElements) {
const newResponse = _.assign({}, {
count: elements.length,
start_element: 0,
num_elements: elements.length,
dbg_info: _.assign({}, response.dbg_info, {
output_term: firstOutputTerm,
time: totalTime,
}),
});
newResponse[firstOutputTerm] = elements;
return resolve({ body: { response: newResponse } });
}
return getAll(startElement + numElements);
}).catch(reject);
};
return getAll(0);
});
}
post(opts, payload, extendOpts) {
return this._request(Method.POST, opts, extendOpts, payload);
}
put(opts, payload, extendOpts) {
return this._request(Method.PUT, opts, extendOpts, payload);
}
delete(opts, extendOpts) {
return this._request(Method.DELETE, opts, extendOpts);
}
login(username, password) {
const reqOpts = {
auth: {
username,
password,
},
};
return this.post('/auth', reqOpts).then((res) => {
if (res.statusCode === 200 && statusOk(res.body)) {
this._config.token = res.body.response.token;
return this._config.token;
}
throw errors.buildError(reqOpts, res);
});
}
switchUser(userId) {
return this.post('/auth', {
auth: {
switch_to_user: userId,
},
});
}
}
// Bind error types on the AnxApi namespace
(0, _assign3.default)(AnxApi, _errors2.default);
AnxApi.prototype._request = function _request(method, opts, extendOpts, payload) {
var newOpts = _normalizeOpts(opts, extendOpts);
newOpts.method = method || newOpts.method || 'GET';
if (payload) {
newOpts.body = payload;
}
return this.request(newOpts);
};
AnxApi.prototype.request = function _request(opts, extendOpts) {
return this._request(null, opts, extendOpts);
};
AnxApi.prototype.get = function _get(opts, extendOpts) {
return this._request('GET', opts, extendOpts);
};
AnxApi.prototype.getAll = function _getAll(opts, extendOpts) {
var _self = this;
return new Promise(function getAllPromise(resolve, reject) {
var newOpts = _normalizeOpts(opts, extendOpts);
var numElements = opts.numElements || 100;
var firstOutputTerm;
var elements = [];
var totalTime = 0;
function getAll(startElement) {
newOpts.startElement = startElement;
newOpts.numElements = numElements;
return _self.get(newOpts).then(function success(res) {
if (!AnxApi.statusOk(res.body)) {
return reject(res);
}
var response = res.body.response;
var count = response.count || 0;
var outputTerm = response.dbg_info.output_term;
if (!firstOutputTerm) {
firstOutputTerm = outputTerm;
}
numElements = response.num_elements;
totalTime += response.dbg_info.time || 0;
elements = elements.concat(response[outputTerm]);
if (count <= startElement + numElements) {
var newResponse = (0, _assign3.default)({}, {
count: elements.length,
start_element: 0,
num_elements: elements.length,
dbg_info: (0, _assign3.default)({}, response.dbg_info, {
output_term: firstOutputTerm,
time: totalTime
})
});
newResponse[firstOutputTerm] = elements;
return resolve({ body: { response: newResponse } });
}
return getAll(startElement + numElements);
}).catch(reject);
}
return getAll(0);
});
};
AnxApi.prototype.post = function _post(opts, payload, extendOpts) {
return this._request('POST', opts, extendOpts, payload);
};
AnxApi.prototype.put = function _put(opts, payload, extendOpts) {
return this._request('PUT', opts, extendOpts, payload);
};
AnxApi.prototype.delete = function _delete(opts, extendOpts) {
return this._request('DELETE', opts, extendOpts);
};
AnxApi.prototype.login = function _login(username, password) {
var _self = this;
var reqOpts = {
auth: {
username: username,
password: password
}
};
return _self.post('/auth', reqOpts).then(function success(res) {
if (res.statusCode === 200 && AnxApi.statusOk(res.body)) {
_self._config.token = res.body.response.token;
return _self._config.token;
}
throw AnxApi.buildError(reqOpts, res);
});
};
AnxApi.prototype.switchUser = function _switchUser(userId) {
var _self = this;
return _self.post('/auth', {
auth: {
switch_to_user: userId
}
});
};
AnxApi.statusOk = _statusOk;
module.exports = AnxApi;
exports.AnxApi = AnxApi;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsb0NBQW9DO0FBQ3BDLGlEQUE4QztBQUM5Qyw2REFBMEQ7QUFDMUQsbUNBQW1DO0FBQ25DLHlEQUFzRDtBQUV0RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUUvQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQWdDL0IsSUFBWSxNQUtYO0FBTEQsV0FBWSxNQUFNO0lBQ2pCLHFCQUFXLENBQUE7SUFDWCx1QkFBYSxDQUFBO0lBQ2IscUJBQVcsQ0FBQTtJQUNYLDJCQUFpQixDQUFBO0FBQ2xCLENBQUMsRUFMVyxNQUFNLEdBQU4sY0FBTSxLQUFOLGNBQU0sUUFLakI7QUFNRCxTQUFTLFNBQVMsQ0FBQyxLQUFVO0lBQzVCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFVO0lBQzdCLE9BQU8sUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBOEIsRUFBRSxVQUEyQjtJQUNsRixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEVBQUUsSUFBSTtLQUNULENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDZixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3hELENB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QUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQThCLEVBQUUsVUFBNEI7UUFDekUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUM5QyxNQUFNLE9BQU8sR0FBRztZQUNmLElBQUksRUFBRTtnQkFDTCxRQUFRO2dCQUNSLFFBQVE7YUFDUjtTQUNELENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQy9DLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2FBQzFCO1lBQ0QsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTSxVQUFVLENBQUMsTUFBYztRQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3pCLElBQUksRUFBRTtnQkFDTCxjQUFjLEVBQUUsTUFBTTthQUN0QjtTQUNELENBQUMsQ0FBQztJQUNKLENBQUM7Q0FFRDtBQXJJRCx3QkFxSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBxdWVyeSBmcm9tICdxcyc7XG5pbXBvcnQgKiBhcyB1cmxKb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7IGF4aW9zQWRhcHRlciB9IGZyb20gJy4vYXhpb3NBZGFwdGVyJztcbmltcG9ydCB7IGNvbmN1cnJlbmN5QWRhcHRlciB9IGZyb20gJy4vY29uY3VycmVuY3lBZGFwdGVyJztcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyByYXRlTGltaXRBZGFwdGVyIH0gZnJvbSAnLi9yYXRlTGltaXRBZGFwdGVyJztcblxuY29uc3QgcGFja2FnZUpzb24gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gMTAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb25maWcge1xuXHRjb25jdXJyZW5jeUxpbWl0PzogbnVtYmVyO1xuXHRlbnZpcm9ubWVudD86IHN0cmluZztcblx0cmF0ZUxpbWl0aW5nOiBib29sZWFuO1xuXHRyZXF1ZXN0PzogKG9wdHM6IGFueSkgPT4gYW55O1xuXHRiZWZvcmVSZXF1ZXN0PzogKG9wdHM6IGFueSkgPT4gYW55O1xuXHRhZnRlclJlcXVlc3Q/OiAob3B0czogYW55KSA9PiBhbnk7XG5cdHRhcmdldDogc3RyaW5nO1xuXHR0aW1lb3V0PzogbnVtYmVyO1xuXHR0b2tlbj86IHN0cmluZztcblx0dXNlckFnZW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHZW5lcmljT3B0aW9ucyB7XG5cdGF1dGg/OiBhbnk7XG5cdGVuY29kZVBhcmFtcz86IGJvb2xlYW47XG5cdGhlYWRlcnM/OiB7fTtcblx0bWltZVR5cGU/OiBzdHJpbmc7XG5cdG5vQXV0aD86IGFueTtcblx0bnVtRWxlbWVudHM/OiBudW1iZXI7XG5cdHBhcmFtcz86IHt9O1xuXHRzdGFydEVsZW1lbnQ/OiBudW1iZXI7XG5cdHRpbWVvdXQ/OiBudW1iZXI7XG5cdHVyaTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zV2l0aFBheWxvYWQgZXh0ZW5kcyBJR2VuZXJpY09wdGlvbnMge1xuXHRib2R5PzogYW55O1xufVxuXG5leHBvcnQgZW51bSBNZXRob2Qge1xuXHRHRVQgPVx0J0dFVCcsXG5cdFBPU1QgPSAnUE9TVCcsXG5cdFBVVCA9ICdQVVQnLFxuXHRERUxFVEUgPSAnREVMRVRFJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVxdWVzdE9wdGlvbnMgZXh0ZW5kcyBJT3B0aW9uc1dpdGhQYXlsb2FkIHtcblx0bWV0aG9kOiAoTWV0aG9kIHwgc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gX2hhc1ZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcblx0cmV0dXJuICEoXy5pc051bGwodmFsdWUpIHx8IF8uaXNVbmRlZmluZWQodmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gX2lzSW50ZWdlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApID09PSArdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVPcHRzKG9wdHM6IElHZW5lcmljT3B0aW9ucyB8IHN0cmluZywgZXh0ZW5kT3B0czogSUdlbmVyaWNPcHRpb25zKTogSVJlcXVlc3RPcHRpb25zIHtcblx0Y29uc3QgbmV3T3B0cyA9IF8uaXNTdHJpbmcob3B0cykgPyB7XG5cdFx0dXJpOiBvcHRzLFxuXHR9IDogb3B0cyB8fCB7fTtcblx0cmV0dXJuIF8uYXNzaWduKHsgbWV0aG9kOiBudWxsIH0sIG5ld09wdHMsIGV4dGVuZE9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhdHVzT2soYm9keSkge1xuXHRyZXR1cm4gISFib2R5ICYmICEhYm9keS5yZXNwb25zZSAmJiBib2R5LnJlc3BvbnNlLnN0YXR1cyA9PT0gJ09LJztcbn1cblxuZnVuY3Rpb24gX19yZXF1ZXN0KG9wdHM6IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG5cdGNvbnN0IF9zZWxmID0gdGhpcztcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRsZXQgcGFyYW1zO1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG5cdFx0aWYgKF8uaXNFbXB0eShfc2VsZi5fY29uZmlnLnRhcmdldCkpIHtcblx0XHRcdHJldHVybiByZWplY3QobmV3IGVycm9ycy5UYXJnZXRFcnJvcihvcHRzLCAnVGFyZ2V0IG5vdCBzZXQnKSk7XG5cdFx0fVxuXG5cdFx0Ly8gVmFsaWRhdGUgT3B0c1xuXHRcdF8uZm9yRWFjaChfLnBpY2sob3B0cywgWydzdGFydEVsZW1lbnQnLCAnbnVtRWxlbWVudHMnXSksICh2YWx1ZSwgb3B0KSA9PiB7XG5cdFx0XHRpZiAoX2hhc1ZhbHVlKHZhbHVlKSAmJiAhX2lzSW50ZWdlcih2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHJlamVjdChuZXcgZXJyb3JzLkFyZ3VtZW50RXJyb3Iob3B0cywgJ0ludmFsaWQgJyArIG9wdCkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSk7XG5cblx0XHQvLyBDb25maWd1cmUgT3B0aW9uc1xuXHRcdGxldCByZXFPcHRzOiBhbnkgPSBfLmFzc2lnbih7fSwge1xuXHRcdFx0cmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSxcblx0XHRcdGhlYWRlcnM6IF8uYXNzaWduKHt9LCBfc2VsZi5fY29uZmlnLmhlYWRlcnMpLFxuXHRcdH0pO1xuXG5cdFx0cmVxT3B0cy50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IF9zZWxmLl9jb25maWcudGltZW91dDtcblx0XHRyZXFPcHRzLm1ldGhvZCA9IChvcHRzLm1ldGhvZCB8fCBNZXRob2QuR0VUKS50b1VwcGVyQ2FzZSgpO1xuXHRcdHJlcU9wdHMucGFyYW1zID0gXy5hc3NpZ24oe30sIG9wdHMucGFyYW1zKTtcblx0XHRyZXFPcHRzLmJvZHkgPSBvcHRzLmJvZHk7XG5cdFx0cmVxT3B0cy5lbmNvZGVQYXJhbXMgPSBfLmdldChvcHRzLCAnZW5jb2RlUGFyYW1zJywgZmFsc2UpO1xuXG5cdFx0aWYgKF9zZWxmLl9jb25maWcudXNlckFnZW50KSB7XG5cdFx0XHRyZXFPcHRzLmhlYWRlcnNbJ1VzZXItQWdlbnQnXSA9IF9zZWxmLl9jb25maWcudXNlckFnZW50O1xuXHRcdH1cblxuXHRcdGlmICghb3B0cy5ub0F1dGggJiYgIW9wdHMuYXV0aCAmJiBfc2VsZi5fY29uZmlnLnRva2VuKSB7XG5cdFx0XHRyZXFPcHRzLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IF9zZWxmLl9jb25maWcudG9rZW47XG5cdFx0fVxuXG5cdFx0aWYgKG9wdHMubWltZVR5cGUpIHtcblx0XHRcdHJlcU9wdHMuaGVhZGVycy5BY2NlcHQgPSBvcHRzLm1pbWVUeXBlO1xuXHRcdFx0aWYgKG9wdHMubWV0aG9kID09PSBNZXRob2QuUE9TVCB8fCBvcHRzLm1ldGhvZCA9PT0gTWV0aG9kLlBVVCkge1xuXHRcdFx0XHRyZXFPcHRzLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gb3B0cy5taW1lVHlwZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRGVmYXVsdCBBY2NlcHQgdG8gYXBwbGljYXRpb24vanNvblxuXHRcdFx0cmVxT3B0cy5oZWFkZXJzLkFjY2VwdCA9IF8uZ2V0KG9wdHMsICdoZWFkZXJzLkFjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cblx0XHRcdC8vIERlZmF1bHQgQ29udGVudC1UeXBlIHRvIGFwcGxpY2F0aW9uL2pzb24gZm9yIFBPU1RzIGFuZCBQVVRzXG5cdFx0XHRpZiAocmVxT3B0cy5tZXRob2QgPT09IE1ldGhvZC5QT1NUIHx8IHJlcU9wdHMubWV0aG9kID09PSBNZXRob2QuUFVUKSB7XG5cdFx0XHRcdHJlcU9wdHMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBfLmdldChvcHRzLCAnaGVhZGVycy5Db250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJlcU9wdHMuaGVhZGVycyA9IF8uYXNzaWduKHt9LCByZXFPcHRzLmhlYWRlcnMsIG9wdHMuaGVhZGVycyk7XG5cblx0XHRyZXFPcHRzLnVyaSA9IHVybEpvaW4oX3NlbGYuX2NvbmZpZy50YXJnZXQsIF8udHJpbVN0YXJ0KG9wdHMudXJpLCAnLycpKTtcblxuXHRcdC8vIENvbmZpZ3VyZSBQYXJhbWV0ZXJzXG5cdFx0aWYgKF9oYXNWYWx1ZShvcHRzLnN0YXJ0RWxlbWVudCkpIHtcblx0XHRcdHJlcU9wdHMucGFyYW1zLnN0YXJ0X2VsZW1lbnQgPSArb3B0cy5zdGFydEVsZW1lbnQ7XG5cdFx0fVxuXHRcdGlmIChfaGFzVmFsdWUob3B0cy5udW1FbGVtZW50cykpIHtcblx0XHRcdHJlcU9wdHMucGFyYW1zLm51bV9lbGVtZW50cyA9ICtvcHRzLm51bUVsZW1lbnRzO1xuXHRcdFx0cmVxT3B0cy5wYXJhbXMuc3RhcnRfZWxlbWVudCA9ICtvcHRzLnN0YXJ0RWxlbWVudCB8fCByZXFPcHRzLnBhcmFtcy5zdGFydF9lbGVtZW50IHx8IDA7IC8vIHN0YXJ0RWxlbWVudCBpcyByZXF1aXJlZCBpZiBudW1FbGVtZW50cyBpcyBzZXRcblx0XHR9XG5cblx0XHRwYXJhbXMgPSBxdWVyeS5zdHJpbmdpZnkocmVxT3B0cy5wYXJhbXMsIHtlbmNvZGU6IHJlcU9wdHMuZW5jb2RlUGFyYW1zfSk7XG5cblx0XHRpZiAocGFyYW1zICE9PSAnJykge1xuXHRcdFx0cmVxT3B0cy51cmkgKz0gKG9wdHMudXJpLmluZGV4T2YoJz8nKSA9PT0gLTEpID8gJz8nIDogJyYnO1xuXHRcdFx0cmVxT3B0cy51cmkgKz0gcGFyYW1zO1xuXHRcdH1cblxuXHRcdGlmIChfc2VsZi5fY29uZmlnLmJlZm9yZVJlcXVlc3QpIHtcblx0XHRcdGNvbnN0IGJlZm9yZVJlcXVlc3RPcHRzID0gX3NlbGYuX2NvbmZpZy5iZWZvcmVSZXF1ZXN0KHJlcU9wdHMpO1xuXHRcdFx0aWYgKGJlZm9yZVJlcXVlc3RPcHRzKSB7XG5cdFx0XHRcdHJlcU9wdHMgPSBfLmFzc2lnbih7fSwgcmVxT3B0cywgYmVmb3JlUmVxdWVzdE9wdHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBfc2VsZi5fY29uZmlnLnJlcXVlc3QocmVxT3B0cykudGhlbigocmVzKSA9PiB7XG5cdFx0XHRjb25zdCB0b3RhbFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0VGltZTtcblxuXHRcdFx0bGV0IG5ld1JlcyA9IF8uYXNzaWduKHtcblx0XHRcdFx0cmVxdWVzdFRpbWU6IHJlcy5yZXF1ZXN0VGltZSB8fCB0b3RhbFRpbWUsXG5cdFx0XHRcdHRvdGFsVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydFRpbWUsXG5cdFx0XHR9LCByZXMpO1xuXG5cdFx0XHRpZiAoX3NlbGYuX2NvbmZpZy5hZnRlclJlcXVlc3QpIHtcblx0XHRcdFx0Y29uc3QgYWZ0ZXJSZXF1ZXN0UmVzID0gX3NlbGYuX2NvbmZpZy5hZnRlclJlcXVlc3QobmV3UmVzKTtcblx0XHRcdFx0aWYgKGFmdGVyUmVxdWVzdFJlcykge1xuXHRcdFx0XHRcdG5ld1JlcyA9IF8uYXNzaWduKHt9LCBuZXdSZXMsIGFmdGVyUmVxdWVzdFJlcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1Jlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuXHRcdFx0XHRyZXR1cm4gcmVqZWN0KGVycm9ycy5idWlsZEVycm9yKHJlcU9wdHMsIG5ld1JlcykpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUZW1wb3JhcnkgZml4XG5cdFx0XHRsZXQgZXJyb3JJZDtcblx0XHRcdGxldCBlcnJvckNvZGU7XG5cdFx0XHRpZiAobmV3UmVzLmJvZHkgJiYgbmV3UmVzLmJvZHkucmVzcG9uc2UgJiYgbmV3UmVzLmJvZHkucmVzcG9uc2UpIHtcblx0XHRcdFx0ZXJyb3JJZCA9IG5ld1Jlcy5ib2R5LnJlc3BvbnNlLmVycm9yX2lkO1xuXHRcdFx0XHRlcnJvckNvZGUgPSBuZXdSZXMuYm9keS5yZXNwb25zZS5lcnJvcl9jb2RlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVycm9ySWQgPT09ICdTWVNURU0nICYmIGVycm9yQ29kZSA9PT0gJ1NFUlZJQ0VfVU5BVkFJTEFCTEUnKSB7XG5cdFx0XHRcdHJldHVybiByZWplY3QoZXJyb3JzLmJ1aWxkRXJyb3IocmVxT3B0cywgbmV3UmVzKSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXJyb3JJZCA9PT0gJ1NZU1RFTScgJiYgZXJyb3JDb2RlID09PSAnVU5LTk9XTicpIHtcblx0XHRcdFx0cmV0dXJuIHJlamVjdChlcnJvcnMuYnVpbGRFcnJvcihyZXFPcHRzLCBuZXdSZXMpKTtcblx0XHRcdH1cblxuXHRcdFx0bmV3UmVzLnJlcSA9IHJlcU9wdHM7XG5cblx0XHRcdHJldHVybiByZXNvbHZlKG5ld1Jlcyk7XG5cdFx0fSkuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0bGV0IG5ld0Vycjtcblx0XHRcdGlmIChfc2VsZi5fY29uZmlnLmFmdGVyUmVxdWVzdCkge1xuXHRcdFx0XHRuZXdFcnIgPSBfc2VsZi5fY29uZmlnLmFmdGVyUmVxdWVzdChlcnIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlamVjdChlcnJvcnMuYnVpbGRFcnJvcihyZXFPcHRzLCBuZXdFcnIgfHwgZXJyKSk7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgQW54QXBpIHtcblx0cHVibGljIF9jb25maWc6IElDb25maWc7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnOiBJQ29uZmlnKSB7XG5cdFx0dGhpcy5fY29uZmlnID0gXy5kZWZhdWx0cyh7fSwgY29uZmlnLCB7XG5cdFx0XHRyZXF1ZXN0OiBheGlvc0FkYXB0ZXIoe1xuXHRcdFx0XHRmb3JjZUh0dHBBZGFwdG9yOiBjb25maWcuZW52aXJvbm1lbnQgPT09ICdub2RlJyxcblx0XHRcdH0pLFxuXHRcdFx0dXNlckFnZW50OiAnYW54LWFwaS8nICsgcGFja2FnZUpzb24udmVyc2lvbixcblx0XHRcdHRpbWVvdXQ6IDYwICogMTAwMCxcblx0XHRcdGhlYWRlcnM6IHt9LFxuXHRcdFx0dGFyZ2V0OiBudWxsLFxuXHRcdFx0dG9rZW46IG51bGwsXG5cdFx0XHRyYXRlTGltaXRpbmc6IHRydWUsXG5cdFx0XHRjaHVua1NpemU6IERFRkFVTFRfQ0hVTktfU0laRSxcblx0XHR9KTtcblxuXHRcdHRoaXMucmVxdWVzdCA9IF9fcmVxdWVzdDtcblxuXHRcdC8vIEluc3RhbGwgb3B0aW9uYWwgcmF0ZSBsaW1pdGluZyBhZGFwdGVyXG5cdFx0dGhpcy5yZXF1ZXN0ID0gdGhpcy5fY29uZmlnLnJhdGVMaW1pdGluZyA/IHJhdGVMaW1pdEFkYXB0ZXIoXy5hc3NpZ24oe30sIGNvbmZpZywge1xuXHRcdFx0cmVxdWVzdDogX19yZXF1ZXN0LmJpbmQodGhpcyksXG5cdFx0fSkpIDogX19yZXF1ZXN0LmJpbmQodGhpcyk7XG5cblx0XHQvLyBJbnN0YWxsIG9wdGlvbmFsIGNvbmN1cnJlbmN5IGFkYXB0ZXJcblx0XHR0aGlzLl9jb25maWcucmVxdWVzdCA9IHRoaXMuX2NvbmZpZy5jb25jdXJyZW5jeUxpbWl0ID8gY29uY3VycmVuY3lBZGFwdGVyKHtcblx0XHRcdGxpbWl0OiB0aGlzLl9jb25maWcuY29uY3VycmVuY3lMaW1pdCxcblx0XHRcdHJlcXVlc3Q6IHRoaXMuX2NvbmZpZy5yZXF1ZXN0LFxuXHRcdH0pIDogdGhpcy5fY29uZmlnLnJlcXVlc3Q7XG5cdH1cblxuXHRwdWJsaWMgX3JlcXVlc3QobWV0aG9kOiBNZXRob2QsIG9wdHM6IElHZW5lcmljT3B0aW9ucyB8IHN0cmluZywgZXh0ZW5kT3B0czogSUdlbmVyaWNPcHRpb25zLCBwYXlsb2FkPyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbmV3T3B0cyA9IF9ub3JtYWxpemVPcHRzKG9wdHMsIGV4dGVuZE9wdHMpO1xuXHRcdG5ld09wdHMubWV0aG9kID0gbWV0aG9kIHx8IG5ld09wdHMubWV0aG9kIHx8IE1ldGhvZC5HRVQ7XG5cdFx0aWYgKHBheWxvYWQpIHtcblx0XHRcdG5ld09wdHMuYm9keSA9IHBheWxvYWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3QobmV3T3B0cyk7XG5cdH1cblxuXHRwdWJsaWMgcmVxdWVzdChvcHRzOiBJUmVxdWVzdE9wdGlvbnMsIGV4dGVuZE9wdHM/OiBJR2VuZXJpY09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuXHRcdHJldHVybiB0aGlzLl9yZXF1ZXN0KG51bGwsIG9wdHMsIGV4dGVuZE9wdHMpO1xuXHR9XG5cblx0cHVibGljIGdldChvcHRzOiBJR2VuZXJpY09wdGlvbnMgfCBzdHJpbmcsIGV4dGVuZE9wdHM/OiBJR2VuZXJpY09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuXHRcdHJldHVybiB0aGlzLl9yZXF1ZXN0KE1ldGhvZC5HRVQsIG9wdHMsIGV4dGVuZE9wdHMpO1xuXHR9XG5cblx0cHVibGljIGdldEFsbChvcHRzOiBJR2VuZXJpY09wdGlvbnMsIGV4dGVuZE9wdHMpOiBQcm9taXNlPGFueT4ge1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IG5ld09wdHMgPSBfbm9ybWFsaXplT3B0cyhvcHRzLCBleHRlbmRPcHRzKTtcblx0XHRcdGxldCBudW1FbGVtZW50cyA9IG9wdHMubnVtRWxlbWVudHMgfHwgMTAwO1xuXHRcdFx0bGV0IGZpcnN0T3V0cHV0VGVybTtcblx0XHRcdGxldCBlbGVtZW50cyA9IFtdO1xuXHRcdFx0bGV0IHRvdGFsVGltZSA9IDA7XG5cblx0XHRcdGNvbnN0IGdldEFsbCA9IChzdGFydEVsZW1lbnQpID0+IHtcblx0XHRcdFx0bmV3T3B0cy5zdGFydEVsZW1lbnQgPSBzdGFydEVsZW1lbnQ7XG5cdFx0XHRcdG5ld09wdHMubnVtRWxlbWVudHMgPSBudW1FbGVtZW50cztcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXQobmV3T3B0cykudGhlbigocmVzKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFzdGF0dXNPayhyZXMuYm9keSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiByZWplY3QocmVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSByZXMuYm9keS5yZXNwb25zZTtcblx0XHRcdFx0XHRjb25zdCBjb3VudCA9IHJlc3BvbnNlLmNvdW50IHx8IDA7XG5cdFx0XHRcdFx0Y29uc3Qgb3V0cHV0VGVybSA9IHJlc3BvbnNlLmRiZ19pbmZvLm91dHB1dF90ZXJtO1xuXHRcdFx0XHRcdGlmICghZmlyc3RPdXRwdXRUZXJtKSB7XG5cdFx0XHRcdFx0XHRmaXJzdE91dHB1dFRlcm0gPSBvdXRwdXRUZXJtO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG51bUVsZW1lbnRzID0gcmVzcG9uc2UubnVtX2VsZW1lbnRzO1xuXG5cdFx0XHRcdFx0dG90YWxUaW1lICs9IHJlc3BvbnNlLmRiZ19pbmZvLnRpbWUgfHwgMDtcblx0XHRcdFx0XHRlbGVtZW50cyA9IGVsZW1lbnRzLmNvbmNhdChyZXNwb25zZVtvdXRwdXRUZXJtXSk7XG5cdFx0XHRcdFx0aWYgKGNvdW50IDw9IHN0YXJ0RWxlbWVudCArIG51bUVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdSZXNwb25zZSA9IF8uYXNzaWduKHt9LCB7XG5cdFx0XHRcdFx0XHRcdGNvdW50OiBlbGVtZW50cy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdHN0YXJ0X2VsZW1lbnQ6IDAsXG5cdFx0XHRcdFx0XHRcdG51bV9lbGVtZW50czogZWxlbWVudHMubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRkYmdfaW5mbzogXy5hc3NpZ24oe30sIHJlc3BvbnNlLmRiZ19pbmZvLCB7XG5cdFx0XHRcdFx0XHRcdFx0b3V0cHV0X3Rlcm06IGZpcnN0T3V0cHV0VGVybSxcblx0XHRcdFx0XHRcdFx0XHR0aW1lOiB0b3RhbFRpbWUsXG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRuZXdSZXNwb25zZVtmaXJzdE91dHB1dFRlcm1dID0gZWxlbWVudHM7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZSh7IGJvZHk6IHsgcmVzcG9uc2U6IG5ld1Jlc3BvbnNlIH0gfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBnZXRBbGwoc3RhcnRFbGVtZW50ICsgbnVtRWxlbWVudHMpO1xuXHRcdFx0XHR9KS5jYXRjaChyZWplY3QpO1xuXHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuIGdldEFsbCgwKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBwb3N0KG9wdHM6IElPcHRpb25zV2l0aFBheWxvYWQgfCBzdHJpbmcsIHBheWxvYWQsIGV4dGVuZE9wdHM/OiBJR2VuZXJpY09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuXHRcdHJldHVybiB0aGlzLl9yZXF1ZXN0KE1ldGhvZC5QT1NULCBvcHRzLCBleHRlbmRPcHRzLCBwYXlsb2FkKTtcblx0fVxuXG5cdHB1YmxpYyBwdXQob3B0czogSU9wdGlvbnNXaXRoUGF5bG9hZCB8IHN0cmluZywgcGF5bG9hZCwgZXh0ZW5kT3B0cz86IElHZW5lcmljT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuX3JlcXVlc3QoTWV0aG9kLlBVVCwgb3B0cywgZXh0ZW5kT3B0cywgcGF5bG9hZCk7XG5cdH1cblxuXHRwdWJsaWMgZGVsZXRlKG9wdHM6IElHZW5lcmljT3B0aW9ucyB8IHN0cmluZywgZXh0ZW5kT3B0cz86IElHZW5lcmljT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuX3JlcXVlc3QoTWV0aG9kLkRFTEVURSwgb3B0cywgZXh0ZW5kT3B0cyk7XG5cdH1cblxuXHRwdWJsaWMgbG9naW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgcmVxT3B0cyA9IHtcblx0XHRcdGF1dGg6IHtcblx0XHRcdFx0dXNlcm5hbWUsXG5cdFx0XHRcdHBhc3N3b3JkLFxuXHRcdFx0fSxcblx0XHR9O1xuXHRcdHJldHVybiB0aGlzLnBvc3QoJy9hdXRoJywgcmVxT3B0cykudGhlbigocmVzKSA9PiB7XG5cdFx0XHRpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCAmJiBzdGF0dXNPayhyZXMuYm9keSkpIHtcblx0XHRcdFx0dGhpcy5fY29uZmlnLnRva2VuID0gcmVzLmJvZHkucmVzcG9uc2UudG9rZW47XG5cdFx0XHRcdHJldHVybiB0aGlzLl9jb25maWcudG9rZW47XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcnMuYnVpbGRFcnJvcihyZXFPcHRzLCByZXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIHN3aXRjaFVzZXIodXNlcklkOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnBvc3QoJy9hdXRoJywge1xuXHRcdFx0YXV0aDoge1xuXHRcdFx0XHRzd2l0Y2hfdG9fdXNlcjogdXNlcklkLFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG59XG4iXX0=

@@ -1,55 +0,40 @@

'use strict';
var _isUndefined2 = require('lodash/isUndefined');
var _isUndefined3 = _interopRequireDefault(_isUndefined2);
var _axios = require('axios');
var _axios2 = _interopRequireDefault(_axios);
var _http = require('axios/lib/adapters/http');
var _http2 = _interopRequireDefault(_http);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
module.exports = function requestAdaptor(config) {
return function (opts) {
var url = opts.uri;
var axiosOpts = {
timeout: opts.timeout,
method: opts.method.toLowerCase(),
headers: opts.headers
};
if (config.forceHttpAdaptor) {
axiosOpts.adapter = _http2.default;
}
if (!(0, _isUndefined3.default)(opts.body)) {
axiosOpts.data = opts.body;
}
var startTime = new Date().getTime();
return (0, _axios2.default)(url, axiosOpts, opts.body).then(function requestSuccess(res) {
return {
statusCode: res.status,
headers: res.headers,
body: res.data,
requestTime: new Date().getTime() - startTime
};
}).catch(function requestError(res) {
if (!res.response) {
throw res;
}
return {
statusCode: res.response.status,
headers: res.response.headers,
body: res.response.data,
requestTime: new Date().getTime() - startTime
};
});
};
};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = require("axios");
const http_1 = require("axios/lib/adapters/http");
const _ = require("lodash");
exports.axiosAdapter = (config) => (opts) => {
const url = opts.uri;
const axiosConfig = {
url,
timeout: opts.timeout,
method: opts.method.toLowerCase(),
headers: opts.headers,
};
if (config.forceHttpAdaptor) {
axiosConfig.adapter = http_1.default;
}
if (!_.isUndefined(opts.body)) {
axiosConfig.data = opts.body;
}
const startTime = new Date().getTime();
return axios_1.default(axiosConfig).then((res) => {
return {
statusCode: res.status,
headers: res.headers,
body: res.data,
requestTime: new Date().getTime() - startTime,
};
}).catch((err) => {
if (!err.response) {
throw err;
}
return {
statusCode: err.response.status,
headers: err.response.headers,
body: err.response.data,
requestTime: new Date().getTime() - startTime,
};
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpb3NBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F4aW9zQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFrRDtBQUNsRCxrREFBa0Q7QUFDbEQsNEJBQTRCO0FBU2YsUUFBQSxZQUFZLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFzQixFQUFFO0lBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDckIsTUFBTSxXQUFXLEdBQXVCO1FBQ3ZDLEdBQUc7UUFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87UUFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztLQUNyQixDQUFDO0lBRUYsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7UUFDNUIsV0FBVyxDQUFDLE9BQU8sR0FBRyxjQUFXLENBQUM7S0FDbEM7SUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDOUIsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQzdCO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUV2QyxPQUFPLGVBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN0QyxPQUFPO1lBQ04sVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ3RCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztZQUNwQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTO1NBQzdDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNsQixNQUFNLEdBQUcsQ0FBQztTQUNWO1FBQ0QsT0FBTztZQUNOLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU07WUFDL0IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM3QixJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLFNBQVM7U0FDN0MsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCBodHRwQWRhcHRlciBmcm9tICdheGlvcy9saWIvYWRhcHRlcnMvaHR0cCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3BvbnNlIHtcblx0c3RhdHVzQ29kZTogYW55O1xuXHRoZWFkZXJzOiBhbnk7XG5cdGJvZHk6IGFueTtcblx0cmVxdWVzdFRpbWU6IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IGF4aW9zQWRhcHRlciA9IChjb25maWcpID0+IChvcHRzKTogUHJvbWlzZTxJUmVzcG9uc2U+ID0+IHtcblx0Y29uc3QgdXJsID0gb3B0cy51cmk7XG5cdGNvbnN0IGF4aW9zQ29uZmlnOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG5cdFx0dXJsLFxuXHRcdHRpbWVvdXQ6IG9wdHMudGltZW91dCxcblx0XHRtZXRob2Q6IG9wdHMubWV0aG9kLnRvTG93ZXJDYXNlKCksXG5cdFx0aGVhZGVyczogb3B0cy5oZWFkZXJzLFxuXHR9O1xuXG5cdGlmIChjb25maWcuZm9yY2VIdHRwQWRhcHRvcikge1xuXHRcdGF4aW9zQ29uZmlnLmFkYXB0ZXIgPSBodHRwQWRhcHRlcjtcblx0fVxuXG5cdGlmICghXy5pc1VuZGVmaW5lZChvcHRzLmJvZHkpKSB7XG5cdFx0YXhpb3NDb25maWcuZGF0YSA9IG9wdHMuYm9keTtcblx0fVxuXG5cdGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG5cdHJldHVybiBheGlvcyhheGlvc0NvbmZpZykudGhlbigocmVzKSA9PiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHN0YXR1c0NvZGU6IHJlcy5zdGF0dXMsXG5cdFx0XHRoZWFkZXJzOiByZXMuaGVhZGVycyxcblx0XHRcdGJvZHk6IHJlcy5kYXRhLFxuXHRcdFx0cmVxdWVzdFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lLFxuXHRcdH07XG5cdH0pLmNhdGNoKChlcnIpID0+IHtcblx0XHRpZiAoIWVyci5yZXNwb25zZSkge1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0c3RhdHVzQ29kZTogZXJyLnJlc3BvbnNlLnN0YXR1cyxcblx0XHRcdGhlYWRlcnM6IGVyci5yZXNwb25zZS5oZWFkZXJzLFxuXHRcdFx0Ym9keTogZXJyLnJlc3BvbnNlLmRhdGEsXG5cdFx0XHRyZXF1ZXN0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydFRpbWUsXG5cdFx0fTtcblx0fSk7XG59O1xuIl19

@@ -1,64 +0,50 @@

'use strict';
var _remove2 = require('lodash/remove');
var _remove3 = _interopRequireDefault(_remove2);
var _assign2 = require('lodash/assign');
var _assign3 = _interopRequireDefault(_assign2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ConcurrencyQueue(options) {
this.options = (0, _assign3.default)({}, options);
this.queue = [];
this.running = [];
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
class ConcurrencyQueue {
constructor(options) {
this.options = _.assign({}, options);
this.queue = [];
this.running = [];
}
push(opts) {
if (this.running.length < this.options.limit) {
const requestPromise = this.options.request(opts).then(function success(res) {
this.finished(requestPromise);
return res;
}, function failure(err) {
this.finished(requestPromise);
throw err;
});
this.running.push(requestPromise);
return requestPromise;
}
return new Promise((resolve, reject) => {
const reqInfo = { opts, resolve, reject };
this.queue.push(reqInfo);
});
}
finished(requestPromise) {
_.remove(this.running, requestPromise);
if (this.queue.length > 0) {
this.makeRequest(this.queue.shift());
}
}
makeRequest(reqInfo) {
const requestPromise = this.options.request(reqInfo.opts).then((res) => {
this.finished(requestPromise);
reqInfo.resolve(res);
return null;
}).catch((err) => {
this.finished(requestPromise);
reqInfo.reject(err);
});
this.running.push(requestPromise);
}
}
ConcurrencyQueue.prototype.push = function _push(opts) {
var _self = this;
if (_self.running.length < _self.options.limit) {
var requestPromise = _self.options.request(opts).then(function success(res) {
_self.finished(requestPromise);
return res;
}, function failure(err) {
_self.finished(requestPromise);
throw err;
});
_self.running.push(requestPromise);
return requestPromise;
}
return new Promise(function queuedPromise(resolve, reject) {
var reqInfo = { opts: opts, resolve: resolve, reject: reject };
_self.queue.push(reqInfo);
});
exports.ConcurrencyQueue = ConcurrencyQueue;
exports.concurrencyAdapter = (options) => (opts) => {
const concurrencyQueue = new ConcurrencyQueue(options);
return concurrencyQueue.push(opts);
};
ConcurrencyQueue.prototype.finished = function _finished(requestPromise) {
var _self = this;
(0, _remove3.default)(_self.running, requestPromise);
if (_self.queue.length > 0) {
_self.makeRequest(_self.queue.shift());
}
};
ConcurrencyQueue.prototype.makeRequest = function _makeRequest(reqInfo) {
var _self = this;
var requestPromise = _self.options.request(reqInfo.opts).then(function success(res) {
_self.finished(requestPromise);
reqInfo.resolve(res);
return null;
}, function failure(err) {
_self.finished(requestPromise);
reqInfo.reject(err);
});
_self.running.push(requestPromise);
};
module.exports = function concurrencyAdapter(options) {
var concurrencyQueue = new ConcurrencyQueue(options);
return function concurrencyLimitedRequest(opts) {
return concurrencyQueue.push(opts);
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY3VycmVuY3lBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmN1cnJlbmN5QWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUE0QjtBQUc1QixNQUFhLGdCQUFnQjtJQUs1QixZQUFZLE9BQWdCO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLElBQUksQ0FBQyxJQUFJO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxPQUFPLENBQUMsR0FBRztnQkFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLENBQUM7WUFDWixDQUFDLEVBQUUsU0FBUyxPQUFPLENBQUMsR0FBRztnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxHQUFHLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sY0FBYyxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUSxDQUFDLGNBQWM7UUFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0YsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFPO1FBQ3pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBRUQ7QUFoREQsNENBZ0RDO0FBRVksUUFBQSxrQkFBa0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQWdCLEVBQUU7SUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IElDb25maWcgfSBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBjbGFzcyBDb25jdXJyZW5jeVF1ZXVlIHtcblx0cHJpdmF0ZSBvcHRpb25zOiBhbnk7XG5cdHByaXZhdGUgcXVldWU6IGFueVtdO1xuXHRwcml2YXRlIHJ1bm5pbmc6IGFueVtdO1xuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb25maWcpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBfLmFzc2lnbih7fSwgb3B0aW9ucyk7XG5cdFx0dGhpcy5xdWV1ZSA9IFtdO1xuXHRcdHRoaXMucnVubmluZyA9IFtdO1xuXHR9XG5cblx0cHVibGljIHB1c2gob3B0cyk6IFByb21pc2U8YW55PiB7XG5cdFx0aWYgKHRoaXMucnVubmluZy5sZW5ndGggPCB0aGlzLm9wdGlvbnMubGltaXQpIHtcblx0XHRcdGNvbnN0IHJlcXVlc3RQcm9taXNlID0gdGhpcy5vcHRpb25zLnJlcXVlc3Qob3B0cykudGhlbihmdW5jdGlvbiBzdWNjZXNzKHJlcykge1xuXHRcdFx0XHR0aGlzLmZpbmlzaGVkKHJlcXVlc3RQcm9taXNlKTtcblx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdH0sIGZ1bmN0aW9uIGZhaWx1cmUoZXJyKSB7XG5cdFx0XHRcdHRoaXMuZmluaXNoZWQocmVxdWVzdFByb21pc2UpO1xuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMucnVubmluZy5wdXNoKHJlcXVlc3RQcm9taXNlKTtcblx0XHRcdHJldHVybiByZXF1ZXN0UHJvbWlzZTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IHJlcUluZm8gPSB7IG9wdHMsIHJlc29sdmUsIHJlamVjdCB9O1xuXHRcdFx0dGhpcy5xdWV1ZS5wdXNoKHJlcUluZm8pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGZpbmlzaGVkKHJlcXVlc3RQcm9taXNlKTogdm9pZCB7XG5cdFx0Xy5yZW1vdmUodGhpcy5ydW5uaW5nLCByZXF1ZXN0UHJvbWlzZSk7XG5cdFx0aWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5tYWtlUmVxdWVzdCh0aGlzLnF1ZXVlLnNoaWZ0KCkpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBtYWtlUmVxdWVzdChyZXFJbmZvKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVxdWVzdFByb21pc2UgPSB0aGlzLm9wdGlvbnMucmVxdWVzdChyZXFJbmZvLm9wdHMpLnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0dGhpcy5maW5pc2hlZChyZXF1ZXN0UHJvbWlzZSk7XG5cdFx0XHRyZXFJbmZvLnJlc29sdmUocmVzKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0pLmNhdGNoKChlcnIpID0+IHtcblx0XHRcdHRoaXMuZmluaXNoZWQocmVxdWVzdFByb21pc2UpO1xuXHRcdFx0cmVxSW5mby5yZWplY3QoZXJyKTtcblx0XHR9KTtcblx0XHR0aGlzLnJ1bm5pbmcucHVzaChyZXF1ZXN0UHJvbWlzZSk7XG5cdH1cblxufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVuY3lBZGFwdGVyID0gKG9wdGlvbnMpID0+IChvcHRzKTogUHJvbWlzZTxhbnk+ID0+IHtcblx0Y29uc3QgY29uY3VycmVuY3lRdWV1ZSA9IG5ldyBDb25jdXJyZW5jeVF1ZXVlKG9wdGlvbnMpO1xuXHRyZXR1cm4gY29uY3VycmVuY3lRdWV1ZS5wdXNoKG9wdHMpO1xufTtcbiJdfQ==

@@ -1,252 +0,226 @@

'use strict';
var _isObject2 = require('lodash/isObject');
var _isObject3 = _interopRequireDefault(_isObject2);
var _util = require('util');
var _util2 = _interopRequireDefault(_util);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ApiError(req, res) {
Error.apply(this);
// Error.captureStackTrace not supported in Firefox
Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);
this.name = 'ApiError';
this.defaultMessage = this.defaultMessage || '';
var id;
var code;
var message;
var description;
var response;
if ((0, _isObject3.default)(res)) {
// Traverse through general API JSON Response
if (res.body && res.body.response) {
response = res.body.response; // res is raw api response
} else if (res.response) {
response = res.response; // res is body
} else {
response = res;
}
// Extract values from object - duck type check
if (response.hasOwnProperty('error_id')) {
// Api Response
id = response.error_id;
code = response.error_code;
message = response.error;
description = response.error_description;
} else if (response.hasOwnProperty('id')) {
// Simple Object
id = response.id;
code = response.code;
message = response.message;
description = response.description;
} else {
message = res;
}
} else {
message = res;
}
this.id = id;
this.code = code;
this.message = message || this.defaultMessage;
delete this.defaultMessage;
this.description = description || null;
this.req = req;
this.res = res;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
class ApiError extends Error {
constructor(req, res) {
super();
// Error.captureStackTrace not supported in Firefox
// tslint:disable-next-line
Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);
this.name = 'ApiError';
this.defaultMessage = this.defaultMessage || '';
let response;
let id;
let code;
let message;
let description;
if (_.isObject(res)) {
// Traverse through general API JSON Response
if (res.body && res.body.response) {
response = res.body.response; // res is raw api response
}
else if (res.response) {
response = res.response; // res is body
}
else {
response = res;
}
// Extract values from object - duck type check
if (response.hasOwnProperty('error_id')) { // Api Response
id = response.error_id;
code = response.error_code;
message = response.error;
description = response.error_description;
}
else if (response.hasOwnProperty('id')) { // Simple Object
id = response.id;
code = response.code;
message = response.message;
description = response.description;
}
else {
message = res;
}
}
else {
message = res;
}
this.id = id;
this.code = code;
this.message = (message || this.defaultMessage);
delete this.defaultMessage;
this.description = (description || null);
this.req = req;
this.res = res;
}
}
_util2.default.inherits(ApiError, Error);
function NotAuthorizedError() {
this.defaultMessage = 'Authorization failed';
ApiError.apply(this, arguments);
this.name = 'NotAuthorizedError';
exports.ApiError = ApiError;
class NotAuthorizedError extends ApiError {
constructor() {
super(...arguments);
this.defaultMessage = 'Authorization failed';
this.name = 'NotAuthorizedError';
}
}
_util2.default.inherits(NotAuthorizedError, ApiError);
exports.NotAuthorizedError = NotAuthorizedError;
// NotAuthenticated extends NotAuthorized for backwards compatibility
function NotAuthenticatedError() {
this.defaultMessage = 'Authentication failed';
NotAuthorizedError.apply(this, arguments);
this.name = 'NotAuthenticatedError';
class NotAuthenticatedError extends NotAuthorizedError {
constructor() {
super(...arguments);
this.defaultMessage = 'Authentication failed';
this.name = 'NotAuthenticatedError';
}
}
_util2.default.inherits(NotAuthenticatedError, NotAuthorizedError);
function RateLimitExceededError(opts, res) {
this.defaultMessage = 'Rate Limit Exceeded';
ApiError.apply(this, arguments);
this.name = 'RateLimitExceededError';
this.retryAfter = res.headers && res.headers['retry-after'] && parseInt(res.headers['retry-after'], 10);
exports.NotAuthenticatedError = NotAuthenticatedError;
class RateLimitExceededError extends ApiError {
constructor(opts, res) {
super(opts, res);
this.defaultMessage = 'Rate Limit Exceeded';
this.name = 'RateLimitExceededError';
this.retryAfter = res.headers && res.headers['retry-after'] && parseInt(res.headers['retry-after'], 10);
}
}
_util2.default.inherits(NotAuthorizedError, ApiError);
function SystemServiceUnavailableError() {
this.defaultMessage = 'Service Unavailable';
ApiError.apply(this, arguments);
this.name = 'SystemServiceUnavailableError';
exports.RateLimitExceededError = RateLimitExceededError;
class SystemServiceUnavailableError extends ApiError {
constructor() {
super(...arguments);
this.defaultMessage = 'Service Unavailable';
this.name = 'SystemServiceUnavailableError';
}
}
_util2.default.inherits(SystemServiceUnavailableError, ApiError);
function SystemUnknownError() {
this.defaultMessage = 'Unknown';
ApiError.apply(this, arguments);
this.name = 'SystemUnknownError';
exports.SystemServiceUnavailableError = SystemServiceUnavailableError;
class SystemUnknownError extends ApiError {
constructor() {
super(...arguments);
this.defaultMessage = 'Unknown';
this.name = 'SystemUnknownError';
}
}
_util2.default.inherits(SystemUnknownError, ApiError);
function NetworkError(opts, err) {
Error.apply(this);
this.message = err.message;
this.req = opts;
this.name = 'NetworkError';
exports.SystemUnknownError = SystemUnknownError;
class NetworkError extends Error {
constructor(req, err) {
super();
this.name = 'NetworkError';
this.req = req;
this.err = err;
}
}
_util2.default.inherits(NetworkError, Error);
function ArgumentError(opts, message) {
Error.apply(this);
this.message = message;
this.req = opts;
this.name = 'ArgumentError';
exports.NetworkError = NetworkError;
class ArgumentError extends Error {
constructor(req, message) {
super();
this.name = 'ArgumentError';
this.message = message;
this.req = req;
}
}
_util2.default.inherits(ArgumentError, Error);
function TargetError() {
ApiError.apply(this, arguments);
this.name = 'TargetError';
exports.ArgumentError = ArgumentError;
class TargetError extends ApiError {
}
_util2.default.inherits(TargetError, ApiError);
function DNSLookupError(req, err) {
ApiError.apply(this, arguments);
this.name = 'DNSLookupError';
this.message = 'DNS Lookup Error: ' + err.hostname;
exports.TargetError = TargetError;
class DNSLookupError extends NetworkError {
constructor(req, err) {
super(req, err);
this.name = 'DNSLookupError';
this.message = 'DNS Lookup Error: ' + err.hostname;
}
}
_util2.default.inherits(DNSLookupError, NetworkError);
function ConnectionAbortedError() {
ApiError.apply(this, arguments);
this.name = 'ConnectionAbortedError';
this.message = 'Connection Aborted Error';
exports.DNSLookupError = DNSLookupError;
class ConnectionAbortedError extends NetworkError {
constructor() {
super(...arguments);
this.name = 'ConnectionAbortedError';
this.message = 'Connection Aborted Error';
}
}
_util2.default.inherits(ConnectionAbortedError, NetworkError);
function SocketTimeoutError() {
ApiError.apply(this, arguments);
this.name = 'SocketTimeoutError';
this.message = 'Timeout Error';
exports.ConnectionAbortedError = ConnectionAbortedError;
class SocketTimeoutError extends NetworkError {
constructor() {
super(...arguments);
this.name = 'SocketTimeoutError';
this.message = 'Timeout Error';
}
}
_util2.default.inherits(SocketTimeoutError, NetworkError);
function ConnectionTimeoutError() {
ApiError.apply(this, arguments);
this.name = 'ConnectionTimeoutError';
this.message = 'Connection Timeout Error';
exports.SocketTimeoutError = SocketTimeoutError;
class ConnectionTimeoutError extends NetworkError {
constructor() {
super(...arguments);
this.name = 'ConnectionTimeoutError';
this.message = 'Connection Timeout Error';
}
}
_util2.default.inherits(ConnectionTimeoutError, NetworkError);
function ConnectionResetError() {
ApiError.apply(this, arguments);
this.name = 'ConnectionResetError';
this.message = 'Connection Reset Error';
exports.ConnectionTimeoutError = ConnectionTimeoutError;
class ConnectionResetError extends NetworkError {
constructor() {
super(...arguments);
this.name = 'ConnectionResetError';
this.message = 'Connection Reset Error';
}
}
_util2.default.inherits(ConnectionResetError, NetworkError);
function ConnectionRefusedError() {
ApiError.apply(this, arguments);
this.name = 'ConnectionRefusedError';
this.message = 'Connection Refused Error';
exports.ConnectionResetError = ConnectionResetError;
class ConnectionRefusedError extends NetworkError {
constructor() {
super(...arguments);
this.name = 'ConnectionRefusedError';
this.message = 'Connection Refused Error';
}
}
_util2.default.inherits(ConnectionRefusedError, NetworkError);
exports.ConnectionRefusedError = ConnectionRefusedError;
// Build error from root response
// https://wiki.appnexus.com/display/adnexusdocumentation/API+Semantics#APISemantics-Errors
function buildError(req, res) {
var ErrorType = ApiError;
if (res) {
var statusCode;
var errorId;
var errorCode;
if (res instanceof Error || res.errno) {
if (res.code === 'ENOTFOUND') {
ErrorType = DNSLookupError;
}
if (res.code === 'ECONNABORTED') {
ErrorType = ConnectionAbortedError;
}
if (res.code === 'ECONNREFUSED') {
ErrorType = ConnectionRefusedError;
}
if (res.code === 'ECONNRESET') {
ErrorType = ConnectionResetError;
}
if (res.code === 'ETIMEDOUT') {
ErrorType = ConnectionTimeoutError;
}
if (res.code === 'ESOCKETTIMEDOUT') {
ErrorType = SocketTimeoutError;
}
}
statusCode = res.statusCode;
if (res.body && res.body.response) {
errorId = res.body.response.error_id;
errorCode = res.body.response.error_code;
}
if (statusCode || errorId) {
// Differentiating Authentication vs Authorization [http://stackoverflow.com/a/6937030/2483105]
if (statusCode === 401 || errorId === 'NOAUTH') {
ErrorType = NotAuthenticatedError;
} else if (statusCode === 403 || errorId === 'UNAUTH') {
ErrorType = NotAuthorizedError;
} else if (errorId === 'SYSTEM' && errorCode === 'SERVICE_UNAVAILABLE') {
ErrorType = SystemServiceUnavailableError;
} else if (statusCode === 405 || statusCode === 429) {
// Legacy code 405
ErrorType = RateLimitExceededError;
} else if (errorId === 'SYSTEM' && errorCode === 'RATE_EXCEEDED') {
// Legacy rate limit detection pre 1.17
ErrorType = RateLimitExceededError;
} else if (errorId === 'SYSTEM' && errorCode === 'UNKNOWN') {
ErrorType = SystemUnknownError;
}
}
}
return new ErrorType(req, res);
}
module.exports = {
NetworkError: NetworkError,
ArgumentError: ArgumentError,
ApiError: ApiError,
DNSLookupError: DNSLookupError,
NotAuthorizedError: NotAuthorizedError,
NotAuthenticatedError: NotAuthenticatedError,
RateLimitExceededError: RateLimitExceededError,
SystemServiceUnavailableError: SystemServiceUnavailableError,
SystemUnknownError: SystemUnknownError,
TargetError: TargetError,
ConnectionAbortedError: ConnectionAbortedError,
SocketTimeoutError: SocketTimeoutError,
ConnectionTimeoutError: ConnectionTimeoutError,
ConnectionResetError: ConnectionResetError,
ConnectionRefusedError: ConnectionRefusedError,
buildError: buildError
};
exports.buildError = (req, res) => {
let ErrorType = ApiError;
if (res) {
let statusCode;
let errorId;
let errorCode;
if (res instanceof Error || res.errno) {
if (res.code === 'ENOTFOUND') {
ErrorType = DNSLookupError;
}
if (res.code === 'ECONNABORTED') {
ErrorType = ConnectionAbortedError;
}
if (res.code === 'ECONNREFUSED') {
ErrorType = ConnectionRefusedError;
}
if (res.code === 'ECONNRESET') {
ErrorType = ConnectionResetError;
}
if (res.code === 'ETIMEDOUT') {
ErrorType = ConnectionTimeoutError;
}
if (res.code === 'ESOCKETTIMEDOUT') {
ErrorType = SocketTimeoutError;
}
}
statusCode = res.statusCode;
if (res.body && res.body.response) {
errorId = res.body.response.error_id;
errorCode = res.body.response.error_code;
}
if (statusCode || errorId) {
// Differentiating Authentication vs Authorization [http://stackoverflow.com/a/6937030/2483105]
if (statusCode === 401 || errorId === 'NOAUTH') {
ErrorType = NotAuthenticatedError;
}
else if (statusCode === 403 || errorId === 'UNAUTH') {
ErrorType = NotAuthorizedError;
}
else if (errorId === 'SYSTEM' && errorCode === 'SERVICE_UNAVAILABLE') {
ErrorType = SystemServiceUnavailableError;
}
else if (statusCode === 405 || statusCode === 429) { // Legacy code 405
ErrorType = RateLimitExceededError;
}
else if (errorId === 'SYSTEM' && errorCode === 'RATE_EXCEEDED') { // Legacy rate limit detection pre 1.17
ErrorType = RateLimitExceededError;
}
else if (errorId === 'SYSTEM' && errorCode === 'UNKNOWN') {
ErrorType = SystemUnknownError;
}
}
}
return new ErrorType(req, res);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUE0QjtBQUU1QixNQUFhLFFBQVMsU0FBUSxLQUFLO0lBU2xDLFlBQVksR0FBSSxFQUFFLEdBQUk7UUFDckIsS0FBSyxFQUFFLENBQUM7UUFFUixtREFBbUQ7UUFDbkQsMkJBQTJCO1FBQzNCLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1FBRWhELElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxFQUFFLENBQUM7UUFDUCxJQUFJLElBQUksQ0FBQztRQUNULElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxXQUFXLENBQUM7UUFFaEIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLDZDQUE2QztZQUM3QyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xDLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBCQUEwQjthQUN4RDtpQkFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3hCLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYzthQUN2QztpQkFBTTtnQkFDTixRQUFRLEdBQUcsR0FBRyxDQUFDO2FBQ2Y7WUFFRCwrQ0FBK0M7WUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsZUFBZTtnQkFDekQsRUFBRSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENB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QyxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxVQUFVLElBQUksT0FBTyxFQUFFO1lBQzFCLCtGQUErRjtZQUMvRixJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksT0FBTyxLQUFLLFFBQVEsRUFBRTtnQkFDL0MsU0FBUyxHQUFHLHFCQUFxQixDQUFDO2FBQ2xDO2lCQUFNLElBQUksVUFBVSxLQUFLLEdBQUcsSUFBSSxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUN0RCxTQUFTLEdBQUcsa0JBQWtCLENBQUM7YUFDL0I7aUJBQU0sSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxxQkFBcUIsRUFBRTtnQkFDdkUsU0FBUyxHQUFHLDZCQUE2QixDQUFDO2FBQzFDO2lCQUFNLElBQUksVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLEtBQUssR0FBRyxFQUFFLEVBQUUsa0JBQWtCO2dCQUN4RSxTQUFTLEdBQUcsc0JBQXNCLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxlQUFlLEVBQUUsRUFBRSx1Q0FBdUM7Z0JBQzFHLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQzthQUNuQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxRQUFRLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtnQkFDM0QsU0FBUyxHQUFHLGtCQUFrQixDQUFDO2FBQy9CO1NBQ0Q7S0FDRDtJQUVELE9BQU8sSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgaWQ7XG5cdHB1YmxpYyBjb2RlO1xuXHRwdWJsaWMgZGVmYXVsdE1lc3NhZ2U7XG5cdHB1YmxpYyBkZXNjcmlwdGlvbjtcblx0cHVibGljIHJlc3BvbnNlO1xuXHRwdWJsaWMgcmVxO1xuXHRwdWJsaWMgcmVzO1xuXG5cdGNvbnN0cnVjdG9yKHJlcT8sIHJlcz8pIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0Ly8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Ugbm90IHN1cHBvcnRlZCBpbiBGaXJlZm94XG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgJiYgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG5cblx0XHR0aGlzLm5hbWUgPSAnQXBpRXJyb3InO1xuXHRcdHRoaXMuZGVmYXVsdE1lc3NhZ2UgPSB0aGlzLmRlZmF1bHRNZXNzYWdlIHx8ICcnO1xuXG5cdFx0bGV0IHJlc3BvbnNlO1xuXHRcdGxldCBpZDtcblx0XHRsZXQgY29kZTtcblx0XHRsZXQgbWVzc2FnZTtcblx0XHRsZXQgZGVzY3JpcHRpb247XG5cblx0XHRpZiAoXy5pc09iamVjdChyZXMpKSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSB0aHJvdWdoIGdlbmVyYWwgQVBJIEpTT04gUmVzcG9uc2Vcblx0XHRcdGlmIChyZXMuYm9keSAmJiByZXMuYm9keS5yZXNwb25zZSkge1xuXHRcdFx0XHRyZXNwb25zZSA9IHJlcy5ib2R5LnJlc3BvbnNlOyAvLyByZXMgaXMgcmF3IGFwaSByZXNwb25zZVxuXHRcdFx0fSBlbHNlIGlmIChyZXMucmVzcG9uc2UpIHtcblx0XHRcdFx0cmVzcG9uc2UgPSByZXMucmVzcG9uc2U7IC8vIHJlcyBpcyBib2R5XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXNwb25zZSA9IHJlcztcblx0XHRcdH1cblxuXHRcdFx0Ly8gRXh0cmFjdCB2YWx1ZXMgZnJvbSBvYmplY3QgLSBkdWNrIHR5cGUgY2hlY2tcblx0XHRcdGlmIChyZXNwb25zZS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3JfaWQnKSkgeyAvLyBBcGkgUmVzcG9uc2Vcblx0XHRcdFx0aWQgPSByZXNwb25zZS5lcnJvcl9pZDtcblx0XHRcdFx0Y29kZSA9IHJlc3BvbnNlLmVycm9yX2NvZGU7XG5cdFx0XHRcdG1lc3NhZ2UgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0ZGVzY3JpcHRpb24gPSByZXNwb25zZS5lcnJvcl9kZXNjcmlwdGlvbjtcblx0XHRcdH0gZWxzZSBpZiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ2lkJykpIHsgLy8gU2ltcGxlIE9iamVjdFxuXHRcdFx0XHRpZCA9IHJlc3BvbnNlLmlkO1xuXHRcdFx0XHRjb2RlID0gcmVzcG9uc2UuY29kZTtcblx0XHRcdFx0bWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG5cdFx0XHRcdGRlc2NyaXB0aW9uID0gcmVzcG9uc2UuZGVzY3JpcHRpb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXNzYWdlID0gcmVzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXNzYWdlID0gcmVzO1xuXHRcdH1cblxuXHRcdHRoaXMuaWQgPSBpZDtcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xuXHRcdHRoaXMubWVzc2FnZSA9IChtZXNzYWdlIHx8IHRoaXMuZGVmYXVsdE1lc3NhZ2UpO1xuXHRcdGRlbGV0ZSB0aGlzLmRlZmF1bHRNZXNzYWdlO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24gfHwgbnVsbCk7XG5cdFx0dGhpcy5yZXEgPSByZXE7XG5cdFx0dGhpcy5yZXMgPSByZXM7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEF1dGhvcml6ZWRFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcblx0cHVibGljIGRlZmF1bHRNZXNzYWdlID0gJ0F1dGhvcml6YXRpb24gZmFpbGVkJztcblx0cHVibGljIG5hbWUgPSAnTm90QXV0aG9yaXplZEVycm9yJztcbn1cblxuLy8gTm90QXV0aGVudGljYXRlZCBleHRlbmRzIE5vdEF1dGhvcml6ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgY2xhc3MgTm90QXV0aGVudGljYXRlZEVycm9yIGV4dGVuZHMgTm90QXV0aG9yaXplZEVycm9yIHtcblx0cHVibGljIGRlZmF1bHRNZXNzYWdlID0gJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCc7XG5cdHB1YmxpYyBuYW1lID0gJ05vdEF1dGhlbnRpY2F0ZWRFcnJvcic7XG59XG5cbmV4cG9ydCBjbGFzcyBSYXRlTGltaXRFeGNlZWRlZEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuXHRwdWJsaWMgZGVmYXVsdE1lc3NhZ2UgPSAnUmF0ZSBMaW1pdCBFeGNlZWRlZCc7XG5cdHB1YmxpYyBuYW1lID0gJ1JhdGVMaW1pdEV4Y2VlZGVkRXJyb3InO1xuXHRwdWJsaWMgcmV0cnlBZnRlcjtcblx0Y29uc3RydWN0b3Iob3B0cywgcmVzKSB7XG5cdFx0c3VwZXIob3B0cywgcmVzKTtcblx0XHR0aGlzLnJldHJ5QWZ0ZXIgPSByZXMuaGVhZGVycyAmJiByZXMuaGVhZGVyc1sncmV0cnktYWZ0ZXInXSAmJiBwYXJzZUludChyZXMuaGVhZGVyc1sncmV0cnktYWZ0ZXInXSwgMTApO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW1TZXJ2aWNlVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcblx0cHVibGljIGRlZmF1bHRNZXNzYWdlID0gJ1NlcnZpY2UgVW5hdmFpbGFibGUnO1xuXHRwdWJsaWMgbmFtZSA9ICdTeXN0ZW1TZXJ2aWNlVW5hdmFpbGFibGVFcnJvcic7XG59XG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW1Vbmtub3duRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG5cdHB1YmxpYyBkZWZhdWx0TWVzc2FnZSA9ICdVbmtub3duJztcblx0cHVibGljIG5hbWUgPSAnU3lzdGVtVW5rbm93bkVycm9yJztcbn1cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtFcnJvciBleHRlbmRzIEVycm9yIHtcblx0cHVibGljIG5hbWUgPSAnTmV0d29ya0Vycm9yJztcblx0cHVibGljIHJlcTtcblx0cHVibGljIGVycjtcblx0Y29uc3RydWN0b3IocmVxLCBlcnIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMucmVxID0gcmVxO1xuXHRcdHRoaXMuZXJyID0gZXJyO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBBcmd1bWVudEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgbmFtZSA9ICdBcmd1bWVudEVycm9yJztcblx0cHVibGljIHJlcTtcblx0Y29uc3RydWN0b3IocmVxLCBtZXNzYWdlKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHRcdHRoaXMucmVxID0gcmVxO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBUYXJnZXRFcnJvciBleHRlbmRzIEFwaUVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBETlNMb29rdXBFcnJvciBleHRlbmRzIE5ldHdvcmtFcnJvciB7XG5cdHB1YmxpYyBuYW1lID0gJ0ROU0xvb2t1cEVycm9yJztcblx0Y29uc3RydWN0b3IocmVxLCBlcnIpIHtcblx0XHRzdXBlcihyZXEsIGVycik7XG5cdFx0dGhpcy5tZXNzYWdlID0gJ0ROUyBMb29rdXAgRXJyb3I6ICcgKyBlcnIuaG9zdG5hbWU7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25BYm9ydGVkRXJyb3IgZXh0ZW5kcyBOZXR3b3JrRXJyb3Ige1xuXHRwdWJsaWMgbmFtZSA9ICdDb25uZWN0aW9uQWJvcnRlZEVycm9yJztcblx0cHVibGljIG1lc3NhZ2UgPSAnQ29ubmVjdGlvbiBBYm9ydGVkIEVycm9yJztcbn1cblxuZXhwb3J0IGNsYXNzIFNvY2tldFRpbWVvdXRFcnJvciBleHRlbmRzIE5ldHdvcmtFcnJvciB7XG5cdHB1YmxpYyBuYW1lID0gJ1NvY2tldFRpbWVvdXRFcnJvcic7XG5cdHB1YmxpYyBtZXNzYWdlID0gJ1RpbWVvdXQgRXJyb3InO1xufVxuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblRpbWVvdXRFcnJvciBleHRlbmRzIE5ldHdvcmtFcnJvciB7XG5cdHB1YmxpYyBuYW1lID0gJ0Nvbm5lY3Rpb25UaW1lb3V0RXJyb3InO1xuXHRwdWJsaWMgbWVzc2FnZSA9ICdDb25uZWN0aW9uIFRpbWVvdXQgRXJyb3InO1xufVxuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblJlc2V0RXJyb3IgZXh0ZW5kcyBOZXR3b3JrRXJyb3Ige1xuXHRwdWJsaWMgbmFtZSA9ICdDb25uZWN0aW9uUmVzZXRFcnJvcic7XG5cdHB1YmxpYyBtZXNzYWdlID0gJ0Nvbm5lY3Rpb24gUmVzZXQgRXJyb3InO1xufVxuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblJlZnVzZWRFcnJvciBleHRlbmRzIE5ldHdvcmtFcnJvciB7XG5cdHB1YmxpYyBuYW1lID0gJ0Nvbm5lY3Rpb25SZWZ1c2VkRXJyb3InO1xuXHRwdWJsaWMgbWVzc2FnZSA9ICdDb25uZWN0aW9uIFJlZnVzZWQgRXJyb3InO1xufVxuXG4vLyBCdWlsZCBlcnJvciBmcm9tIHJvb3QgcmVzcG9uc2Vcbi8vIGh0dHBzOi8vd2lraS5hcHBuZXh1cy5jb20vZGlzcGxheS9hZG5leHVzZG9jdW1lbnRhdGlvbi9BUEkrU2VtYW50aWNzI0FQSVNlbWFudGljcy1FcnJvcnNcbmV4cG9ydCBjb25zdCBidWlsZEVycm9yID0gKHJlcT8sIHJlcz8pOiBBcGlFcnJvciA9PiB7XG5cdGxldCBFcnJvclR5cGU6IGFueSA9IEFwaUVycm9yO1xuXG5cdGlmIChyZXMpIHtcblx0XHRsZXQgc3RhdHVzQ29kZTtcblx0XHRsZXQgZXJyb3JJZDtcblx0XHRsZXQgZXJyb3JDb2RlO1xuXG5cdFx0aWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yIHx8IHJlcy5lcnJubykge1xuXHRcdFx0aWYgKHJlcy5jb2RlID09PSAnRU5PVEZPVU5EJykge1xuXHRcdFx0XHRFcnJvclR5cGUgPSBETlNMb29rdXBFcnJvcjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlcy5jb2RlID09PSAnRUNPTk5BQk9SVEVEJykge1xuXHRcdFx0XHRFcnJvclR5cGUgPSBDb25uZWN0aW9uQWJvcnRlZEVycm9yO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVzLmNvZGUgPT09ICdFQ09OTlJFRlVTRUQnKSB7XG5cdFx0XHRcdEVycm9yVHlwZSA9IENvbm5lY3Rpb25SZWZ1c2VkRXJyb3I7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXMuY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG5cdFx0XHRcdEVycm9yVHlwZSA9IENvbm5lY3Rpb25SZXNldEVycm9yO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVzLmNvZGUgPT09ICdFVElNRURPVVQnKSB7XG5cdFx0XHRcdEVycm9yVHlwZSA9IENvbm5lY3Rpb25UaW1lb3V0RXJyb3I7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXMuY29kZSA9PT0gJ0VTT0NLRVRUSU1FRE9VVCcpIHtcblx0XHRcdFx0RXJyb3JUeXBlID0gU29ja2V0VGltZW91dEVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHN0YXR1c0NvZGUgPSByZXMuc3RhdHVzQ29kZTtcblxuXHRcdGlmIChyZXMuYm9keSAmJiByZXMuYm9keS5yZXNwb25zZSkge1xuXHRcdFx0ZXJyb3JJZCA9IHJlcy5ib2R5LnJlc3BvbnNlLmVycm9yX2lkO1xuXHRcdFx0ZXJyb3JDb2RlID0gcmVzLmJvZHkucmVzcG9uc2UuZXJyb3JfY29kZTtcblx0XHR9XG5cblx0XHRpZiAoc3RhdHVzQ29kZSB8fCBlcnJvcklkKSB7XG5cdFx0XHQvLyBEaWZmZXJlbnRpYXRpbmcgQXV0aGVudGljYXRpb24gdnMgQXV0aG9yaXphdGlvbiBbaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjkzNzAzMC8yNDgzMTA1XVxuXHRcdFx0aWYgKHN0YXR1c0NvZGUgPT09IDQwMSB8fCBlcnJvcklkID09PSAnTk9BVVRIJykge1xuXHRcdFx0XHRFcnJvclR5cGUgPSBOb3RBdXRoZW50aWNhdGVkRXJyb3I7XG5cdFx0XHR9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMyB8fCBlcnJvcklkID09PSAnVU5BVVRIJykge1xuXHRcdFx0XHRFcnJvclR5cGUgPSBOb3RBdXRob3JpemVkRXJyb3I7XG5cdFx0XHR9IGVsc2UgaWYgKGVycm9ySWQgPT09ICdTWVNURU0nICYmIGVycm9yQ29kZSA9PT0gJ1NFUlZJQ0VfVU5BVkFJTEFCTEUnKSB7XG5cdFx0XHRcdEVycm9yVHlwZSA9IFN5c3RlbVNlcnZpY2VVbmF2YWlsYWJsZUVycm9yO1xuXHRcdFx0fSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA0MDUgfHwgc3RhdHVzQ29kZSA9PT0gNDI5KSB7IC8vIExlZ2FjeSBjb2RlIDQwNVxuXHRcdFx0XHRFcnJvclR5cGUgPSBSYXRlTGltaXRFeGNlZWRlZEVycm9yO1xuXHRcdFx0fSBlbHNlIGlmIChlcnJvcklkID09PSAnU1lTVEVNJyAmJiBlcnJvckNvZGUgPT09ICdSQVRFX0VYQ0VFREVEJykgeyAvLyBMZWdhY3kgcmF0ZSBsaW1pdCBkZXRlY3Rpb24gcHJlIDEuMTdcblx0XHRcdFx0RXJyb3JUeXBlID0gUmF0ZUxpbWl0RXhjZWVkZWRFcnJvcjtcblx0XHRcdH0gZWxzZSBpZiAoZXJyb3JJZCA9PT0gJ1NZU1RFTScgJiYgZXJyb3JDb2RlID09PSAnVU5LTk9XTicpIHtcblx0XHRcdFx0RXJyb3JUeXBlID0gU3lzdGVtVW5rbm93bkVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBuZXcgRXJyb3JUeXBlKHJlcSwgcmVzKTtcbn07XG4iXX0=

@@ -1,24 +0,11 @@

'use strict';
var _noop2 = require('lodash/noop');
var _noop3 = _interopRequireDefault(_noop2);
var _partial2 = require('lodash/partial');
var _partial3 = _interopRequireDefault(_partial2);
var _requestQueue = require('./request-queue');
var _requestQueue2 = _interopRequireDefault(_requestQueue);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DEFAULT_READ_LIMIT = 100;
var DEFAULT_READ_LIMIT_SECONDS = 60;
var DEFAULT_READ_LIMIT_HEADER = 'x-ratelimit-read';
var DEFAULT_WRITE_LIMIT = 60;
var DEFAULT_WRITE_LIMIT_SECONDS = 60;
var DEFAULT_WRITE_LIMIT_HEADER = 'x-ratelimit-write';
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const request_queue_1 = require("./request-queue");
const DEFAULT_READ_LIMIT = 100;
const DEFAULT_READ_LIMIT_SECONDS = 60;
const DEFAULT_READ_LIMIT_HEADER = 'x-ratelimit-read';
const DEFAULT_WRITE_LIMIT = 60;
const DEFAULT_WRITE_LIMIT_SECONDS = 60;
const DEFAULT_WRITE_LIMIT_HEADER = 'x-ratelimit-write';
// Rate Limit Options:

@@ -33,27 +20,25 @@ // request

// onRateLimitResume
module.exports = function rateLimitAdapter(options) {
var readQueue = new _requestQueue2.default({
request: options.request,
limit: options.rateLimitRead || DEFAULT_READ_LIMIT,
limitSeconds: options.rateLimitReadSeconds || DEFAULT_READ_LIMIT_SECONDS,
limitHeader: DEFAULT_READ_LIMIT_HEADER,
onRateLimitExceeded: (0, _partial3.default)(options.onRateLimitExceeded || _noop3.default, 'READ'),
onRateLimitPause: (0, _partial3.default)(options.onRateLimitPause || _noop3.default, 'READ'),
onRateLimitResume: (0, _partial3.default)(options.onRateLimitResume || _noop3.default, 'READ')
});
var writeQueue = new _requestQueue2.default({
request: options.request,
limit: options.rateLimitWrite || DEFAULT_WRITE_LIMIT,
limitSeconds: options.rateLimitWriteSeconds || DEFAULT_WRITE_LIMIT_SECONDS,
limitHeader: DEFAULT_WRITE_LIMIT_HEADER,
onRateLimitExceeded: (0, _partial3.default)(options.onRateLimitExceeded || _noop3.default, 'WRITE'),
onRateLimitPause: (0, _partial3.default)(options.onRateLimitPause || _noop3.default, 'WRITE'),
onRateLimitResume: (0, _partial3.default)(options.onRateLimitResume || _noop3.default, 'WRITE')
});
return function rateLimitedRequest(opts) {
return opts.method === 'GET' ? readQueue.enqueue(opts) : writeQueue.enqueue(opts);
};
};
exports.rateLimitAdapter = (options) => {
const readQueue = new request_queue_1.RequestQueue({
request: options.request,
limit: options.rateLimitRead || DEFAULT_READ_LIMIT,
limitSeconds: options.rateLimitReadSeconds || DEFAULT_READ_LIMIT_SECONDS,
limitHeader: DEFAULT_READ_LIMIT_HEADER,
onRateLimitExceeded: _.partial(options.onRateLimitExceeded || _.noop, 'READ'),
onRateLimitPause: _.partial(options.onRateLimitPause || _.noop, 'READ'),
onRateLimitResume: _.partial(options.onRateLimitResume || _.noop, 'READ'),
});
const writeQueue = new request_queue_1.RequestQueue({
request: options.request,
limit: options.rateLimitWrite || DEFAULT_WRITE_LIMIT,
limitSeconds: options.rateLimitWriteSeconds || DEFAULT_WRITE_LIMIT_SECONDS,
limitHeader: DEFAULT_WRITE_LIMIT_HEADER,
onRateLimitExceeded: _.partial(options.onRateLimitExceeded || _.noop, 'WRITE'),
onRateLimitPause: _.partial(options.onRateLimitPause || _.noop, 'WRITE'),
onRateLimitResume: _.partial(options.onRateLimitResume || _.noop, 'WRITE'),
});
return (opts) => {
return opts.method === 'GET' ? readQueue.enqueue(opts) : writeQueue.enqueue(opts);
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZUxpbWl0QWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYXRlTGltaXRBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNEJBQTRCO0FBQzVCLG1EQUErQztBQUUvQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUN0QyxNQUFNLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBQ3JELE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQy9CLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sMEJBQTBCLEdBQUcsbUJBQW1CLENBQUM7QUFFdkQsc0JBQXNCO0FBQ3RCLFVBQVU7QUFDVixnQkFBZ0I7QUFDaEIsdUJBQXVCO0FBQ3ZCLGlCQUFpQjtBQUNqQix3QkFBd0I7QUFDeEIsc0JBQXNCO0FBQ3RCLG1CQUFtQjtBQUNuQixvQkFBb0I7QUFFUCxRQUFBLGdCQUFnQixHQUFHLENBQUMsT0FBTyxFQUFnQyxFQUFFO0lBQ3pFLE1BQU0sU0FBUyxHQUFHLElBQUksNEJBQVksQ0FBQztRQUNsQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLElBQUksa0JBQWtCO1FBQ2xELFlBQVksRUFBRSxPQUFPLENBQUMsb0JBQW9CLElBQUksMEJBQTBCO1FBQ3hFLFdBQVcsRUFBRSx5QkFBeUI7UUFDdEMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7UUFDN0UsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7UUFDdkUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7S0FDekUsQ0FBQyxDQUFDO0lBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSw0QkFBWSxDQUFDO1FBQ25DLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxtQkFBbUI7UUFDcEQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSwyQkFBMkI7UUFDMUUsV0FBVyxFQUFFLDBCQUEwQjtRQUN2QyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUM5RSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUN4RSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztLQUMxRSxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25GLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFJlcXVlc3RRdWV1ZSB9IGZyb20gJy4vcmVxdWVzdC1xdWV1ZSc7XG5cbmNvbnN0IERFRkFVTFRfUkVBRF9MSU1JVCA9IDEwMDtcbmNvbnN0IERFRkFVTFRfUkVBRF9MSU1JVF9TRUNPTkRTID0gNjA7XG5jb25zdCBERUZBVUxUX1JFQURfTElNSVRfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlYWQnO1xuY29uc3QgREVGQVVMVF9XUklURV9MSU1JVCA9IDYwO1xuY29uc3QgREVGQVVMVF9XUklURV9MSU1JVF9TRUNPTkRTID0gNjA7XG5jb25zdCBERUZBVUxUX1dSSVRFX0xJTUlUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC13cml0ZSc7XG5cbi8vIFJhdGUgTGltaXQgT3B0aW9uczpcbi8vIHJlcXVlc3Rcbi8vIHJhdGVMaW1pdFJlYWRcbi8vIHJhdGVMaW1pdFJlYWRTZWNvbmRzXG4vLyByYXRlTGltaXRXcml0ZVxuLy8gcmF0ZUxpbWl0V3JpdGVTZWNvbmRzXG4vLyBvblJhdGVMaW1pdEV4Y2VlZGVkXG4vLyBvblJhdGVMaW1pdFBhdXNlXG4vLyBvblJhdGVMaW1pdFJlc3VtZVxuXG5leHBvcnQgY29uc3QgcmF0ZUxpbWl0QWRhcHRlciA9IChvcHRpb25zKTogKG9wdHM6IGFueSkgPT4gUHJvbWlzZTx2b2lkPiA9PiB7XG5cdGNvbnN0IHJlYWRRdWV1ZSA9IG5ldyBSZXF1ZXN0UXVldWUoe1xuXHRcdHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdCxcblx0XHRsaW1pdDogb3B0aW9ucy5yYXRlTGltaXRSZWFkIHx8IERFRkFVTFRfUkVBRF9MSU1JVCxcblx0XHRsaW1pdFNlY29uZHM6IG9wdGlvbnMucmF0ZUxpbWl0UmVhZFNlY29uZHMgfHwgREVGQVVMVF9SRUFEX0xJTUlUX1NFQ09ORFMsXG5cdFx0bGltaXRIZWFkZXI6IERFRkFVTFRfUkVBRF9MSU1JVF9IRUFERVIsXG5cdFx0b25SYXRlTGltaXRFeGNlZWRlZDogXy5wYXJ0aWFsKG9wdGlvbnMub25SYXRlTGltaXRFeGNlZWRlZCB8fCBfLm5vb3AsICdSRUFEJyksXG5cdFx0b25SYXRlTGltaXRQYXVzZTogXy5wYXJ0aWFsKG9wdGlvbnMub25SYXRlTGltaXRQYXVzZSB8fCBfLm5vb3AsICdSRUFEJyksXG5cdFx0b25SYXRlTGltaXRSZXN1bWU6IF8ucGFydGlhbChvcHRpb25zLm9uUmF0ZUxpbWl0UmVzdW1lIHx8IF8ubm9vcCwgJ1JFQUQnKSxcblx0fSk7XG5cblx0Y29uc3Qgd3JpdGVRdWV1ZSA9IG5ldyBSZXF1ZXN0UXVldWUoe1xuXHRcdHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdCxcblx0XHRsaW1pdDogb3B0aW9ucy5yYXRlTGltaXRXcml0ZSB8fCBERUZBVUxUX1dSSVRFX0xJTUlULFxuXHRcdGxpbWl0U2Vjb25kczogb3B0aW9ucy5yYXRlTGltaXRXcml0ZVNlY29uZHMgfHwgREVGQVVMVF9XUklURV9MSU1JVF9TRUNPTkRTLFxuXHRcdGxpbWl0SGVhZGVyOiBERUZBVUxUX1dSSVRFX0xJTUlUX0hFQURFUixcblx0XHRvblJhdGVMaW1pdEV4Y2VlZGVkOiBfLnBhcnRpYWwob3B0aW9ucy5vblJhdGVMaW1pdEV4Y2VlZGVkIHx8IF8ubm9vcCwgJ1dSSVRFJyksXG5cdFx0b25SYXRlTGltaXRQYXVzZTogXy5wYXJ0aWFsKG9wdGlvbnMub25SYXRlTGltaXRQYXVzZSB8fCBfLm5vb3AsICdXUklURScpLFxuXHRcdG9uUmF0ZUxpbWl0UmVzdW1lOiBfLnBhcnRpYWwob3B0aW9ucy5vblJhdGVMaW1pdFJlc3VtZSB8fCBfLm5vb3AsICdXUklURScpLFxuXHR9KTtcblx0cmV0dXJuIChvcHRzKSA9PiB7XG5cdFx0cmV0dXJuIG9wdHMubWV0aG9kID09PSAnR0VUJyA/IHJlYWRRdWV1ZS5lbnF1ZXVlKG9wdHMpIDogd3JpdGVRdWV1ZS5lbnF1ZXVlKG9wdHMpO1xuXHR9O1xufTtcbiJdfQ==

@@ -1,138 +0,106 @@

'use strict';
var _isNil2 = require('lodash/isNil');
var _isNil3 = _interopRequireDefault(_isNil2);
var _noop2 = require('lodash/noop');
var _noop3 = _interopRequireDefault(_noop2);
var _assign2 = require('lodash/assign');
var _assign3 = _interopRequireDefault(_assign2);
var _errors = require('./errors');
var _errors2 = _interopRequireDefault(_errors);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DEFAULT_LIMIT = 60;
var DEFAULT_LIMIT_SECONDS = 60;
var DEFAULT_LIMIT_SECONDS_BUFFER = 1;
var DEFAULT_LIMIT_COUNT_BUFFER = 4;
var ONE_SECOND = 1000;
var DEFAULT_RATE_LIMIT_TIMEOUT = DEFAULT_LIMIT_SECONDS * ONE_SECOND;
var RETRY_AFTER_BUFFER_TIME = ONE_SECOND;
function RequestQueue(options) {
this.options = (0, _assign3.default)({
request: null,
limit: DEFAULT_LIMIT,
limitSeconds: DEFAULT_LIMIT_SECONDS,
onRateLimitExceeded: _noop3.default,
onRateLimitPause: _noop3.default,
onRateLimitResume: _noop3.default
}, options);
this.queue = [];
this.limitCount = 0;
this._resetTimeout();
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const errors = require("./errors");
const DEFAULT_LIMIT = 60;
const DEFAULT_LIMIT_SECONDS = 60;
const DEFAULT_LIMIT_SECONDS_BUFFER = 1;
const DEFAULT_LIMIT_COUNT_BUFFER = 4;
const ONE_SECOND = 1000;
const DEFAULT_RATE_LIMIT_TIMEOUT = DEFAULT_LIMIT_SECONDS * ONE_SECOND;
const RETRY_AFTER_BUFFER_TIME = ONE_SECOND;
class RequestQueue {
constructor(options) {
this.options = _.assign({
request: null,
limit: DEFAULT_LIMIT,
limitSeconds: DEFAULT_LIMIT_SECONDS,
onRateLimitExceeded: _.noop,
onRateLimitPause: _.noop,
onRateLimitResume: _.noop,
}, options);
this.queue = [];
this.limitCount = 0;
this._resetTimeout();
}
enqueue(opts) {
return new Promise((resolve, reject) => {
this.queue.push({
opts,
resolve,
reject,
});
this._processQueue();
});
}
dequeue() {
return this.queue.shift();
}
paused() {
return !!this.timeoutId;
}
_processQueue(retryAfter) {
if (this.queue.length > 0) { // if items left to process
if (this.limitCount < Math.max(this.options.limit - DEFAULT_LIMIT_COUNT_BUFFER, 1)) { // if not over limit
this.limitCount++;
this._execute(this.dequeue());
this._processQueue();
}
else if (!this.paused()) { // schedule
this.options.onRateLimitPause();
this._schedule(retryAfter);
}
}
}
_schedule(retryAfter) {
if (!this.timeoutId) {
const delay = Math.max(retryAfter || (this.expires - Date.now()), 0);
this.timeoutId = setTimeout(() => {
this._resetTimeout();
this.limitCount = 0;
this.options.onRateLimitResume();
this._processQueue();
}, delay);
}
}
_resetTimeout() {
if (this.timeoutId) {
clearTimeout(this.timeoutId);
this.timeoutId = null;
}
this.expires = Date.now() + ((this.options.limitSeconds + DEFAULT_LIMIT_SECONDS_BUFFER) * ONE_SECOND);
}
_execute(reqInfo) {
return this.options.request(reqInfo.opts).then((res) => {
this._checkHeaders(res);
return reqInfo.resolve(res);
}).catch((err) => {
if (err instanceof errors.RateLimitExceededError) {
this.options.onRateLimitExceeded(err);
if (_.isNil(err.retryAfter)) {
// Abort retry due to missing retryAfter
return reqInfo.reject(err);
}
const retryAfter = err.retryAfter ? (err.retryAfter * ONE_SECOND) + RETRY_AFTER_BUFFER_TIME : DEFAULT_RATE_LIMIT_TIMEOUT;
this.limitCount = Infinity;
this.queue.push(reqInfo);
this._processQueue(retryAfter);
}
else {
return reqInfo.reject(err);
}
});
}
_checkHeaders(res) {
if (res.headers[this.options.limitHeader]) {
const limit = parseInt(res.headers[this.options.limitHeader], 10) || DEFAULT_LIMIT;
if (limit !== this.options.limit) {
this.options.limit = limit;
this._resetTimeout();
this._processQueue();
}
}
}
}
RequestQueue.prototype.enqueue = function _enqueue(opts) {
var _self = this;
return new Promise(function queuedPromise(resolve, reject) {
_self.queue.push({
opts: opts,
resolve: resolve,
reject: reject
});
_self._processQueue();
});
};
RequestQueue.prototype.dequeue = function _dequeue() {
var _self = this;
return _self.queue.shift();
};
RequestQueue.prototype.paused = function paused() {
var _self = this;
return !!_self.timeoutId;
};
RequestQueue.prototype._processQueue = function _processQueue(retryAfter) {
var _self = this;
if (_self.queue.length > 0) {
// if items left to process
if (_self.limitCount < Math.max(_self.options.limit - DEFAULT_LIMIT_COUNT_BUFFER, 1)) {
// if not over limit
_self.limitCount++;
_self._execute(_self.dequeue());
_self._processQueue();
} else if (!_self.paused()) {
// schedule
_self.options.onRateLimitPause();
_self._schedule(retryAfter);
}
}
};
RequestQueue.prototype._schedule = function _schedule(retryAfter) {
var _self = this;
if (!this.timeoutId) {
var delay = Math.max(retryAfter || this.expires - Date.now(), 0);
_self.timeoutId = setTimeout(function scheduleRun() {
_self._resetTimeout();
_self.limitCount = 0;
_self.options.onRateLimitResume();
_self._processQueue();
}, delay);
}
};
RequestQueue.prototype._resetTimeout = function _resetTimeout() {
var _self = this;
if (this.timeoutId) {
clearTimeout(_self.timeoutId);
_self.timeoutId = null;
}
_self.expires = Date.now() + (_self.options.limitSeconds + DEFAULT_LIMIT_SECONDS_BUFFER) * ONE_SECOND;
};
RequestQueue.prototype._execute = function _execute(reqInfo) {
var _self = this;
return _self.options.request(reqInfo.opts).then(function success(res) {
_self._checkHeaders(res);
return reqInfo.resolve(res);
}).catch(function failure(err) {
if (err instanceof _errors2.default.RateLimitExceededError) {
_self.options.onRateLimitExceeded(err);
if ((0, _isNil3.default)(err.retryAfter)) {
// Abort retry due to missing retryAfter
return reqInfo.reject(err);
}
var retryAfter = err.retryAfter ? err.retryAfter * ONE_SECOND + RETRY_AFTER_BUFFER_TIME : DEFAULT_RATE_LIMIT_TIMEOUT;
_self.limitCount = Infinity;
_self.queue.push(reqInfo);
_self._processQueue(retryAfter);
} else {
return reqInfo.reject(err);
}
});
};
RequestQueue.prototype._checkHeaders = function _checkHeaders(res) {
var _self = this;
if (res.headers[_self.options.limitHeader]) {
var limit = parseInt(res.headers[_self.options.limitHeader], 10) || DEFAULT_LIMIT;
if (limit !== _self.options.limit) {
_self.options.limit = limit;
_self._resetTimeout();
_self._processQueue();
}
}
};
module.exports = RequestQueue;
exports.RequestQueue = RequestQueue;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LXF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNEJBQTRCO0FBQzVCLG1DQUFtQztBQUVuQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLENBQUM7QUFDdkMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE1BQU0sMEJBQTBCLEdBQUcscUJBQXFCLEdBQUcsVUFBVSxDQUFDO0FBQ3RFLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDO0FBWTNDLE1BQWEsWUFBWTtJQU94QixZQUFZLE9BQTZCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN2QixPQUFPLEVBQUUsSUFBSTtZQUNiLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFlBQVksRUFBRSxxQkFBcUI7WUFDbkMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDM0IsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDeEIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLElBQUk7U0FDekIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sT0FBTyxDQUFDLElBQUk7UUFDbEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDZixJQUFJO2dCQUNKLE9BQU87Z0JB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QUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzNCO2dCQUNELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3pILElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMvQjtpQkFBTTtnQkFDTixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0I7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxhQUFhLENBQUMsR0FBRztRQUN4QixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMxQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQztZQUNuRixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUNyQjtTQUNEO0lBQ0YsQ0FBQztDQUNEO0FBeEdELG9DQXdHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuL2Vycm9ycyc7XG5cbmNvbnN0IERFRkFVTFRfTElNSVQgPSA2MDtcbmNvbnN0IERFRkFVTFRfTElNSVRfU0VDT05EUyA9IDYwO1xuY29uc3QgREVGQVVMVF9MSU1JVF9TRUNPTkRTX0JVRkZFUiA9IDE7XG5jb25zdCBERUZBVUxUX0xJTUlUX0NPVU5UX0JVRkZFUiA9IDQ7XG5jb25zdCBPTkVfU0VDT05EID0gMTAwMDtcbmNvbnN0IERFRkFVTFRfUkFURV9MSU1JVF9USU1FT1VUID0gREVGQVVMVF9MSU1JVF9TRUNPTkRTICogT05FX1NFQ09ORDtcbmNvbnN0IFJFVFJZX0FGVEVSX0JVRkZFUl9USU1FID0gT05FX1NFQ09ORDtcblxuZXhwb3J0IGludGVyZmFjZSBJUmVxdWVzdFF1ZXVlT3B0aW9ucyB7XG5cdHJlcXVlc3Q6IGFueTtcblx0bGltaXQ6IG51bWJlcjtcblx0bGltaXRTZWNvbmRzOiBudW1iZXI7XG5cdGxpbWl0SGVhZGVyOiBzdHJpbmc7XG5cdG9uUmF0ZUxpbWl0RXhjZWVkZWQ6IGFueTtcblx0b25SYXRlTGltaXRQYXVzZTogYW55O1xuXHRvblJhdGVMaW1pdFJlc3VtZTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgUmVxdWVzdFF1ZXVlIHtcblx0cHJpdmF0ZSBvcHRpb25zOiBJUmVxdWVzdFF1ZXVlT3B0aW9ucztcblx0cHJpdmF0ZSBxdWV1ZTogYW55W107XG5cdHByaXZhdGUgbGltaXRDb3VudDogbnVtYmVyO1xuXHRwcml2YXRlIGV4cGlyZXM6IG51bWJlcjtcblx0cHJpdmF0ZSB0aW1lb3V0SWQ6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVxdWVzdFF1ZXVlT3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IF8uYXNzaWduKHtcblx0XHRcdHJlcXVlc3Q6IG51bGwsXG5cdFx0XHRsaW1pdDogREVGQVVMVF9MSU1JVCxcblx0XHRcdGxpbWl0U2Vjb25kczogREVGQVVMVF9MSU1JVF9TRUNPTkRTLFxuXHRcdFx0b25SYXRlTGltaXRFeGNlZWRlZDogXy5ub29wLFxuXHRcdFx0b25SYXRlTGltaXRQYXVzZTogXy5ub29wLFxuXHRcdFx0b25SYXRlTGltaXRSZXN1bWU6IF8ubm9vcCxcblx0XHR9LCBvcHRpb25zKTtcblx0XHR0aGlzLnF1ZXVlID0gW107XG5cdFx0dGhpcy5saW1pdENvdW50ID0gMDtcblx0XHR0aGlzLl9yZXNldFRpbWVvdXQoKTtcblx0fVxuXG5cdHB1YmxpYyBlbnF1ZXVlKG9wdHMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5xdWV1ZS5wdXNoKHtcblx0XHRcdFx0b3B0cyxcblx0XHRcdFx0cmVzb2x2ZSxcblx0XHRcdFx0cmVqZWN0LFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9wcm9jZXNzUXVldWUoKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBkZXF1ZXVlKCk6ICgpID0+IGFueVtdIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXHR9XG5cblx0cHVibGljIHBhdXNlZCgpOiBhbnkge1xuXHRcdHJldHVybiAhIXRoaXMudGltZW91dElkO1xuXHR9XG5cblx0cHJpdmF0ZSBfcHJvY2Vzc1F1ZXVlKHJldHJ5QWZ0ZXI/KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkgeyAvLyBpZiBpdGVtcyBsZWZ0IHRvIHByb2Nlc3Ncblx0XHRcdGlmICh0aGlzLmxpbWl0Q291bnQgPCBNYXRoLm1heCh0aGlzLm9wdGlvbnMubGltaXQgLSBERUZBVUxUX0xJTUlUX0NPVU5UX0JVRkZFUiwgMSkpIHsgLy8gaWYgbm90IG92ZXIgbGltaXRcblx0XHRcdFx0dGhpcy5saW1pdENvdW50Kys7XG5cdFx0XHRcdHRoaXMuX2V4ZWN1dGUodGhpcy5kZXF1ZXVlKCkpO1xuXHRcdFx0XHR0aGlzLl9wcm9jZXNzUXVldWUoKTtcblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMucGF1c2VkKCkpIHsgLy8gc2NoZWR1bGVcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uUmF0ZUxpbWl0UGF1c2UoKTtcblx0XHRcdFx0dGhpcy5fc2NoZWR1bGUocmV0cnlBZnRlcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfc2NoZWR1bGUocmV0cnlBZnRlcj8pOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMudGltZW91dElkKSB7XG5cdFx0XHRjb25zdCBkZWxheSA9IE1hdGgubWF4KHJldHJ5QWZ0ZXIgfHwgKHRoaXMuZXhwaXJlcyAtIERhdGUubm93KCkpLCAwKTtcblx0XHRcdHRoaXMudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX3Jlc2V0VGltZW91dCgpO1xuXHRcdFx0XHR0aGlzLmxpbWl0Q291bnQgPSAwO1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMub25SYXRlTGltaXRSZXN1bWUoKTtcblx0XHRcdFx0dGhpcy5fcHJvY2Vzc1F1ZXVlKCk7XG5cdFx0XHR9LCBkZWxheSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfcmVzZXRUaW1lb3V0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnRpbWVvdXRJZCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcblx0XHRcdHRoaXMudGltZW91dElkID0gbnVsbDtcblx0XHR9XG5cdFx0dGhpcy5leHBpcmVzID0gRGF0ZS5ub3coKSArICgodGhpcy5vcHRpb25zLmxpbWl0U2Vjb25kcyArIERFRkFVTFRfTElNSVRfU0VDT05EU19CVUZGRVIpICogT05FX1NFQ09ORCk7XG5cdH1cblxuXHRwcml2YXRlIF9leGVjdXRlKHJlcUluZm8pOiAoKSA9PiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMucmVxdWVzdChyZXFJbmZvLm9wdHMpLnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0dGhpcy5fY2hlY2tIZWFkZXJzKHJlcyk7XG5cdFx0XHRyZXR1cm4gcmVxSW5mby5yZXNvbHZlKHJlcyk7XG5cdFx0fSkuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0aWYgKGVyciBpbnN0YW5jZW9mIGVycm9ycy5SYXRlTGltaXRFeGNlZWRlZEVycm9yKSB7XG5cdFx0XHRcdHRoaXMub3B0aW9ucy5vblJhdGVMaW1pdEV4Y2VlZGVkKGVycik7XG5cdFx0XHRcdGlmIChfLmlzTmlsKGVyci5yZXRyeUFmdGVyKSkge1xuXHRcdFx0XHRcdC8vIEFib3J0IHJldHJ5IGR1ZSB0byBtaXNzaW5nIHJldHJ5QWZ0ZXJcblx0XHRcdFx0XHRyZXR1cm4gcmVxSW5mby5yZWplY3QoZXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByZXRyeUFmdGVyID0gZXJyLnJldHJ5QWZ0ZXIgPyAoZXJyLnJldHJ5QWZ0ZXIgKiBPTkVfU0VDT05EKSArIFJFVFJZX0FGVEVSX0JVRkZFUl9USU1FIDogREVGQVVMVF9SQVRFX0xJTUlUX1RJTUVPVVQ7XG5cdFx0XHRcdHRoaXMubGltaXRDb3VudCA9IEluZmluaXR5O1xuXHRcdFx0XHR0aGlzLnF1ZXVlLnB1c2gocmVxSW5mbyk7XG5cdFx0XHRcdHRoaXMuX3Byb2Nlc3NRdWV1ZShyZXRyeUFmdGVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiByZXFJbmZvLnJlamVjdChlcnIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfY2hlY2tIZWFkZXJzKHJlcyk6IHZvaWQge1xuXHRcdGlmIChyZXMuaGVhZGVyc1t0aGlzLm9wdGlvbnMubGltaXRIZWFkZXJdKSB7XG5cdFx0XHRjb25zdCBsaW1pdCA9IHBhcnNlSW50KHJlcy5oZWFkZXJzW3RoaXMub3B0aW9ucy5saW1pdEhlYWRlcl0sIDEwKSB8fCBERUZBVUxUX0xJTUlUO1xuXHRcdFx0aWYgKGxpbWl0ICE9PSB0aGlzLm9wdGlvbnMubGltaXQpIHtcblx0XHRcdFx0dGhpcy5vcHRpb25zLmxpbWl0ID0gbGltaXQ7XG5cdFx0XHRcdHRoaXMuX3Jlc2V0VGltZW91dCgpO1xuXHRcdFx0XHR0aGlzLl9wcm9jZXNzUXVldWUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiJdfQ==

@@ -1,43 +0,28 @@

'use strict';
var _noop2 = require('lodash/noop');
var _noop3 = _interopRequireDefault(_noop2);
var _once2 = require('lodash/once');
var _once3 = _interopRequireDefault(_once2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint no-console: 0 */
var warnings = {
experimental: {},
deprecated: {}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const warnings = {
experimental: {},
deprecated: {},
};
function experimentalMethod(methodName, className) {
if (!warnings.experimental[methodName + className]) {
warnings.experimental[methodName + className] = (0, _once3.default)(function warnOnce() {
var log = (console.warn || console.log || _noop3.default).bind(console);
log('Method ' + className + '.' + methodName + ' is experimental, use with caution.');
});
}
warnings.experimental[methodName + className]();
}
function deprecatedMethod(methodName, className, useName) {
if (!warnings.deprecated[methodName + className + useName]) {
warnings.deprecated[methodName + className + useName] = (0, _once3.default)(function warnOnce() {
var log = (console.warn || console.log || _noop3.default).bind(console);
log('Method ' + className + '.' + methodName + ' is deprecated, use `' + className + '.' + useName + '` instead');
});
}
warnings.deprecated[methodName + className + useName]();
}
module.exports = {
deprecated: { method: deprecatedMethod },
experimental: { method: experimentalMethod }
};
exports.experimentalMethod = (methodName, className) => {
if (!warnings.experimental[methodName + className]) {
warnings.experimental[methodName + className] = _.once(function warnOnce() {
// tslint:disable-next-line:no-console
const log = (console.warn || console.log || _.noop).bind(console);
log(`Method ${className}.${methodName} is experimental, use with caution.`);
});
}
warnings.experimental[methodName + className]();
};
exports.deprecatedMethod = (methodName, className, useName) => {
if (!warnings.deprecated[methodName + className + useName]) {
warnings.deprecated[methodName + className + useName] = _.once(function warnOnce() {
// tslint:disable-next-line:no-console
const log = (console.warn || console.log || _.noop).bind(console);
log(`Method ${className}.${methodName} is deprecated, use ${className}.${useName} instead.`);
});
}
warnings.deprecated[methodName + className + useName]();
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUE0QjtBQUU1QixNQUFNLFFBQVEsR0FBRztJQUNoQixZQUFZLEVBQUUsRUFBRTtJQUNoQixVQUFVLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFFVyxRQUFBLGtCQUFrQixHQUFHLENBQUMsVUFBa0IsRUFBRSxTQUFpQixFQUFRLEVBQUU7SUFDakYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxFQUFFO1FBQ25ELFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxRQUFRO1lBQ3ZFLHNDQUFzQztZQUN0QyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxVQUFVLFNBQVMsSUFBSSxVQUFVLHFDQUFxQyxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7S0FDSDtJQUNELFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7QUFDakQsQ0FBQyxDQUFDO0FBRVcsUUFBQSxnQkFBZ0IsR0FBRyxDQUFDLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxPQUFlLEVBQVEsRUFBRTtJQUNoRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxFQUFFO1FBQzNELFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsUUFBUTtZQUMvRSxzQ0FBc0M7WUFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRSxHQUFHLENBQUMsVUFBVSxTQUFTLElBQUksVUFBVSx1QkFBdUIsU0FBUyxJQUFJLE9BQVEsV0FBVyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDLENBQUM7S0FDSDtJQUNELFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3pELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3Qgd2FybmluZ3MgPSB7XG5cdGV4cGVyaW1lbnRhbDoge30sXG5cdGRlcHJlY2F0ZWQ6IHt9LFxufTtcblxuZXhwb3J0IGNvbnN0IGV4cGVyaW1lbnRhbE1ldGhvZCA9IChtZXRob2ROYW1lOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCA9PiB7XG5cdGlmICghd2FybmluZ3MuZXhwZXJpbWVudGFsW21ldGhvZE5hbWUgKyBjbGFzc05hbWVdKSB7XG5cdFx0d2FybmluZ3MuZXhwZXJpbWVudGFsW21ldGhvZE5hbWUgKyBjbGFzc05hbWVdID0gXy5vbmNlKGZ1bmN0aW9uIHdhcm5PbmNlKCkge1xuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcblx0XHRcdGNvbnN0IGxvZyA9IChjb25zb2xlLndhcm4gfHwgY29uc29sZS5sb2cgfHwgXy5ub29wKS5iaW5kKGNvbnNvbGUpO1xuXHRcdFx0bG9nKGBNZXRob2QgJHtjbGFzc05hbWV9LiR7bWV0aG9kTmFtZX0gaXMgZXhwZXJpbWVudGFsLCB1c2Ugd2l0aCBjYXV0aW9uLmApO1xuXHRcdH0pO1xuXHR9XG5cdHdhcm5pbmdzLmV4cGVyaW1lbnRhbFttZXRob2ROYW1lICsgY2xhc3NOYW1lXSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlcHJlY2F0ZWRNZXRob2QgPSAobWV0aG9kTmFtZTogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZywgdXNlTmFtZTogc3RyaW5nKTogdm9pZCA9PiB7XG5cdGlmICghd2FybmluZ3MuZGVwcmVjYXRlZFttZXRob2ROYW1lICsgY2xhc3NOYW1lICsgdXNlTmFtZV0pIHtcblx0XHR3YXJuaW5ncy5kZXByZWNhdGVkW21ldGhvZE5hbWUgKyBjbGFzc05hbWUgKyB1c2VOYW1lXSA9IF8ub25jZShmdW5jdGlvbiB3YXJuT25jZSgpIHtcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG5cdFx0XHRjb25zdCBsb2cgPSAoY29uc29sZS53YXJuIHx8IGNvbnNvbGUubG9nIHx8IF8ubm9vcCkuYmluZChjb25zb2xlKTtcblx0XHRcdGxvZyhgTWV0aG9kICR7Y2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9IGlzIGRlcHJlY2F0ZWQsIHVzZSAke2NsYXNzTmFtZX0uJHt1c2VOYW1lIH0gaW5zdGVhZC5gKTtcblx0XHR9KTtcblx0fVxuXHR3YXJuaW5ncy5kZXByZWNhdGVkW21ldGhvZE5hbWUgKyBjbGFzc05hbWUgKyB1c2VOYW1lXSgpO1xufTtcbiJdfQ==
{
"name": "anx-api",
"version": "6.1.0",
"version": "7.0.0-1",
"description": "AppNexus Api Wrapper",
"homepage": "https://github.com/appnexus/anx-api",
"bugs": "https://github.com/appnexus/anx-api/issues",
"main": "index.js",
"main": "lib/index.js",
"repository": {

@@ -13,7 +13,8 @@ "type": "git",

"scripts": {
"build": "babel src -d lib",
"build": "npm run clean && tsc",
"clean": "rm -rf coverage && rm -rf lib && mkdir lib",
"cover": "jest src --coverage",
"dependency-check": "npm audit",
"lint": "eslint src --quiet",
"lint-fix": "eslint src --fix",
"lint": "tslint --project tsconfig.json -c tslint.json 'src/**/*.ts'",
"lint-fix": "tslint --project tsconfig.json -c tslint.json 'src/**/*.ts' --fix",
"preversion": "npm run build",

@@ -46,20 +47,40 @@ "test": "jest src",

"devDependencies": {
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
"babel-jest": "^23.4.2",
"babel-plugin-lodash": "^3.3.4",
"babel-preset-env": "^1.7.0",
"@types/axios": "^0.14.0",
"@types/jest": "^23.3.1",
"@types/lodash": "^4.14.115",
"@types/node": "^10.5.5",
"@types/qs": "^6.5.1",
"@types/url-join": "^0.8.2",
"coveralls": "^3.0.2",
"eslint": "^5.2.0",
"eslint-config-appnexus": "^1.6.0",
"eslint-plugin-import": "^2.13.0",
"eslint-plugin-lodash": "^2.7.0",
"eslint-plugin-promise": "^3.8.0",
"jest": "^23.4.2",
"nock": "^9.4.4",
"pre-push": "^0.1.1"
"pre-push": "^0.1.1",
"ts-jest": "^23.0.1",
"tslint": "^5.11.0",
"typescript": "^3.0.1"
},
"jest": {
"testEnvironment": "node"
"testEnvironment": "node",
"coverageDirectory": "../coverage/",
"collectCoverageFrom": [
"**/*.js",
"**/*.ts",
"!constants/**",
"!generated/**",
"!*.*"
],
"coverageReporters": [
"html"
],
"rootDir": "src",
"moduleFileExtensions": [
"ts",
"js",
"json"
],
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(ts|js)$",
"transform": {
"^.+\\.ts$": "ts-jest"
}
}
}

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc