@trimble-oss/trimble-id
Version:
Trimble Identity SDK for JavaScript/ TypeScript
417 lines (396 loc) • 17.8 kB
JavaScript
;
// implements IHttpClient
(function (root, factory) {
/* istanbul ignore next */
if (typeof define === 'function' && define.amd) {
// AMD
define(['axios'], (axios) => {
return factory({
axios: axios,
});
});
} else if (typeof exports === 'object') {
// CommonJS
module.exports = factory({
axios: require('axios').default,
});
} else {
// Browser globals (Note: root is window)
root.HttpClient = factory(root);
}
}(this, function (imports) {
/**
* Represents an HTTP client.
* @param baseAddress The base address of the HTTP client.
* @param defaultSettings The default settings for the HTTP client.
*/
var _httpClient = function (baseAddress = null, defaultSettings = {}) {
this._baseAddress = baseAddress;
this._defaultSettings = defaultSettings;
}
var _calculateAddress = function (baseAddress, relativeAddress) {
if (!baseAddress) return relativeAddress;
if (!relativeAddress) return baseAddress;
if (relativeAddress.includes('://')) return relativeAddress; // relativeAddress is an absolute address
if (relativeAddress.startsWith('/')) {
// todo
}
return baseAddress + (baseAddress.endsWith('/') ? '' : '/') + relativeAddress;
}
var _isObject = function (item) {
return (item && typeof item === 'object' && !Array.isArray(item));
}
/* istanbul ignore next */
var _mergeDeep = function (target, ...sources) {
if (!sources.length) return target;
const source = sources.shift();
if (_isObject(target) && _isObject(source)) {
for (const key in source) {
if (_isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
_mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return _mergeDeep(target, ...sources);
}
var _combineSettings = function (defaultSettings, requestSettings) {
return _mergeDeep(requestSettings, defaultSettings);
}
/**
* Sends an HTTP POST request to the specified relative address.
*
* @param {string} relativeAddress - The relative address to send the request to.
* @param {any} value - The data to send with the request (optional).
* @param {object} requestSettings - The additional settings for the request (optional).
* @returns {Promise<any>} A promise that resolves with the response data if the request is successful, or rejects with an error message if the request fails.
*/
_httpClient.prototype.httpPost = function (relativeAddress, value = null, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, requestSettings);
settings.responseType = 'text';
settings.transformRequest = [];
settings.transformResponse = [];
imports.axios.post(address, value, settings)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
/**
* Performs an HTTP GET request.
*
* @param {string} relativeAddress - The relative address of the resource.
* @param {object} requestSettings - The settings for the request.
* @returns {Promise<any>} - A promise that resolves with the response data.
*/
_httpClient.prototype.httpGet = function (relativeAddress, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, requestSettings);
settings.responseType = 'text';
settings.transformResponse = [];
imports.axios.get(address, settings)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
/**
* Sends an HTTP PUT request to the specified relative address.
*
* @param {string} relativeAddress - The relative address to send the request to.
* @param {any} value - The data to send in the request body.
* @param {object} requestSettings - Additional settings for the request.
* @returns {Promise<any>} A promise that resolves with the response data if the request is successful, or rejects with an error message if the request fails.
*/
_httpClient.prototype.httpPut = function (relativeAddress, value = null, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, requestSettings);
settings.responseType = 'text';
settings.transformRequest = [];
settings.transformResponse = [];
imports.axios.put(address, value, settings)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
/**
* Sends an HTTP PUT request and returns the full response.
* @param {string} relativeAddress - The relative address of the API endpoint.
* @param {any} value - The data to be sent in the request body.
* @param {object} requestSettings - Additional settings for the request.
* @returns {Promise<any>} A promise that resolves with the full response or rejects with an error.
*/
_httpClient.prototype.httpPut_FullResponse = function (relativeAddress, value = null, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, requestSettings);
settings.responseType = 'text';
settings.transformRequest = [];
settings.transformResponse = [];
imports.axios.put(address, value, settings)
.then((response) => {
resolve(response)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
/**
* Sends an HTTP PATCH request to the specified relative address.
*
* @param {string} relativeAddress - The relative address to send the request to.
* @param {any} value - The value to be sent in the request body.
* @param {object} requestSettings - Additional settings for the request.
* @returns {Promise<any>} A promise that resolves with the response data if the request is successful, or rejects with an error message if the request fails.
*/
_httpClient.prototype.httpPatch = function (relativeAddress, value = null, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, requestSettings);
settings.responseType = 'text';
settings.transformRequest = [];
settings.transformResponse = [];
imports.axios.patch(address, value, settings)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
/**
* Sends an HTTP DELETE request to the specified relative address.
*
* @param {string} relativeAddress - The relative address to send the DELETE request to.
* @param {any} content - The content to include in the request body.
* @param {object} requestSettings - The additional settings for the request.
* @returns {Promise<any>} A promise that resolves with the response data if the request is successful, or rejects with an error message if the request fails.
*/
_httpClient.prototype.httpDelete = function (relativeAddress, content = null, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, requestSettings);
settings.responseType = 'text';
settings.transformRequest = [];
settings.transformResponse = [];
settings.data = content;
imports.axios.delete(address, settings)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
/**
* Sends an HTTP POST request with JSON data.
* @param {string} relativeUrl - The relative URL to send the request to.
* @param {any} value - The JSON data to send in the request body.
* @param {object} requestSettings - Additional settings for the request (optional).
* @returns {Promise<any>} A promise that resolves with the response JSON or rejects with an error.
*/
_httpClient.prototype.httpPostJSON = function (relativeUrl, value, requestSettings = {}) {
var self = this;
return new Promise((resolve, reject) => {
var settings = _combineSettings(requestSettings,
{
headers: {
"Content-Type": 'application/json',
Accept: 'application/json',
}
});
self.httpPost(relativeUrl, JSON.stringify(value), settings)
.then((json) => {
resolve(json ? JSON.parse(json) : undefined);
})
.catch((err) => { reject(err); });
});
}
/**
* Sends an HTTP GET request and returns the response as JSON.
* @param {string} relativeUrl - The relative URL to send the GET request to.
* @param {object} requestSettings - Additional settings for the request (optional).
* @returns {Promise<any>} - A promise that resolves with the JSON response.
*/
_httpClient.prototype.httpGetJSON = function (relativeUrl, requestSettings = {}) {
var self = this;
return new Promise((resolve, reject) => {
var settings = _combineSettings(requestSettings,
{ headers:
{
accept: 'application/json',
}
});
self.httpGet(relativeUrl, settings)
.then((json) => {
resolve(json ? JSON.parse(json) : undefined);
})
.catch((err) => { reject(err); });
});
}
/**
* Sends an HTTP PUT request with JSON data.
* @param {string} relativeUrl - The relative URL to send the request to.
* @param {any} value - The JSON data to send in the request body.
* @param {object} requestSettings - Additional settings for the request (optional).
* @returns {Promise<any>} - A promise that resolves with the response data.
*/
_httpClient.prototype.httpPutJSON = function (relativeUrl, value, requestSettings = {}) {
var self = this;
return new Promise((resolve, reject) => {
var settings = _combineSettings(requestSettings,
{
headers: {
"Content-Type": 'application/json',
Accept: 'application/json',
}
});
self.httpPut(relativeUrl, JSON.stringify(value), settings)
.then((json) => {
resolve(json ? JSON.parse(json) : undefined);
})
.catch((err) => { reject(err); });
});
}
/**
* Sends an HTTP PATCH request with JSON payload.
* @param {string} relativeUrl - The relative URL to send the request to.
* @param {any} value - The JSON payload to send with the request.
* @param {object} requestSettings - Additional settings for the request (optional).
* @returns {Promise<any>} A promise that resolves with the parsed JSON response, or undefined if the response is empty.
*/
_httpClient.prototype.httpPatchJSON = function (relativeUrl, value, requestSettings = {}) {
var self = this;
return new Promise((resolve, reject) => {
var settings = _combineSettings(requestSettings,
{
headers: {
"Content-Type": 'application/json',
Accept: 'application/json',
}
});
self.httpPatch(relativeUrl, JSON.stringify(value), settings)
.then((json) => {
resolve(json ? JSON.parse(json) : undefined);
})
.catch((err) => { reject(err); });
});
}
/**
* Sends an HTTP DELETE request and returns the response as JSON.
* @param {string} relativeUrl - The relative URL for the request.
* @param {any} content - The content to send with the request (optional).
* @param {object} requestSettings - Additional settings for the request (optional).
* @returns {Promise<any>} A promise that resolves with the parsed JSON response, or undefined if the response is empty.
*/
_httpClient.prototype.httpDeleteJSON = function (relativeUrl, content = null, requestSettings = {}) {
var self = this;
return new Promise((resolve, reject) => {
var settings = _combineSettings(requestSettings,
{
headers: {
"Content-Type": 'application/json',
Accept: 'application/json',
}
});
self.httpDelete(relativeUrl, content, settings)
.then((json) => {
resolve(json ? JSON.parse(json) : undefined);
})
.catch((err) => { reject(err); });
});
}
_httpClient.prototype.httpPostJSONFullResponse = function (relativeAddress, value, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
const settings = _combineSettings(self._defaultSettings, {
...requestSettings,
headers: {
"Content-Type": 'application/json',
Accept: 'application/json',
},
responseType: 'text',
transformRequest: [],
transformResponse: [],
});
imports.axios.post(address, JSON.stringify(value), settings)
.then((response) => {
resolve(response)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
_httpClient.prototype.httpDeleteJSONFullResponse = function (relativeAddress, content = null, requestSettings = {}) {
var self = this;
return new Promise(function (resolve, reject) {
var address = _calculateAddress(self._baseAddress, relativeAddress);
var settings = _combineSettings(self._defaultSettings, {...requestSettings,
responseType: 'text',
transformRequest: [],
transformResponse: [],
data: content
});
imports.axios.delete(address, settings)
.then((response) => {
resolve(response)
})
.catch((error) => {
if (error.response)
reject('Returned: ' + error.response.status + ' ' + error.response.data);
else
reject(error.message);
});
});
}
// Exposed public methods
return _httpClient;
}));