UNPKG

@trimble-oss/trimble-id

Version:

Trimble Identity SDK for JavaScript/ TypeScript

417 lines (396 loc) 17.8 kB
'use strict'; // 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; }));