graphdb
Version:
Javascript client library supporting GraphDB and RDF4J REST API.
214 lines (202 loc) • 7.34 kB
JavaScript
;
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var axios = require('axios');
var _require = require('uuid'),
uuidv4 = _require.v4;
var qs = require('qs');
var ConsoleLogger = require('../logging/console-logger');
var REQUEST_ID_HEADER = 'x-request-id';
/**
* Promise based HTTP client that delegates requests to Axios.
*
* The purpose of the delegating is to have an abstraction layer on top of the
* used library.
*
* By default all requests are without a timeout, e.g. execution time is not
* limited. To change that use {@link #setDefaultReadTimeout} and
* {@link #setDefaultWriteTimeout} or provide one in each request's
* configuration object.
*
* @class
* @author Mihail Radkov
* @author Svilen Velikov
*/
var HttpClient = /*#__PURE__*/function () {
/**
* Instantiates new HTTP client with the supplied base URL and default
* request timeouts.
*
* @constructor
* @param {string} baseURL base URL that will be prepend to all requests
* GET
*/
function HttpClient(baseURL) {
_classCallCheck(this, HttpClient);
this.axios = axios.create({
baseURL: baseURL,
maxContentLength: Infinity,
maxBodyLength: Infinity,
paramsSerializer: HttpClient.paramsSerializer
});
this.readTimeout = 0;
this.writeTimeout = 0;
this.initLogger(baseURL);
}
/**
* Instantiates a logger for this http client instance.
*
* @private
* @param {string} baseURL the URL for this client that will be
* logged for each request
*/
return _createClass(HttpClient, [{
key: "initLogger",
value: function initLogger(baseURL) {
this.logger = new ConsoleLogger({
name: 'HttpClient',
baseURL: baseURL
});
}
/**
* Sets the provided header map as default for all requests.
*
* Any additional headers provided in the request configuration will
* be merged with this default map.
*
* @param {Map<string, string>} headers map with default headers
* @return {HttpClient} the current client for method chaining
*/
}, {
key: "setDefaultHeaders",
value: function setDefaultHeaders(headers) {
this.axios.defaults.headers = headers;
return this;
}
/**
* Sets the default request read timeout. It will be used in case requests
* don't explicitly specify it in their request configurations.
*
* @param {number} readTimeout the default read timeout
* @return {HttpClient} the current client for method chaining
*/
}, {
key: "setDefaultReadTimeout",
value: function setDefaultReadTimeout(readTimeout) {
this.readTimeout = readTimeout;
return this;
}
/**
* Sets the default request write timeout. It will be used in case requests
* don't explicitly specify it in their request configurations.
*
* @param {number} writeTimeout the default write timeout
* @return {HttpClient} the current client for method chaining
*/
}, {
key: "setDefaultWriteTimeout",
value: function setDefaultWriteTimeout(writeTimeout) {
this.writeTimeout = writeTimeout;
return this;
}
/**
* Performs HTTP request using the supplied request builder.
*
* @param {HttpRequestBuilder} requestBuilder
* @return {Promise<any>} a promise resolving to the request's response
*/
}, {
key: "request",
value: function request(requestBuilder) {
var config = this.getRequestConfig(requestBuilder);
this.logger.trace({
config: config
}, 'Executing request');
return this.axios.request(config);
}
/**
* Returns request configuration suitable for from the provided request
* builder.
*
* It generates correlation identifier under the <code>x-request-id</code>
* header and sets default timeout if it was not provided in the builder.
*
* @private
* @param {HttpRequestBuilder} requestBuilder request builder
* configuration builder used to produce the request configuration
* request config builder
* @return {Object<string, string>}
*/
}, {
key: "getRequestConfig",
value: function getRequestConfig(requestBuilder) {
this.addXRequestIdHeader(requestBuilder);
this.addDefaultTimeout(requestBuilder);
return requestBuilder.get();
}
/**
* Sets the required x-request-id header.
*
* @private
* @param {HttpRequestBuilder} requestBuilder
*/
}, {
key: "addXRequestIdHeader",
value: function addXRequestIdHeader(requestBuilder) {
requestBuilder.addHeader(REQUEST_ID_HEADER, uuidv4());
}
/**
* Adds a default timeout if it is not explicitly specified in the
* request builder.
*
* @private
* @param {HttpRequestBuilder} requestBuilder request object supplied to
* the http client for specific request
*/
}, {
key: "addDefaultTimeout",
value: function addDefaultTimeout(requestBuilder) {
if (!requestBuilder.getTimeout()) {
if (requestBuilder.getMethod() === 'get') {
requestBuilder.setTimeout(this.readTimeout);
} else {
requestBuilder.setTimeout(this.writeTimeout);
}
}
}
/**
* Returns the base URL which this http client uses to send requests.
*
* @return {string} the base URL for each request
*/
}, {
key: "getBaseURL",
value: function getBaseURL() {
return this.axios.defaults.baseURL;
}
/**
* Serializes the provided parameters in a way that can be properly read by
* the RDF4J server.
*
* It ignores any null or undefined parameters and repeats array parameters.
*
* @private
* @static
* @param {object} params the parameters for serialization
* @return {string} the serialized parameters
*/
}], [{
key: "paramsSerializer",
value: function paramsSerializer(params) {
return qs.stringify(params, {
arrayFormat: 'repeat',
skipNulls: true
});
}
}]);
}();
module.exports = HttpClient;