@zaptyp/spotify-web-api-node
Version:
A Node.js wrapper for Spotify's Web API
196 lines (159 loc) • 4.9 kB
JavaScript
var {
TimeoutError,
WebapiError,
WebapiRegularError,
WebapiAuthenticationError,
WebapiPlayerError,
WebapiRatelimitError
} = require('./response-error');
var HttpManager = {};
/* Create superagent options from the base request */
var _getParametersFromRequest = function (request) {
var options = {};
if (request.getQueryParameters()) {
options.query = new URLSearchParams(
request.getQueryParameters()
).toString();
}
if (
request.getHeaders() &&
request.getHeaders()['Content-Type'] === 'application/json'
) {
options.data = JSON.stringify(request.getBodyParameters());
} else if (request.getBodyParameters()) {
options.data = request.getBodyParameters();
}
if (request.getHeaders()) {
options.headers = request.getHeaders();
}
if (request.getTimeout()) {
options.timeout = request.getTimeout();
}
return options;
};
/**
* @param {Response} response
*/
var _toError = async function (response) {
let body
let response2
try {
response2 = response.clone();
body = await response.json();
} catch (e) {
body = await response2.text();
}
if (
typeof body === 'object' &&
typeof body.error === 'object' &&
typeof body.error.reason === 'string'
) {
return new WebapiPlayerError(body, response.headers, response.status);
}
if (typeof body === 'object' && typeof body.error === 'object') {
return new WebapiRegularError(body, response.headers, response.status);
}
if (typeof body === 'object' && typeof body.error === 'string') {
return new WebapiAuthenticationError(
body,
response.headers,
response.status
);
}
if (response.status === 429) {
return new WebapiRatelimitError(body, response.headers, response.status);
}
/* Other type of error, or unhandled Web API error format */
return new WebapiError(body, response.headers, response.status, body);
};
/* Make the request to the Web API */
HttpManager._makeRequest = function (method, options, uri, callback) {
if (typeof callback !== 'function') {
throw new TypeError('Expected callback to be a function');
}
const headers = new Headers(options.headers || {});
let serializationMethod = JSON.stringify;
if (headers.get('Content-Type') === 'application/x-www-form-urlencoded') {
serializationMethod = d => new URLSearchParams(d);
}
const controller = new AbortController();
let timeoutId;
if (options.timeout) {
timeoutId = setTimeout(() => {
controller.abort();
}, options.timeout);
}
let body = options.data;
if (body && typeof body !== 'string') {
body = serializationMethod(body);
}
const fullUri = uri + (options.query ? '?' + options.query : '');
fetch(fullUri, {
method,
headers,
body,
signal: controller.signal
})
.then(async resp => {
clearTimeout(timeoutId);
if (!resp.ok) {
return callback(await _toError(resp));
}
return callback(null, {
body: await resp.json().catch(() => null),
headers: resp.headers,
statusCode: resp.status
});
})
.catch(err => {
clearTimeout(timeoutId);
if (controller.signal.aborted) {
return callback(
new TimeoutError(`request took longer than ${options.timeout}ms`)
);
}
return callback(err);
});
};
/**
* Make a HTTP GET request.
* @param {BaseRequest} The request.
* @param {Function} The callback function.
*/
HttpManager.get = function (request, callback) {
var options = _getParametersFromRequest(request);
var method = 'GET';
HttpManager._makeRequest(method, options, request.getURI(), callback);
};
/**
* Make a HTTP POST request.
* @param {BaseRequest} The request.
* @param {Function} The callback function.
*/
HttpManager.post = function (request, callback) {
var options = _getParametersFromRequest(request);
var method = 'POST';
HttpManager._makeRequest(method, options, request.getURI(), callback);
};
/**
* Make a HTTP DELETE request.
* @param {BaseRequest} The request.
* @param {Function} The callback function.
*/
HttpManager.del = function (request, callback) {
var options = _getParametersFromRequest(request);
var method = 'DELETE';
HttpManager._makeRequest(method, options, request.getURI(), callback);
};
/**
* Make a HTTP PUT request.
* @param {BaseRequest} The request.
* @param {Function} The callback function.
*/
HttpManager.put = function (request, callback) {
var options = _getParametersFromRequest(request);
var method = 'PUT';
HttpManager._makeRequest(method, options, request.getURI(), callback);
};
module.exports = HttpManager;
;